【发布时间】: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