在UINavigationBar

时间:2016-06-21 14:46:48

标签: ios swift uinavigationbar uinavigationitem

我有一个嵌入导航控制器的视图控制器。

在导航栏上,我在条形图的中心有一个segmentedControl,然后是右边的编辑按钮。

当我点击“编辑”按钮时,会触发以下代码:

func editAction() {

    if homeworkTasksVC?.editing == false {

        // Set to editing
        homeworkTasksVC?.setEditing(true, animated: true)

        // Switch to "Done" button and 'Homework' title without segmented control
        let navBar = self.navigationController?.navigationBar
        let navItem = UINavigationItem(title: "Homework")

        let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: #selector(TasksParentViewController.editAction))
        navItem.rightBarButtonItem = doneButton

        navBar!.setItems([navItem], animated: true)


    } else {

        // Stop editing
        homeworkTasksVC?.setEditing(false, animated: true)

        // Switch back to "Edit" button and segmented control
        let navBar = self.navigationController?.navigationBar
        let navItem = UINavigationItem(title: "Homework")
        navItem.titleView = segmentControl

        let editButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Edit, target: self, action: #selector(TasksParentViewController.editAction))
        navItem.rightBarButtonItem = editButton

        navBar!.setItems([navItem], animated: true)

    }

}

(注意:引用homeworkTasksVC是因为有问题的视图是UIPageViewController而不是两个视图之间的切换)

问题:当我点击编辑时,分段控件切换文本标题没有任何问题,然后再次点击“编辑”时切换回所有正常,但是如果我点击一个单元格导航到不同视图的视图,然后点击“返回”返回到原始视图,然后点击编辑,它会崩溃并显示以下输出:

  

2016-06-22 00:38:59.272 2.0 [1504:386949] *由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无法直接在由控制器管理的UINavigationBar上调用setItems:animated: “。   * 第一次抛出调用堆栈:   (0x23c85b0b 0x23442dff 0x23c85a51 0x283a0ced 0x118318 0x1189c8 0x2829b6a1 0x2841e0b9 0x2829b6a1 0x2829b631 0x2828356b 0x28283697 0x2829af51 0x2829abbf 0x28293547 0x28263dd5 0x28262379 0x23c479e7 0x23c475d7 0x23c4593f 0x23b941c9 0x23b93fbd 0x251b0af9 0x282cc435 0xe8cb4 0x23840873)   libc ++ abi.dylib:以NSException类型的未捕获异常终止   (LLDB)

2 个答案:

答案 0 :(得分:5)

您想要的是在当前视图控制器上设置navigationItem属性。当您在导航堆栈上推送第二个视图控制器时,UINavigationController将接管导航栏项目的管理。它实际上可能是一个在推送之前工作的错误。

而不是:

navBar!.setItems([navItem], animated: true)

做其中之一:

homeworkTasksVC.navigationItem = navItem

或:

self.navigationItem = navItem

选择哪一个取决于您如何堆叠视图控制器。

答案 1 :(得分:0)

正如查克·克鲁辛格(Chuck Krutsinger)所说,现在navigationItem是仅获得的财产。您的代码必须为:

homeworkTasksVC.navigationBar.topItem?.rightBarButtonItem = editButton