ios: leftBarButtonItem.target 和.action

ios: leftBarButtonItem.target and .action

我有一个登录视图控制器,我在其中创建了 navigationController,并使用自定义视图(即 UIButton)创建了 leftBarButtonItemrightBarButtonItems。现在我只在这里设置了 navigationController 的条形按钮项目,以便它们可以被推送到该 navigationController 上的所有视图控制器访问,使用:

navigationController.navigationItem.rightBarButtonItems = [someBarButton, someOtherBarButton]
navigationController.navigationItem.leftBarButtonItem = backBarButton

现在我为每个视图控制器设置 self.navigationItem.leftBarButtonItem = self.navigationController.navigationItem.leftBatButtonItem。我可以查看按钮。现在,因为按下这些的方法应该在视图控制器中实现,我在视图控制器的 viewDidLoad() 中尝试了这个:

self.navigationItem.leftBarButtonItem!.target = self
self.navigationItem.leftBarButtonItem!.action = Selector("backButtonPressed")

但是我在方法中没有收到任何回调:

func backButtonPressed() {
    println("Back pressed")
    popViewController()
}

编辑 #1: 我在登录视图控制器中设置 leftBarButtonItem 的代码:

let navigationController = UINavigationController()

let backButton = UIButton(frame: CGRectMake(0, 0, kNavBarIconHeight, kNavBarIconHeight))
backButton.setImage(UIImage(named: "backButton"), forState: UIControlState.Normal)
let backBarButton = UIBarButtonItem(customView: backButton)

navigationController.navigationItem.leftBarButtonItem = backBarButton

我使用的是 navigationController 的 barButtonItem 而不是视图控制器堆栈中的前一个控制器

尝试像这样更改设置自定义栏按钮项的代码 -

    let leftButton: UIButton = UIButton.buttonWithType(UIButtonType.Custom) 
    leftButton.frame = CGRectMake(0, 0, 40, 40) ; 
    leftButton.setImage(UIImage(named:"ImageName.png"), forState: UIControlState.Normal)
    leftButton.addTarget(self, action: "backButtonClick", forControlEvents: UIControlEvents.TouchUpInside)

    var leftBarButtonItem: UIBarButtonItem = UIBarButtonItem(customView: leftButton)

   self.navigationItem.setLeftBarButtonItem(leftBarButtonItem, animated: false);

问题是您正在设置自定义按钮并在栏按钮上添加操作!

导航控制器中的后退按钮既不是堆栈顶视图控制器的 leftBarButtonItem,也不是导航控制器的 leftBarButtonItem。它是堆栈中前一个视图控制器的 backBarButtonItem。

您可以更改它的标题,但遗憾的是您不能向其中添加 target/selector 对(当然可以,但它永远行不通)。

首先,我创建了单独的 NavigationController class,它是 UINavigationController 的子 class,我在其中为每种类型的按钮定义了方法。在这些方法中,我为每种类型的按钮使用了 NSNotificationCenter.defaultCenter().postNotificationName 到 post 适当的通知。为确保只有最顶层的 viewcontroller 接收事件,所有 viewcontroller 使用

viewWillAppear 中注册通知

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("buttonPressed"), name: 'button1Notification', object: nil)

并在 viewWillDisappear 期间使用

注销

NSNotificationCenter.defaultCenter().removeObserver(self).