есть универсальный бар кнопка пункт в navigationController


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

Есть ли способ справиться с этим в ViewController.h и .m?

Таким образом, кнопка действует как универсальный элемент кнопки панели?

6 2

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: или передать уведомления существующим контроллерам представлений.

Вы можете добавить кнопку в ContainerView. Таким образом, он будет включен во все времена. Пища для размышлений....