ios:leftBarButtonItem.target 和 .action
Posted
技术标签:
【中文标题】ios:leftBarButtonItem.target 和 .action【英文标题】:ios: leftBarButtonItem.target and .action 【发布时间】:2015-08-20 17:45:31 【问题描述】:我有一个登录视图控制器,我在其中创建 navigationController,并使用自定义视图(UIButton
)创建 leftBarButtonItem
和 rightBarButtonItems
。现在在这里我只设置了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 而不是视图控制器堆栈中的前一个控制器
【问题讨论】:
你的 backButtonPressed() 选择器方法的标题是什么样的? @timgcarlson 更新了问题 你确定没有调用 backbuttonPressed() 方法吗?您能否显示将自定义按钮设置为条形按钮项的代码。 要进一步添加@JennyJose 建议的内容,请尝试在 backButtonPressed 中放置一个断点或使用 print() 打印到控制台。 你在哪里设置target
和action
属性?
【参考方案1】:
尝试像这样更改设置自定义栏按钮项的代码 -
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);
问题是您正在设置自定义按钮并在栏按钮上添加操作!
【讨论】:
我知道我可以在 UIButton 上设置事件,但我不想这样做。如果我这样做,我必须在我初始化导航控制器的地方实现相同的方法,就像 AppDelegate 一样。我还在那里创建按钮并将它们保存在navigationController
中,这样我就不必总是在每个视图控制器中创建它们。同样在某些视图控制器中,我不需要 leftBarButtonItem 或 rightBarButtonItems 所以我没有在那里设置 self.navigationItem.leftBarButtonItem 属性。【参考方案2】:
导航控制器中的后退按钮既不是栈顶视图控制器的leftBarButtonItem,也不是导航控制器的leftBarButtonItem。它是堆栈中上一个视图控制器的 backBarButtonItem。
你可以改变它的标题,但不幸的是你不能给它添加一个目标/选择器对(你可以,但它永远不会起作用)。
【讨论】:
并非如此。我在以前的视图控制器中什么都没有。我只在导航控制器中设置了它们,并且确信它们只是来自 navigationController 的按钮。【参考方案3】:首先,我创建了单独的 NavigationController 类,它是 UINavigationController
的子类,我在其中为每种类型的按钮定义了方法。在这些方法中,我使用NSNotificationCenter.defaultCenter().postNotificationName
为每种类型的按钮发布适当的通知。为了确保只有最顶层的 viewcontroller 接收到事件,所有 viewcontroller 在viewWillAppear
的通知中注册使用
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("buttonPressed"), name: 'button1Notification', object: nil)
并在viewWillDisappear
期间取消注册
NSNotificationCenter.defaultCenter().removeObserver(self)
.
【讨论】:
以上是关于ios:leftBarButtonItem.target 和 .action的主要内容,如果未能解决你的问题,请参考以下文章