【发布时间】:2018-02-03 20:46:15
【问题描述】:
这是我目前的设置:
MainMenuViewController -> SubMenuViewController -> UserInputViewController -> ResultViewController
我所有的视图控制器都包含一个tableView。
当用户点击MainMenuViewControlle 中的一个单元格时,它将转到SubMenuViewController。一切都很好。
这就是棘手的地方,在SubMenuViewController 中,有些单元格需要实例化另一个SubMenuViewController,因为子菜单选项可能有好几级。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let selectedNode = node?.childenNode[indexPath.row] else {
return
}
if selectedNode.isLeaveNode() {
performSegue(withIdentifier: "userInput", sender: self)
} else {
let subMenuViewController = SubMenuViewController(node: selectedNode)
self.navigationController?.pushViewController(subMenuViewController, animated: true)
}
当没有子节点时,它会转到UserInputViewController,但是当有更多选项时,它需要实例化另一个SubMenuViewController,tableView 将根据用户之前点击的单元格填充自己直到selectedNode.isLeaveNode() 为真(这意味着不会有任何子节点)。
这个问题是当这段代码运行时:
let subMenuViewController = SubMenuViewController(node: selectedNode)
self.navigationController?.pushViewController(subMenuViewController, animated: true)
它给了我以下错误:
致命错误:在展开可选值时意外发现 nil
从我在这里注册我的单元格的地方:
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "SubMenuTableViewCell", bundle: bundle)
tableView.register(nib, forCellReuseIdentifier: "SubMenuCell")
我所有的 tableView 单元格都是使用 xib 文件实例化的,我已经在 viewDidLoad() 中注册了我的单元格
有人能看出问题吗?
更新
这是我的其余代码:
UIViewController
class SubMenuViewController: UIViewController {
var node: Node?
init(node: Node) {
self.node = node
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.isNavigationBarHidden = false
self.navigationItem.title = node?.value.rawValue
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "SubMenuTableViewCell", bundle: bundle)
tableView.register(nib, forCellReuseIdentifier: "SubMenuCell")
}
}
UITableViewDataSource
extension SubMenuViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return node!.childCount
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
print("called")
let cell = tableView.dequeueReusableCell(withIdentifier: "SubMenuCell", for: indexPath) as! SubMenuTableViewCell
let desciptionModule = node?.childenNode[indexPath.row].value
let description = Modules.description(module: desciptionModule!)
cell.title.text = description.main
cell.subtitle.text = description.sub
return cell
}
}
UITableViewDelegate
extension SubMenuViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 68
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let selectedNode = node?.childenNode[indexPath.row] else {
return
}
if selectedNode.isLeaveNode() {
performSegue(withIdentifier: "userInput", sender: self)
} else {
let subMenuViewController = SubMenuViewController(node: selectedNode)
self.navigationController?.pushViewController(subMenuViewController, animated: true)
}
}
}
【问题讨论】:
-
你的
subMenuViewController被实例化了吗?如果您在let之后立即打印,您会得到什么? -
请添加您的 SubMenuViewController 初始化代码。
-
请看更新,谢谢
-
@BrendonCheung 您在哪个确切的代码通道上发现了崩溃?这个插座
@IBOutlet weak var tableView: UITableView!是否与故事板连接?你用prepareForSegue:函数吗? -
@VasiliiMuravev 错误在
tableView.register(nib, forCellReuseIdentifier: "SubMenuCell"),是的,我的tableView是连接的,不,我没有使用prepareForSegue。考虑到这一点,我们不能使用prepareForSegue,因为故事板中没有segue。SubMenuViewController实例化自己
标签: ios swift uitableview storyboard segue