есть универсальный бар кнопка пункт в navigationController
У меня есть UINavigationController
в моем приложении, я хочу иметь право UIBarButtonItem
показываться во всех навигационных панелях, которые появляются в моем приложении. эта кнопка будет загружать меню, поэтому я не хочу добавлять эту кнопку в каждую панель навигации вручную, также как функция загружает меню, я не хочу копировать/прошлые действия для этой кнопки.
Есть ли способ справиться с этим в ViewController.h
и .m
?
Таким образом, кнопка действует как универсальный элемент кнопки панели?
6 ответов:
То, что вы можете сделать, - это подкласс навигационного контроллера. Вот пример
@interface NavigationController : UINavigationController @end @interface NavigationController () <UINavigationBarDelegate> @end @implementation NavigationController - (void)viewDidLoad { [super viewDidLoad]; for (UIViewController* viewController in self.viewControllers){ // You need to do this because the push is not called if you created this controller as part of the storyboard [self addButton:viewController.navigationItem]; } } -(void) pushViewController:(UIViewController *)viewController animated:(BOOL)animated{ [self addButton:viewController.navigationItem]; [super pushViewController:viewController animated:animated]; } -(void) addButton:(UINavigationItem *)item{ if (item.rightBarButtonItem == nil){ item.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(action:)]; } } -(void) action:(UIBarButtonItem*) button{ } @end
Это невозможно сделать, если вы не используете пользовательский вид, похожий на панель навигации. По умолчанию NavigationController удаляет все элементы кнопок панели, когда ViewController нажимается или выскакивает. Так что для каждого ViewController вам нужно каждый раз создавать UIBarButtonItem в функции
- (void)viewWillAppear:(BOOL)animated
Или использовать может подкласс UINavigationController и сделать как @rp90 ответ.
Вы можете добавить кнопку, которая появляется в вашем UINavigationController, добавив ее в делегат UINavigationController - в данном примере это одноэлементный вспомогательный класс.
Swift 3:
class NavHelper: UINavigationControllerDelegate { static let shared = NavHelper() func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { let barButtonItem = UIBarButtonItem(image: <yourButtonImage>, style: .plain, target: NavHelper.shared, action: #selector(NavDelegate.handleButton(_:))) viewController.navigationItem.rightBarButtonItem = barButtonItem } func handleButton(_ sender: UIBarButtomItem) { <yourCode> } }
Другой вариант-сделать свой собственный вид панели навигации частью UIViewController. Вы можете отключить Apple и построить свой собственный. Мы сделали это, чтобы облегчить себе управление. Единственное, что вы теряете, - это легкая прозрачность под iOS 7. Многие приложения делают это по той же причине, что и мы.
Вы можете создать новый класс, который наследует от
UIViewController
, и в методеviewDidLoad
создатьUIBarButtonItem
и добавить его вnavigationItem
как элемент панели слева/справа. Допустим, этот класс называетсяCustomBarViewController
:UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithTitle:@"hi" style:UIBarButtonItemStylePlain target:self action:@selector(doSomething:)]; [self.navigationItem setRightBarButtonItem:barItem];
В существующих контроллерах представления вместо того, чтобы наследовать их от
UIViewController
в файле.h
, вы можете использоватьCustomBarViewController
вместо:@interface MyExistingViewController : CustomBarViewController
Затем вы можете поместить действия в метод
doSomething:
или передать уведомления существующим контроллерам представлений.