0

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

4

1 回答 1

0

正如我在评论中所说,UIBarButtonItem不继承UIControl方法,因此您对addTargetand的警告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

希望这可以帮助。

于 2012-06-14T15:50:09.893 回答