Объекты раскадровки UIView не создаются

Я работаю над проектом со Swift и Storyboards. Это проект преобразования традиционного проекта IB и Objective-C. У меня возникла проблема с созданием экземпляра UITableView при загрузке представления. Позволь мне объяснить.

Проект является навигационным проектом. Вот обзор раскадровки.

введите здесь описание изображения

Первым viewController раскадровки является HomeViewController и представляет собой целевую страницу, которая отображает общую информацию. Следующий виртуальный канал называется FeedViewController и показывает несколько RSS-каналов. Вы можете увидеть расширенный снимок экрана NavigationController, HomeViewController и FeedViewController на рисунке ниже.

введите здесь описание изображения

Моя проблема в том, что я не могу заставить tableView создавать экземпляры. Сначала я проверил, чтобы убедиться, что мой tableView подключен как выход и что свойства dataSource и делегата подключены. Вы можете увидеть это на картинке ниже.

введите здесь описание изображения

В моем классе FeedViewController есть свойство Outler с именем feedsTableView. Вы можете увидеть объявление в коде ниже.

    class FeedViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, FLODataHandlerDelegate
{
    // View Contoller and Protocol Properties
    var floView : FLOViewController?
    var dataHandler : FLODataHandler?

    // Interface and Content Properties
    var refreshControl : UIRefreshControl?

    // IBOutlets
    @IBOutlet weak var feedsTableView: UITableView!
    @IBOutlet weak var backgroundImage: UIImageView!

В HomeViewController у меня есть свойство FeedViewController, которое я намерен использовать для получения доступа к FeedViewController feedsTableView.

    class HomeViewController: UIViewController, FLODataHandlerDelegate, MFMailComposeViewControllerDelegate
{
    // View Contoller and Protocol Properties
    var feedViewController : FeedViewController?
    var dataHandler : FLODataHandler?

Когда вызывается метод viewDidLoad() HomeViewController, я запускаю dataHandler, который создает экземпляр FeedViewController, и устанавливаю его в мое свойство FeedViewController.

override func viewDidLoad()
{
    super.viewDidLoad()

    // Set up the gesture recognizer to allow for swiping to the feed VC.
    let recognizer = UISwipeGestureRecognizer(target: self, action: Selector("goToNext"))
    recognizer.direction = UISwipeGestureRecognizerDirection.Left
    self.view.addGestureRecognizer(recognizer)

    // Start the data handler
    self.setUpDataHandler()
}

setUpDataHandler()

func setUpDataHandler()
    {
        // Intitalize FeedVC for use later in the VC
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewControllerWithIdentifier("FeedViewController") as! FeedViewController
        self.feedViewController = vc
    }

У меня также есть отказоустойчивость: если кто-то перейдет к FeedViewController до вызова метода setUpDataHandler(), я также создам экземпляр FeedViewController здесь.

func goToNext()
{
    // Grab the feedViewController so it can be pushed onto the stack.  Make sure you set up the storyboard identifier.
    let feedVC = self.storyboard!.instantiateViewControllerWithIdentifier("FeedViewController") as! FeedViewController
    self.feedViewController = feedVC
    self.navigationController!.pushViewController(self.feedViewController!, animated: true)
}

Однако экземпляр feedsTableView не создается. В методе viewDidLoad() FeedViewController я пытаюсь добавить feedsTableView в UIRefreshController.

override func viewDidLoad()
{
    super.viewDidLoad()

    self.refreshControl = UIRefreshControl()
    self.refreshControl!.addTarget(self, action: "refreshInvoked:state:", forControlEvents: UIControlEvents.ValueChanged)
    // See the note in viewDidLoad in FLOViewController.
    self.feedsTableView.addSubview(self.refreshControl!)
}

Когда приложение запускается, я получаю следующую ошибку.

фатальная ошибка: неожиданно найдено nil при развертывании необязательного значения

На изображении ниже показано, как это называется. Это viewDidLoad() FeedViewController. Как вы можете видеть на картинке, я даже пытался создать экземпляр feedsTableView перед добавлением его в UIRefreshController, и я все еще получаю сообщение об ошибке.

введите здесь описание изображения

Любая помощь будет принята с благодарностью.

Заботиться,

Джон


person jonthornham    schedule 07.06.2015    source источник


Ответы (1)


Причина, по которой это не работает в самом последнем случае, когда вы вручную создаете экземпляр UITableView и назначаете его self.feedsTableView, заключается в том, что self.feedsTableView объявляется weak. Таким образом, табличное представление возникает, назначается и исчезает в клубе дыма, потому что оно не имеет управления памятью. К тому времени, когда вы дойдете до последней строки, self.feedsTableView снова станет nil.

Таким образом, решение для этого последнего случая состоит в том, чтобы удалить обозначение weak из вашего объявления feedsTableView.

Это поможет вам преодолеть аварию в последнем случае. Но, конечно, вы ничего не увидите, потому что вы также не вставляете табличное представление в свой интерфейс.

person matt    schedule 07.06.2015
comment
Однако я не могу объяснить базовый случай, потому что я не понимаю структуру вашего контроллера представления в раскадровке: слишком странно для моей крови. - person matt; 07.06.2015
comment
К сожалению, это не сработало. Я удалил слабое объявление, и это не решило проблему. Спасибо за ваш вклад. - person jonthornham; 08.06.2015
comment
Я сказал, что это не решит эту проблему. Я говорил только о последней отчаянной попытке создать экземпляр вручную. - person matt; 08.06.2015