ios: leftBarButtonItem.target 和.action
ios: leftBarButtonItem.target and .action
我有一个登录视图控制器,我在其中创建了 navigationController,并使用自定义视图(即 UIButton
)创建了 leftBarButtonItem
和 rightBarButtonItems
。现在我只在这里设置了 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)
.
我有一个登录视图控制器,我在其中创建了 navigationController,并使用自定义视图(即 UIButton
)创建了 leftBarButtonItem
和 rightBarButtonItems
。现在我只在这里设置了 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)
.