Как я могу динамически переключать UIBarButtonItem с помощью кнопки со значком корзины и кнопки «Готово»? - PullRequest
1 голос
/ 30 апреля 2011

У меня есть UIToolbar с кнопкой, которую я хотел бы использовать для переключения режима редактирования, чтобы включить удаление строк в моем UITableView. У меня все работает отлично, если я согласен на динамическое изменение title UIBarButton. Т.е., вы запускаете приложение и кнопка говорит "Удалить". Нажмите на него, и 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];
}

и вот еще один хак, который, конечно, казался хакерским, но я нашел кого-то, утверждающего, что это сработает Это, к сожалению, не для меня, но все равно чувствовал себя лишним. Похоже, система тоже игнорирует это; под этим я подразумеваю то, что независимо от того, что я установил для кнопки, как в Интерфейсном Разработчике, это то, что происходит, хотя этот код выполняется.

- (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 голосов
/ 25 мая 2011

Возможно, вы уже делаете это, но, поскольку я не вижу этого в коде, я все равно упомяну об этом.Как только вы установите deleteButton в doneButton или trashButton, вы должны также установить deleteButton в соответствующий barItem.После оператора else может быть что-то вроде этого:

self.navigationItem.rightBarButtonItem = self.deleteButton;
...