展开视图控制器值时出现致命错误

时间:2017-01-26 13:15:43

标签: ios swift

我在故事板中有一些带有某些标识符的viewcontrollers,当我尝试像这样访问它们时:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:file:data/chefdb;hsqldb.write_delay=false" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

该应用程序崩溃。该行检测到该值为零。打开时,有人可以解释这是怎么回事吗?

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let mainViewController = sideMenuController!
    let vcName = identities[indexPath.row]
    let viewController: UIViewController! = storyboard?.instantiateViewController(withIdentifier: vcName)
    let navigationController = mainViewController.rootViewController as! NavigationController
    navigationController.pushViewController(viewController, animated: true)
    mainViewController.hideLeftView(animated: true, completionHandler: nil)

}

经过几次尝试,我设法摆脱了致命的错误。但是,在点击表视图项时,视图控制器仍然不会出现。

  • 原创项目 - link

  • 编辑项目 - link

2 个答案:

答案 0 :(得分:0)

let viewController: UIViewController!

Optional,这个!你只是告诉编译器“我知道这可能是零但不要担心,在运行时它永远不会是零”。

如果你想摆脱这个Optional,你必须打开故事板:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let mainViewController = sideMenuController!
    let vcName = identities[indexPath.row]
    let viewController = storyboard!.instantiateViewController(withIdentifier: vcName)
    let navigationController = mainViewController.rootViewController as! NavigationController
    navigationController.pushViewController(viewController, animated: true)
    mainViewController.hideLeftView(animated: true, completionHandler: nil)

}

答案 1 :(得分:0)

嗯,该项目有点“混乱”: - )

首先:你需要以某种方式获得“{”UINavigationController(或派生类)。

由于您的LeftViewController不在导航堆栈中,因此它没有设置navigationController。因此,您需要从mainViewController

获取它
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    print(storyboard)
    let mainViewController = sideMenuController!
    let vcName = identities[indexPath.row]
    let viewController: UIViewController! = storyboard.instantiateViewController(withIdentifier: vcName)
    print(viewController)
    if let theNavigationController = mainViewController.rootViewController as? UINavigationController {
        print("Gotcha")
        theNavigationController.pushViewController(viewController!, animated: true)
        mainViewController.hideLeftView(animated: true, completionHandler: nil)
    }

}

第二,仍有问题:

标识符为“A”的视图控制器的类型为EngineTunningParamteres,派生自UINavigationController。您无法将导航控制器推送到现有导航控制器。因此,我们也必须改变课程:

class EngineTunningParamteres: UIViewController {

    override func viewDidLoad() {
        print("hi")    }

}

现在它有效。不客气。