Отслеживание действия встроенной кнопки возврата UINavigationController

#iphone #ios #xcode #cocoa-touch

#iPhone #iOS #xcode #cocoa-touch

Вопрос:

Есть много вопросов о переопределении действия кнопки возврата навигационного контроллера, но все говорят, что прямого способа сделать это нет. Я реализовал это, унаследовав UINavigationController и переопределив метод UINavigationBarDelegate. Но проблема в том, что интерфейс UINavigationController не реализует протокол UINavigationBarDelegate (но он реализует этот метод, потому что этот код работает :), и я боюсь, что приложение будет отклонено Apple, учитывая, что здесь используется недокументированный API.

Итак, вопрос в том, как вы думаете, это частное использование API или нет? Вот код:

 @interface CustomNavigationController : UINavigationController <UINavigationBarDelegate>

@end

@implementation CustomNavigationController

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {
    BOOL shouldPop = [[self topViewController] enableBackButton]; // every view controller overrides this method to disable or enable pop of view controller
    if (shouldPop) {
        //here is the warning about "UINavigationController may not respond to selector"
        return [super navigationBar:navigationBar shouldPopItem:item];
    } else {
        return NO;
    }
}

@end
  

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

1. Это метод протокола UINavigationBarDelegate: [super NavigationBar:NavigationBar shouldPopItem:item]; UINavigationController не реализует протокол UINavigationBarDelegate.

Ответ №1:

Документация Apple по UINavigationController: Этот класс не предназначен для создания подклассов.

Хотя это намерение не является запретом и технически не может привести к отклонению (использование, похоже, не ссылается на какие-либо частные API), это должно повлиять на ваше дизайнерское решение. Вы, вероятно, унаследуете неожиданное поведение сейчас или, возможно, в будущем (если что-то изменится во внутренних компонентах суперкласса). Навигационный контроллер — удобная вещь, но в зависимости от того, что вам нужно, вам может быть лучше использовать свой собственный.

Одной из альтернатив может быть использование стандартного навигационного контроллера, но установите для его свойства NavigationBar значение hidden. Затем вы можете создать и включить свою собственную панель навигации в XIB с любыми кнопками, предназначенными для любых действий, которые вы пожелаете (например, кнопка возврата, просто вызывающая popViewController).

РЕДАКТИРОВАТЬ: Подкласс UINavigationController больше не рекомендуется.

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

1. Спасибо за ответ. Я подумаю о том, как реализовать свою собственную панель навигации.

2. Похоже, это изменилось: «Этот класс обычно используется как есть, но может быть подклассом в iOS 6 и более поздних версиях». Просто взято из документации Apple по UINavigationController .