Как добавить правую кнопку в UINavigationController? - PullRequest
190 голосов
/ 03 августа 2009

Я пытаюсь добавить кнопку обновления в верхнюю панель контроллера навигации, но безуспешно.

Вот заголовок:

@interface PropertyViewController : UINavigationController {

}

Вот как я пытаюсь это добавить:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain
                                          target:self action:@selector(refreshPropertyList:)];      
        self.navigationItem.rightBarButtonItem = anotherButton;
    }
    return self;
}

Ответы [ 22 ]

361 голосов
/ 03 августа 2009

Попробуйте сделать это в viewDidLoad. Как правило, в любом случае вам следует отложить все, что вы можете, до этого момента, когда UIViewController включается, может пройти довольно много времени, прежде чем он отобразится, нет смысла делать работу раньше и связывать память.

- (void)viewDidLoad {
  [super viewDidLoad];

  UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)];          
  self.navigationItem.rightBarButtonItem = anotherButton;
  // exclude the following in ARC projects...
  [anotherButton release];
}

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

37 голосов
/ 12 декабря 2009

Попробуйте добавить кнопку в навигационный элемент контроллера представления, который будет помещен в созданный вами класс PropertyViewController.

То есть:

MainViewController *vc = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
[infoButton addTarget:self action:@selector(showInfo) forControlEvents:UIControlEventTouchUpInside];
vc.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:infoButton] autorelease];

PropertyViewController *navController = [[PropertyViewController alloc] initWithRootViewController:vc];

Теперь эта информационная кнопка, созданная программно, будет отображаться на панели навигации. Идея состоит в том, что навигационный контроллер получает информацию об отображении (название, кнопки и т. Д.) С UIViewController, который он собирается отобразить. Вы на самом деле не добавляете кнопки и тому подобное прямо в UINavigationController.

24 голосов
/ 12 ноября 2015

Кажется, что некоторые люди (как я) могут прийти сюда в поисках того, как добавить кнопку панели навигации в Интерфейсном Разработчике. Ответ ниже показывает, как это сделать.

Добавьте навигационный контроллер на раскадровку

Выберите ваш View Controller, а затем в меню Xcode выберите Editor> Embed In> Navigation Controller .

enter image description here

Кроме того, вы можете добавить UINavigationBar из библиотеки объектов.

Добавить пуговицу

Перетащите UIBarButtonItem из библиотеки объектов на верхнюю панель навигации.

enter image description here

Это должно выглядеть так:

enter image description here

Установить атрибуты

Вы можете дважды щелкнуть «Элемент», чтобы изменить текст на что-то вроде «Обновить», но есть фактический значок для Обновить , который вы можете использовать. Просто выберите Инспектор атрибутов для UIBarButtonItem и для Системный элемент выберите Обновить .

enter image description here

Это даст вам значок обновления по умолчанию.

enter image description here

Добавить действие IB

Управляйте перетаскиванием из UIBarButtonItem в View Controller, чтобы добавить @IBAction.

class ViewController: UIViewController {

    @IBAction func refreshBarButtonItemTap(sender: UIBarButtonItem) {

        print("How refreshing!")
    }

}

Вот и все.

13 голосов
/ 27 сентября 2012

Существует системная кнопка по умолчанию для «Обновить»:

- (void)viewDidLoad {
    [super viewDidLoad];

    UIBarButtonItem *refreshButton = [[[UIBarButtonItem alloc] 
                            initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
                            target:self action:@selector(refreshClicked:)] autorelease];
    self.navigationItem.rightBarButtonItem = refreshButton;

}

- (IBAction)refreshClicked:(id)sender {

}
10 голосов
/ 24 июля 2013

Вы можете использовать это:

Objective-C

UIBarButtonItem *rightSideOptionButton = [[UIBarButtonItem alloc] initWithTitle:@"Right" style:UIBarButtonItemStylePlain target:self action:@selector(rightSideOptionButtonClicked:)];          
self.navigationItem.rightBarButtonItem = rightSideOptionButton;

Swift

let rightSideOptionButton = UIBarButtonItem()
rightSideOptionButton.title = "Right"
self.navigationItem.rightBarButtonItem = rightSideOptionButton
6 голосов
/ 19 мая 2014
-(void) viewWillAppear:(BOOL)animated
{

    UIButton *btnRight = [UIButton buttonWithType:UIButtonTypeCustom];
    [btnRight setFrame:CGRectMake(0, 0, 30, 44)];
    [btnRight setImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];
    [btnRight addTarget:self action:@selector(saveData) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *barBtnRight = [[UIBarButtonItem alloc] initWithCustomView:btnRight];
    [barBtnRight setTintColor:[UIColor whiteColor]];
    [[[self tabBarController] navigationItem] setRightBarButtonItem:barBtnRight];

}
6 голосов
/ 03 мая 2016

Для Swift 2:

self.title = "Your Title"

var homeButton : UIBarButtonItem = UIBarButtonItem(title: "LeftButtonTitle", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("yourMethod"))

var logButton : UIBarButtonItem = UIBarButtonItem(title: "RigthButtonTitle", style: UIBarButtonItemStyle.Plain, target: self, action: Selector("yourMethod"))

self.navigationItem.leftBarButtonItem = homeButton
self.navigationItem.rightBarButtonItem = logButton
5 голосов
/ 20 июня 2015

Вот решение в Swift (установите необходимые параметры):

var optionButton = UIBarButtonItem()
optionButton.title = "Settings"
//optionButton.action = something (put your action here)
self.navigationItem.rightBarButtonItem = optionButton
4 голосов
/ 10 декабря 2016

Вы можете попробовать

self.navigationBar.topItem.rightBarButtonItem = anotherButton;
4 голосов
/ 03 августа 2009

Почему вы подклассы UINavigationController? Нет необходимости создавать его подкласс, если все, что вам нужно сделать, это добавить к нему кнопку.

Установите иерархию с UINavigationController вверху, а затем в методе viewDidLoad: вашего корневого контроллера: установите кнопку и присоедините ее к элементу навигации, вызвав

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];
...