Swift 情节提要UIView对象未实例化

Swift 情节提要UIView对象未实例化,swift,storyboard,instantiation,Swift,Storyboard,Instantiation,我正在做一个有Swift和故事板的项目。这是一个传统IB和Objective-C项目的转换项目。加载视图时,UITableView实例化有问题。让我解释一下 该项目是一个导航项目。下面是故事板的概述 故事板的第一个viewController是HomeViewController,是显示常规信息的登录页。下一个VC叫做FeedViewController,它显示了许多RSS提要。您可以在下图中看到NavigationController、HomeViewController和FeedViewC

我正在做一个有Swift和故事板的项目。这是一个传统IB和Objective-C项目的转换项目。加载视图时,UITableView实例化有问题。让我解释一下

该项目是一个导航项目。下面是故事板的概述

故事板的第一个viewController是HomeViewController,是显示常规信息的登录页。下一个VC叫做FeedViewController,它显示了许多RSS提要。您可以在下图中看到NavigationController、HomeViewController和FeedViewController的扩展屏幕截图

    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!

我的问题是我无法让tableView实例化。我首先检查以确保我的tableView已作为出口连接,并且数据源和委托属性已连接。你可以在下面的图片中看到这一点

在我的FeedViewController类中,我有一个名为feedsTableView的Outler属性。您可以在下面的代码中看到声明

    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?
调用HomeViewController的viewDidLoad()方法时,我启动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()

我还有一个故障保险机制,如果有人在调用setUpDataHandler()方法之前转到FeedViewController,那么我也会在这里实例化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没有得到实例化。在FeedViewController的viewDidLoad()方法中,我尝试将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

下面的图片显示了这被称为。它是FeedViewController的viewDidLoad()。正如您在图片中看到的,在将feedsTableView添加到UIRefreshController之前,我甚至尝试实例化它,但仍然出现了错误

任何帮助都将不胜感激

保重,


Jon

在最后一种情况下,手动实例化UITableView并将其分配给
self.feedsTableView
,它不起作用的原因是
self.feedsTableView
被声明为
。因此,表视图开始存在,被分配,然后消失在烟雾中,因为它没有内存管理。当您到达最后一行时,
self.feedsTableView
再次变为
nil

因此,最后一种情况的解决方案是从
feedsTableView
声明中删除
weak
指定


这将使你在最后一次事故中度过难关。当然,你不会看到任何东西,因为你没有将表视图插入到你的界面中。

我无法解释基本情况,因为我不理解你在故事板中的视图控制器结构:对我来说太奇怪了。不幸的是,这不起作用。我删除了弱声明,它没有纠正这个问题。谢谢你的意见,我说解决不了。我只是在说最后一次绝望的尝试,你手动实例化。