Добавить панель навигации в представление без контроллера навигации

У меня есть боковое меню, которое выдвигается для отображения табличного представления, и оттуда у меня есть сегменты, которые используют контроллер представления представления. Segue должен подключаться непосредственно к контроллеру вида; Я не могу использовать навигационный контроллер.

Как добавить панель навигации с элементом кнопки панели без контроллера навигации?

the story board has the navigation item

the app does not

Ответы

Ответ 1

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

-(void) viewWillAppear:(BOOL)animated {

    UINavigationBar *myNav = [[UINavigationBar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
    [UINavigationBar appearance].barTintColor = [UIColor lightGrayColor];
    [self.view addSubview:myNav];


    UIBarButtonItem *cancelItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel"
                                                                   style:UIBarButtonItemStyleBordered
                                                                  target:self
                                                                  action:nil];

    UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithTitle:@"Done"
                                                                 style:UIBarButtonItemStyleBordered
                                                                target:self action:nil];


    UINavigationItem *navigItem = [[UINavigationItem alloc] initWithTitle:@"Navigation Title"];
    navigItem.rightBarButtonItem = doneItem;
    navigItem.leftBarButtonItem = cancelItem;
    myNav.items = [NSArray arrayWithObjects: navigItem,nil];

    [UIBarButtonItem appearance].tintColor = [UIColor blueColor];
}

Итак, у вас есть белая панель навигации с элементами панели с голубым стержнем без навигационного контроллера. Опять же, есть и другие способы его реализации в вашем случае. Надеюсь, это было полезно.

Выход -

enter image description here

Обновить -

Чтобы добавить изображения -

UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(0,10,32,32)];
[myImage setImage:[UIImage imageNamed:@"image.png"]];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:myImage];
[self.view addSubview:myImage];

Ответ 2

Для этого используется способ NavigationItem в построителе интерфейса.

Сначала добавьте NavigationItem к вашему ViewController в построителе интерфейса, например, с NavigationController. Убедитесь, что символ NavigationBar отображается, выбрав что-то отличное от Inferred и None под имитированными метриками.

Во-вторых, в viewDidLoad просто добавьте следующие строки:

- (void)viewDidLoad 
{
    [super viewDidLoad];

    UINavigationBar *bar = [[UINavigationBar alloc] initWithFrame: frame];
    bar.items = @[self.navigationItem];
    [self.view addSubview: bar];
}

Что касается frame, width будет таким же, как ваш ViewController, а height будет либо 44.0, либо 64.0 в зависимости от того, будет ли отображаться status bar или нет.

CGFloat navigationBarHeight = 44.f + [UIApplication sharedApplication].statusBarFrame.size.height;
CGRect frame = CGRectMake(0, 0, self.view.frame.size.width, navigationBarHeight);

И если вы хотите поддерживать разные ориентации, используйте NSLayoutConstraints:

    CGFloat navigationBarHeight = 44.f + [UIApplication sharedApplication].statusBarFrame.size.height;
[self.view addConstraints: @[
    [NSLayoutConstraint constraintWithItem: self.view
                                 attribute: NSLayoutAttributeLeft
                                 relatedBy: NSLayoutRelationEqual
                                    toItem: bar
                                 attribute: NSLayoutAttributeLeft
                                multiplier: 1.0
                                  constant: 0.0],
    [NSLayoutConstraint constraintWithItem: self.view
                                 attribute: NSLayoutAttributeRight
                                 relatedBy: NSLayoutRelationEqual
                                    toItem: bar
                                 attribute: NSLayoutAttributeRight
                                multiplier: 1.0
                                  constant: 0.0],
    [NSLayoutConstraint constraintWithItem: self.view
                                 attribute: NSLayoutAttributeTop
                                 relatedBy: NSLayoutRelationEqual
                                    toItem: bar
                                 attribute: NSLayoutAttributeTop
                                multiplier: 1.0
                                  constant: 0.0],
    [NSLayoutConstraint constraintWithItem: bar
                                 attribute: NSLayoutAttributeHeight
                                 relatedBy: NSLayoutRelationEqual
                                    toItem: nil
                                 attribute: NSLayoutAttributeNotAnAttribute
                                multiplier: 1.0
                                  constant: navigationBarHeight],
                             ]];

Ответ 3

Версия Swift 4

 let navigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: 320, height: 50))
    navigationBar.barTintColor = UIColor.lightGray
    view.addSubview(navigationBar)

    let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: nil)
    let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: nil)

    let navigationItem = UINavigationItem(title: "Title")
    navigationItem.leftBarButtonItem = cancelButton
    navigationItem.rightBarButtonItem = doneButton

    navigationBar.items = [navigationItem]

Ответ 4

будьте очень осторожны при добавлении в viewWillAppear, так как этот метод может вызываться несколько раз (например, появляется модальное имя....), поэтому используйте ленивый подход:

1) объявить переменную:

var myNav: UINavigationBar?

2) проверить, если уже установлено:

viewWillAppear:(BOOL)animated {
if self.myNav != nil{
     return
}
self.myNav = ....

3) обязательно удалите выходной контроллер, например на didDisappear...

Ответ 5

будьте очень осторожны при добавлении в viewWillAppear, так как этот метод может вызываться несколько раз (например, появляется модальное имя....), поэтому используйте ленивый подход:

1) объявить переменную:

var myNav: UINavigationBar?

2) проверить, если уже установлено:

viewWillAppear:(BOOL)animated {
if self.myNav != nil{
     return
}
self.myNav = ....

3) обязательно удалите выходной контроллер, например на didDisappear...

обратите внимание.. не правильно указывать размер.. если iOS вращается, он не работает нормально..