如何从垃圾桶图标按钮和“完成”按钮动态切换UIBarButtonItem?

时间:2011-04-30 06:41:46

标签: ios objective-c uibarbuttonitem

我有一个带有按钮的UIToolbar,我想用它来切换编辑模式,以便在我的UITableView中删除行。如果我决定动态更改UIBarButton的 title ,我已经完成了一切。即,您启动应用程序,按钮显示“删除”。单击它,UITableView切换到“编辑”模式,然后将按钮的标题更改为“完成”。再次单击它并退出“编辑”模式,按钮返回“删除”标题。

我未能开始工作的是让按钮显示标准垃圾桶图标而不是“删除”。我注意到了UIBarButtonSystemItemTrash常量,如果我开始使用它,它肯定会显示垃圾图标,但如果我这样做,我就无法切换到“完成”按钮。

以下是适用于标题更改方法的代码:

- (IBAction)toggleDelete
{
    [self.eventsTable setEditing:!self.eventsTable.editing animated:YES];

    if (self.eventsTable.editing)
    {
        [self.deleteButton setTitle:@"Done"];     
        [self.deleteButton setStyle:UIBarButtonItemStyleDone];
    }
    else
    {
        [self.deleteButton setTitle:@"Delete"];
        [self.deleteButton setStyle:UIBarButtonItemStyleBordered];
    }
}

我尝试了其他几种方法,但没有一种方法有效。这是系统似乎忽略的一个:

- (IBAction)toggleDelete
{
    [self.eventsTable setEditing:!self.eventsTable.editing animated:YES];

    if (self.eventsTable.editing)
        [self.deleteButton setStyle:UIBarButtonSystemItemDone];
    else
        [self.deleteButton setStyle:UIBarButtonSystemItemTrash];
}

而且这里的另一个黑客当然看起来很黑,但我发现有人声称它会起作用。不幸的是,它不适合我,但无论如何它感觉更加hacky。它似乎也被系统忽略了;我的意思是,无论我设置按钮如何在Interface Builder中启动,即使此代码正在执行,它也是如此。

- (IBAction)toggleDelete
{
    [self.eventsTable setEditing:!self.eventsTable.editing animated:YES];

    if (self.eventsTable.editing)
    {
        UIBarButtonItem *doneButton = [[UIBarButtonItem alloc]
                                       initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
                                       target:self action:@selector(toggleDelete)];

        self.deleteButton = doneButton;
        [doneButton release];        
    }
    else
    {
        UIBarButtonItem *trashButton = [[UIBarButtonItem alloc]
                                       initWithBarButtonSystemItem:UIBarButtonSystemItemTrash 
                                       target:self action:@selector(toggleDelete)];

        self.deleteButton = trashButton;
        [trashButton release];        
    }
}

我看到了一些与我的情景相近的其他问题,但没有一个问题最终得到帮助。

1 个答案:

答案 0 :(得分:0)

你可能已经这样做但是因为我在代码中看不到它,所以无论如何我都会提到它。将deleteButton设置为doneButton或trashButton后,您应该将deleteButton设置为正确的barItem。在else语句之后,可能是这样的:

self.navigationItem.rightBarButtonItem = self.deleteButton;