【问题标题】:How can I dynamically switch a UIBarButtonItem from a trash icon button and a 'Done' button?如何从垃圾图标按钮和“完成”按钮动态切换 UIBarButtonItem?
【发布时间】:2011-04-30 06:41:45
【问题描述】:

我有一个带有按钮的 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];
}

这里还有另一个 hack,虽然看起来很hacky,但我发现有人声称它会起作用。不幸的是,它不适合我,但无论如何它都感觉特别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];        
    }
}

我看到了几个与我的场景相近的其他问题,但没有一个有帮助。

【问题讨论】:

  • 在您的最后一种方法中,您的方法签名是不同的。在初始化时,它有“toggleDelete:”,而实现的方法不带任何参数。尝试更改此设置,看看是否有效。
  • 谢谢,阿米特。我可能错过了您的建议,但我将其更改为 @selector(toggleDelete) (即没有冒号)并得到相同的结果。请注意,无论何时单击任一按钮,都会调用 toggleDelete is;我已经确认每次都会遇到断点。这是你建议我尝试的吗?
  • 好吧,刚刚从question 中学习了冒号如何与选择器一起使用。我将编辑问题以使用不带冒号的版本,因为这似乎是正确的用法(不确定为什么当冒号存在时实际上会调用该方法,但我会单独研究。

标签: ios objective-c uibarbuttonitem


【解决方案1】:

您可能已经这样做了,但由于我在代码中看不到它,所以我还是会提到它。一旦将deleteButton 设置为doneButton 或trashButton,您也应该将deleteButton 设置为正确的barItem。在 else 语句之后,可能是这样的:

self.navigationItem.rightBarButtonItem = self.deleteButton;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2013-06-20
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多