我正在尝试为leftBarButtonItem调整动作
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UIBarButtonItem *theButton = self.navigationItem.leftBarButtonItem;
// 'UIBarButtonItem' may not respond to 'removeTarget:action:forControlEvents:'
[theButton removeTarget:self action:@selector(revealToggle:) forControlEvents:UIControlEventTouchUpInside];
// 'UIBarButtonItem' may not respond to 'removeTarget:action:forControlEvents:'
[theButton addTarget:self action:@selector(closeToggle:) forControlEvents:UIControlEventTouchUpInside];
// BUT THIS DOES WORK
[theButton.target performSelector:theButton.action];
}
根据我所读到的它应该有用 - 我做错了什么?
实际上,这是一个我不理解的更复杂的事情。
我想从UINavigation Controller中的当前UIViewController发送消息。
UINavigationController有这个按钮
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"btnmenu.png"] style:UIBarButtonItemStylePlain target:self.navigationController.parentViewController action:@selector(revealToggle:)];
工作正常。我真正要做的是
[self.navigationController.parentViewController closeToggle];
来自didSelectRowAtIndexPath函数的失败,但我设法用[theButton.target performSelector:theButton.action]实现了相同的效果
答案 0 :(得分:0)
正如我在评论中所说,UIBarButtonItem
不继承UIControl
方法,因此您对addTarget
和removeTarget
发出警告。相反,您所做的是直接分配新的UIBarButtonItem
:
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"btnmenu.png"] style:UIBarButtonItemStylePlain
target:self.navigationController.parentViewController action:@selector(clearToggle)];
另外,请注意定义的选择器与目标UIBarButtonItem
closeToggle:的区别。但是你说你想要做的是向 closeToggle 的父控制器发送一条消息。那里的冒号完全不同,因为人们期望一个参数。如果您的方法为closeToggle:
,则会对closeToggle
执行操作会导致崩溃,反之亦然。
-(void)closeToggle:(id)sender // your UIBarButtonItem action.
-(void)closeToggle // which is, [self.navigationController.parentViewController closeToggle];
确定您想要的方法,然后按照上面的新UIBarButtonItem
签名。
希望这有帮助。