Storyboard UIView обекти, които не се създават

Работя по проект със Swift и Storyboards. Това е проект за преобразуване от традиционен IB и Objective-C проект. Имам проблем с UITableView, създаващ екземпляр, когато изгледът е зареден. Нека обясня.

Проектът е навигационен проект. Ето преглед на Storyboard.

въведете описание на изображението тук

Първият viewController на Storyboard е HomeViewController и е целева страница, която показва обща информация. Следващият VC се нарича FeedViewController показва редица RSS канали. Можете да видите разширена екранна снимка на NavigationController, HomeViewController и FeedViewController на снимката по-долу.

въведете описание на изображението тук

Проблемът ми е, че не мога да накарам tableView да Instantiate. Първо проверих, за да се уверя, че моят 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, което възнамерявам да използвам, за да получа достъп до feedsTableView на FeedViewController.

    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!)
}

Когато приложението се стартира, получавам следната грешка.

фатална грешка: неочаквано намерена нула при разопаковане на незадължителна стойност

Изображението по-долу показва как се нарича това. Това е 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