UISearchBar's set_cancelButtonText: ivar запрещен - PullRequest
1 голос
/ 21 сентября 2019

Раньше в iOS 12 разрешался один и тот же код, но теперь, когда я пытаюсь запустить тот же код на iOS 13, он вылетает и выдает ту же ошибку:

Завершение работы приложения из-за необработанного исключения 'NSGenericException », причина:« Доступ к set_cancelButtonText: ivar в UISearchBar запрещен.Это ошибка приложения '

, которая связана с этой строкой кода:

searchController.searchBar.setValue("Cancel".localized, forKey:"_cancelButtonText")

Теперь я знаю, что доступ к setValue теперь запрещен, но как это можно преодолеть?Это приводит к сбою и изменению названия кнопки отмены, поскольку в панели поиска отсутствует свойство.

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Вместо того, чтобы возиться с недокументированной иерархией представления, вы можете использовать UIAppearance:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Whatever"
0 голосов
/ 21 сентября 2019

Таким образом, чтобы преодолеть проблему, вот решение, с которым я пришел:

Прежде всего установите, чтобы показать кнопку Отмена:

searchController.searchBar.setShowsCancelButton(true, animated: true)

Затем найдите кнопку в подпредставлениях панели поиска, затем изменитетекст и скрыть кнопку отмены сразу после установки нового заголовка:

    for subview in searchController.searchBar.subviews {
        for subview1 in subview.subviews {
            for subview2 in subview1.subviews {
                if subview2 is UIButton {
                    let cancelButton =  subview2 as! UIButton
                    cancelButton.setTitle("Cancel".localized, for: .normal)
                    searchController.searchBar.setShowsCancelButton(false, animated: true)
                }
            }

        }
    }

Используя делегата UISearchbar, покажите кнопку отмены:

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {

     searchBar.setShowsCancelButton(true, animated: true)

}

Тогда отмена будетщелкнув с помощью UISearchbar, делегат скроет его:

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {

     searchBar.setShowsCancelButton(false, animated: true)

}

Это отлично сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...