在同一个Storyboard中分离UIViewController

时间:2016-02-27 12:16:40

标签: swift uiview uiviewcontroller

问题

我有一个带有单个视图控制器的单页应用程序。在屏幕上有一个按钮,可以在一个(较小的)UIView中滑出/使用TableView(功能正常)。我的目标是简化我的视图控制器,因此我的想法是将带有TableView的UIView分离到它自己的视图控制器中。因此,我在Storyboard中创建了第二个视图控制器,并创建了一个类HintsViewTableViewController,它包含TableView数据源和委托方法。

主视图控制器

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate  {

    var HintsViewTableVC = HintsViewTableViewController()

HintsViewTableViewController

class HintsViewTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate  {

    @IBOutlet weak var HintsViewTableView: UITableView!

    @IBOutlet var hintsLabel: UILabel!

     override func viewDidLoad() {
       hintsLabel.text = "HINT"  <---fatal error: unexpectedly found nil while                                      unwrapping an Optional value
    }

// MARK: - Table view data source

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return 4
    }

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return CGFloat (40)
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    // Configure the cell...

    cell.textLabel!.text = "\(indexPath.row)"

    return cell 
    }
}

问题 如果故事板入口点是主视图控制器,编译器会给出一个错误,指出我的属性hintsLabel!是零和崩溃。

如果我将故事板入口点直接移动到HintsViewTableViewController,则应用程序会运行并在屏幕上显示正确的视图。

问题 显然,直接初始化视图控制器的过程(使用storyboard入口点)与将视图控制器分配给变量(与第一种情况中的做法)不同。我已经在初始方法中搜索了高低,但是空白了。

我尝试过的另一个解决方案:创建一个单独的XIB文件并将其链接到我的HintsViewTableViewController,但XIB文件中的TableViews不能拥有原型单元格。

我在这里缺少什么,或者说不同:将UIView分成单独的视图控制器(在同一个故事板中)的正确程序是什么?

1 个答案:

答案 0 :(得分:0)

问题在于,当您像这样实例化HintsViewTableViewController时:

var HintsViewTableVC = HintsViewTableViewController()

您正在创建该类的实例,但该类对您的Storyboard一无所知,因此所有@IBOutlet都将为nil,因为它们没有连接到任何内容。

相反,您需要让故事板创建ViewController

self.storyboard?.instantiateViewControllerWithIdentifier("hintsController") as! HintsViewTableViewController

其中hintsController是您在 Identity Inspector 中为该ViewController设置的 Storyboard ID

注意:您需要在方法中调用故事板(例如viewDidLoad,其中self将引用您的ViewController类的实例。

如果你想像以前那样将它声明为属性,那么将它作为 lazy 属性将允许在首次访问时创建它(并且self将可用然后):

lazy var hintsViewTableVC: HintsViewTableViewController = { self.storyboard?.instantiateViewControllerWithIdentifier("hintsController") as! HintsViewTableViewController }()