removeTarget leftBarButtonItem的问题 - 可能无法响应

时间:2012-06-14 15:06:52

标签: iphone uinavigationcontroller uinavigationbar uinavigationitem

我正在尝试为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]实现了相同的效果

1 个答案:

答案 0 :(得分:0)

正如我在评论中所说,UIBarButtonItem不继承UIControl方法,因此您对addTargetremoveTarget发出警告。相反,您所做的是直接分配新的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签名。

希望这有帮助。