ios:leftBarButtonItem.target和.action

时间:2015-08-20 17:45:31

标签: ios swift uinavigationcontroller uibarbuttonitem

我有一个Login视图控制器,我在其中创建navigationController,并使用自定义视图(leftBarButtonItem)创建rightBarButtonItemsUIButton。现在,我只设置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:我在Login视图控制器中设置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,而不是视图控制器堆栈中的前一个控制器

3 个答案:

答案 0 :(得分:0)

尝试更改设置自定义栏按钮项的代码,如下所示 -

    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);

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

答案 1 :(得分:0)

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

您可以更改它的标题,但不幸的是,您无法为其添加目标/选择器对(您可以,但它永远不会有效)。

答案 2 :(得分:-1)

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

进行通知注册

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

并在viewWillDisappear期间使用

取消注册

NSNotificationCenter.defaultCenter().removeObserver(self)