Подтвердить что ты не робот

Добавление одной и той же кнопки ко всем контроллерам просмотра в UINavigationController

У меня есть UINavigationController (для использования как страница мастера), которую я создаю программно, и мне нужно отобразить кнопку "Отмена", чтобы отменить процесс в любом UIViewController.

Создание UINavigationController:

FirstVC *firstVC = [[[FirstVC alloc] initWithNibName:@"FirstPage" bundle:nil] autorelease];
firstVC.delegate = self;

navigationController = [[UINavigationController alloc] initWithRootViewController:firstVC];
[self.view addSubview:navigationController.view];

Добавление кнопки "Отмена":

UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelRequestNewLeave:)];
navigationController.topViewController.navigationItem.rightBarButtonItem = cancelButton;
[cancelButton release];

Но когда я нажимаю вторую страницу на UINavigationController, кнопка отмены не отображается на UINavigationBar. Если я вернусь на первую страницу, появится кнопка отмены. Таким образом, по-видимому, кнопка добавляется только для первого вида. Я считаю, что это потому, что я не подклассифицирую UINavigationController, потому что мне нужно использовать его в подвью. Но я не знаю, как установить rightBarButtonItem в UINavigationController, который создается программно.

navigationController.topViewController.navigationItem.rightBarButtonItem = cancelButton;

Может ли кто-нибудь пролить свет на это?

Спасибо заранее.

4b9b3361

Ответ 1

Элемент навигации для каждого контроллера. Навигационная панель извлекает свое содержимое из элемента навигации контроллера вида, чей вид в настоящее время он обрамляет, что соответствует контроллеру представления в верхней части стека контроллера навигации.

В основном вам нужен каждый контроллер просмотра, чтобы вставить кнопку отмены в свой элемент навигации. Вы можете выполнить любое из следующих действий:

  • Скопируйте код на все соответствующие контроллеры представлений.
  • Переместите код в служебную функцию или класс и вызовите это.
  • Создайте общий суперкласс для всех соответствующих контроллеров представлений, которые обрабатывают настройку кнопки отмены для своих подклассов.

Ответ 2

Вы также можете подклассифицировать UINavigationcontroller и переопределить несколько таких методов:

- (id)initWithRootViewController:(UIViewController *)rootViewController {
    self = [super initWithRootViewController:rootViewController];
    if (self) {
        [self setCloseButtonToController:rootViewController];
    }
    return self;
}

- (void)dismissController {
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)setCloseButtonToController:(UIViewController *)viewController {
    UIBarButtonItem *closeItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(dismissController)];
    [viewController.navigationItem setRightBarButtonItem:closeItem];
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    [super pushViewController:viewController animated:animated];

    [self setCloseButtonToController:viewController];

}

Ответ 3

Вместо этого вы можете принять протокол UINavigationControllerDelegate в классе, который создает экземпляр UINavigationController. Вы также можете создать cancelButton заранее, а затем реализовать navigationController:willShowViewController:animated:, как это,

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    viewController.navigationItem.rightBarButtonItem = cancelButton;
}

Вам нужно будет запомнить и удерживать cancelButton и не выпускать его. Это также означает, что cancelRequestNewLeave: должен быть методом в классе, который создает экземпляр UINavigationController, который является тем, что он прямо сейчас, я думаю.

Ответ 4

  • создать CommonViewController
  • создать FirstViewController (выходит из CommonViewController)
  • создать SecondeViewController (выходит из CommonViewController)
  • добавить общие функции функций в CommonViewController

>

CommonViewController.h

@interface CommonViewController : UIViewController

-(void) initializeCartBarButton;

@end

CommonViewController.m

#import "CommonViewController.h"

@interface CommonViewController ()

@end

@implementation CommonViewController

-(void) initializeCartBarButton {


    UIBarButtonItem *cartBarButton = [[UIBarButtonItem alloc] init];
    cartBarButton.title = @"cart";
    [cartBarButton setTarget: self];
    [cartBarButton setAction: @selector(goToCart:)];

    self.navigationItem.rightBarButtonItem = cartBarButton;
    }

- (IBAction) goToCart:(id)sender {
    NSLog(@"");
  }

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
  }

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
  }

@end

FirstViewController.h

#import <UIKit/UIKit.h>
#import "CommonViewController.h"

@interface FirstViewController : CommonViewController

@end

FirstViewController.m

#import "FirstViewController.h"

@interface FirstViewController ()

@end

@implementation FirstViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self initializeCartBarButton];
}
@end

SecondViewController.h

#import <UIKit/UIKit.h>
#import "CommonViewController.h"

@interface SecondViewController : CommonViewController

@end

SecondViewController.m

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self initializeCartBarButton];
}
@end

примечание: вы можете добавить код initializeCartBarButton в viewDidLoad из CommonViewController и удалить эту функцию из CommonViewController и из

дочернего класса

Ответ 5

Вот как я это сделал с подклассом UINavigationController, который способен отклонить каждый элемент управления viewController, вставляемый в него.

class CustomNavigationController: UINavigationController, UINavigationControllerDelegate{

    //TODO: Use when we have more right bar button types.
    var rightBarButtonType: RightBarButtonType = .Close

    enum RightBarButtonType{
        case Close
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    // MARK: Private Functions
    private func addRightBarButtonTo(viewController: UIViewController){

        let barButtonItem: UIBarButtonItem!
        switch self.rightBarButtonType {
        case .Close:
            barButtonItem = UIBarButtonItem(image: UIImage(named: "ic_close_white"), style: .Done, target: self, action: #selector(CustomNavigationController.dismiss(_:)))

        }
        viewController.navigationItem.rightBarButtonItem = barButtonItem
    }

    // MARK: UINavigationController Delegate
    func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
        self.addRightBarButtonTo(viewController)
    }

    @objc func dismiss(sender: AnyObject){
        self.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
    }
}

Ответ 6

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

Ответ 7

Вы можете добавить пользовательскую "Отменить" UIButton прямо в представление NavigationBar вместо использования UIBarButtonItem.

UIButton *cancelButton = [UIButton buttonWithType:UIButtonTypeCustom];
cancelButton.imageView = // Some custom image
cancelButton.frame = CGRectMake(...);  // Something far to the right.
[self.navigationController.navigationBar addSubview: cancelButton];

Обычный способ сделать это - добавить эту кнопку отмены к элементу navigationItem каждого контроллера вида в вашем стеке навигации. Вышеупомянутый подход упрощает работу, позволяя вам писать меньше кода, но это крошечный бит взлома.

Ответ 8

Добавьте этот код в свой метод rootview viewDidLoad и реализуйте метод cancelMethod в контроллере rootview. Это будет доступно во всех контроллерах представления. вы можете отрегулировать положение кнопки, изменив рамку кнопки. Для изменения ориентации вы вручную отрегулируете положение кнопки.

 UIButton *btnCancel = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [btnCancel addTarget:self
                        action:@selector(cancelMethod)
              forControlEvents:UIControlEventTouchDown];
        [btnCancel setBackgroundImage:[UIImage imageNamed:@"image"]  
        forState:UIControlStateNormal];
        btnCancel.frame = CGRectMake(280, 27, 45, 25);

    [self.navigationController.view addSubview: btnCancel];