问题
我有一个带有单个视图控制器的单页应用程序。在屏幕上有一个按钮,可以在一个(较小的)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分成单独的视图控制器(在同一个故事板中)的正确程序是什么?
答案 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 }()