从UIViewController调用自定义UINavigationController中的方法时出现错误的目标

时间:2015-12-31 22:09:31

标签: ios swift uiviewcontroller uinavigationcontroller target

我创建了UINavigationController的子类,并在导航栏中放置了一个UIBarButtonItem。代码如下:

SharedNavigationController.swift

func showNextButton(nc: UINavigationController) {
    print(nc)
    let nextButton = UIBarButtonItem(title: "Next", style: UIBarButtonItemStyle.Plain, target: nc, action: "next")
    print(nextButton.target)
    self.navigationBar.topItem?.rightBarButtonItem = nextButton
}

然而,当按下具有错误目标的按钮时,我遇到了问题。而不是目标是导航控制器(创建它的类),而是导航控制器中的当前视图控制器。结果,我收到以下错误:

  

***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [App.SignupBasicInfoForm   next]:无法识别的选择器发送到实例0x7af7d0c0'

我最初将目标设置为“self”,但它引用了导航控制器中的视图控制器,而不是导航控制器本身。我也尝试将目标设置为self.navigationController,效果相同。最后,我明确地将SharedNavigationController的实例传递给showNextButton方法,如上面的代码所示。印刷声明给我这个:

print(nc): <App.SharedNavigationController: 0x7d41f800>
print(nextButton.target): Optional(<App.SharedNavigationController: 0x7d41f800>)

所以至少在SharedNavigationController中,目标是正确的。但是,当从导航控制器内的当前视图控制器轻击按钮时,目标似乎已更改。我上面尝试的东西不起作用。如何为按钮指定正确的目标,而无需定义方法或从视图控制器而不是导航控制器设置条形按钮项?

1 个答案:

答案 0 :(得分:0)

您可能需要在子类中覆盖此func以执行您想要的操作

override func pushViewController(viewController: UIViewController, animated: Bool) {
    viewController.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Next", style: UIBarButtonItemStyle.Plain, target: nc, action: "next")
    super.pushViewController(viewController, animated: animated)
}