【问题标题】:Separate UIViewController in same Storyboard在同一个 Storyboard 中分离 UIViewController
【发布时间】:2016-02-27 12:16:40
【问题描述】:

问题

我有一个带有单个视图控制器的单页应用程序。在屏幕上,有一个按钮可以滑出/滑入带有 TableView 的(较小的)UIView(功能正确)。我的目标是简化我的视图控制器,因此我的想法是将 UIView 与 TableView 拆分为它自己的视图控制器。因此,我在 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!为 nil 并崩溃。

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

问题 显然,直接初始化视图控制器的过程(使用情节提要入口点)不同于将视图控制器分配给变量(就像我在第一种情况下所做的那样)。我已经在各个方面搜索了 init 方法,但都是空白。

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

我在这里遗漏了什么,或者说不同:将 UIView 分离到单独的视图控制器(在同一个 Storyboard 中)的正确程序是什么?

【问题讨论】:

    标签: swift uiview uiviewcontroller


    【解决方案1】:

    问题是当你像这样实例化你的HintsViewTableViewController 时:

    var HintsViewTableVC = HintsViewTableViewController()
    

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

    相反,您需要让 Storyboard 创建 ViewController

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

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

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

    如果您想像以前一样将其声明为属性,将其设置为 lazy 属性将允许在首次访问时创建它(然后self 将可用):

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

    【讨论】:

    • 谢谢。我已经在我的代码中改变了这一点。我有一个动画幻灯片进出这个视图的功能。但是,现在我似乎无法在我的动画功能(主视图控制器的一部分)中访问这个 HintsViewTableVC。未找到 self.HintsViewTableVC 和 HintsViewTableVC。有什么指点吗?
    • 当您创建 HintsViewTableVC 时,您是否将其保存到 ViewController 中的属性中?这就是您的动画功能期望访问它的方式。您可能必须将您的属性声明为var hintsViewTableVC: HintsViewTableViewController?,因为它稍后会被实例化。
    猜你喜欢
    • 2013-10-05
    • 2013-03-20
    • 1970-01-01
    • 2016-03-08
    • 2012-03-10
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多