Как изменить текст UIBarButtonItem во время выполнения «чисто» (Редактировать -> Готово -> Редактировать)?

#ios #swift #uibarbuttonitem

#iOS #swift #uibarbuttonitem

Вопрос:

Я пытаюсь изменить текст UIBarButtonItem «чисто» во время выполнения, чтобы можно было переключать режимы редактирования / выполнения. Однако каждый раз, когда я меняю атрибут title во время выполнения, анимация кажется неуклюжей. Я хочу подражать внешнему виду и функциям кнопки Редактировать / Готово в приложении Контакты (где Редактирование просто исчезает, а на его месте появляется Готово).

 @IBAction func editDoneButtonPressed(sender: UIBarButtonItem) {

    if(sender.title == "Edit"){
        sender.title = "Done"
    }else{
        sender.title = "Edit"
    }

}
  

Начальные настройки: идентификатор установлен на «пользовательский», а заголовок — на «Редактировать»

Предпочтительны более простые программные решения, однако внешний вид анимации действительно имеет первостепенное значение. Я бы подумал о переключении идентификатора UIBarButtonItem, а не его текстового атрибута, однако я не уверен в элегантном способе переключения идентификатора во время выполнения.

Кстати: я использую Swift для создания приложения.

Ссылки на…

Скринкаст редактирования приложения контактов / Выполненная анимация переключения:https://youtu.be/5mT_vzpNhIw

Скринкаст моей анимации редактирования / завершения переключения:https://youtu.be/mEweotJNVNE

Спасибо.

Комментарии:

1. Покажите, как вы настраиваете этот элемент кнопки панели.

2. Я имею в виду, что вам нужно обновить свой вопрос с помощью кода, используемого для создания и настройки кнопки редактирования.

3. Для настройки кнопки редактирования не использовался код. Он был перетащен на панель навигации. Спасибо.

Ответ №1:

Есть гораздо лучший способ, стандартный способ, получить кнопку Редактирования / Готово.

UIViewController предоставляет стандартную кнопку Редактирования / готово, которая уже подключена к editing свойству контроллера представления.

Обычное использование заключается в следующем:

Внутри viewDidLoad метода вашего контроллера представления используйте стандартную кнопку:

 self.navigationItem.rightBarButtonItem = editButtonItem
  

Поместите editButtonItem туда, где вам это действительно нужно.

Затем, вместо настройки собственного действия, просто переопределите setEditing(_:animated:) метод:

 override func setEditing(_ editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)

    if (editing) {
        // user just tapped the Edit button (it now says Done)
    } else {
        // user just tapped the Done button (it now says Edit)
    }
}
  

Комментарии:

1. 1. Можно ли добавить эту стандартную кнопку на панель навигации?

2. 2. Устранит ли это неаккуратную анимацию, с которой я столкнулся?

3. 1. Это то, что делает код в моем ответе. Он добавляет кнопку в правую часть панели навигации. 2. Скорее всего. Это зависит от того, что вы делаете внутри setEditing метода.

4. Требуется ли для этого, чтобы я удалил свою кнопку в IB?

5. Оператор, предназначенный для перехода в метод viewDidLoad, похоже, не создает и не помещает кнопку в панель навигации.