Як додати праву кнопку до UINavigationController?


191

Я намагаюся додати кнопку оновлення до верхньої панелі навігаційного контролера без успіху.

Ось заголовок:

@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;
}

Відповіді:


362

Спробуйте це зробити в 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 та завантаженням перегляду, і ви, можливо, робите щось, що змушує скинути навігаційний навігатор у між.


45
Я це робите поза підкласом UINavigationController, ви б посилалися на це так: someNavController.topLevelController.navigationItem.rightBarButtonItem = anotherButton
ransomweaver

2
Я реалізовував запропоноване рішення, і моє додаток постійно виходило з ладу, поки я не зрозумів, що назва методу @selector має закінчуватися двокрапкою (:).
Стелс

10
Навіть усередині методу перегляду UINavigationContollerDidLoad мені довелося називати це такself.topViewController.navigationItem.leftBarButtonItem = nextButton;
Джозеф

Дякую! @ Джозефе, твоє уточнення врятувало мене. (у) :)
Прасанна

38

Спробуйте додати кнопку до навігаційного елемента контролера перегляду, який буде натиснуто на цей 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.


2
Встановити rightBarButtonItem безпосередньо на UINavigationController для мене не вийшло (як запропонував Луї Гербарг вище). Замість того, щоб встановити елемент безпосередньо на UIViewController під рукою, як пропонує Adem!
левіафан

4
+1 для "Спробуйте додати кнопку до навігаційного елемента контролера перегляду, який буде натиснуто" !
Кюли

25

Складається враження, що деякі люди (як я) можуть завітати сюди, шукаючи, як додати кнопку панелі навігації у програмі Interface Builder. Відповідь нижче показує, як це зробити.

Додайте навігаційний контролер до вашої дошки розгортки

Виберіть контролер перегляду, а потім у меню Xcode виберіть Редактор> Вставити> Контролер навігації .

введіть тут опис зображення

Крім того, ви можете додати UINavigationBarз бібліотеки об'єктів.

Додайте елемент кнопки смуги

Перетягніть a UIBarButtonItemз бібліотеки об’єктів до верхньої панелі навігації.

введіть тут опис зображення

Це повинно виглядати так:

введіть тут опис зображення

Встановити атрибути

Ви можете двічі клацнути "Елемент", щоб змінити текст на щось на зразок "Оновити", але є актуальна піктограма для оновлення, яку ви можете використовувати. Просто виберіть Інспектор атрибутів для UIBarButtonItemі для елемента системи виберіть Оновити .

введіть тут опис зображення

Це дасть вам значок оновлення за замовчуванням.

введіть тут опис зображення

Додайте ІБ дії

Перемістіть курсор з перемикача на UIBarButtonItemна Контролер перегляду, щоб додати його @IBAction.

class ViewController: UIViewController {

    @IBAction func refreshBarButtonItemTap(sender: UIBarButtonItem) {
        
        print("How refreshing!")
    }
    
}

Це воно.


Вибачте, я не можу повністю слідкувати за тим, про що ти говориш. Спробуйте скласти нове запитання із зображенням, що ілюструє те, про що ви говорите. Потім додайте тут посилання.
Сурагч

@Suragch, як я можу робити те саме, що й з файлами xib замість розкадрів? , дякую
Крістіан Чапаро А.

@CristianChaparroA. Зазвичай файли xib призначені для одиничних представлень, а навігаційна панель (на якій розміщені елементи кнопки панелі) - для декількох переглядів. Я ніколи не використовував xib з елементами панелі кнопок. Ви можете спробувати задати нове запитання, а потім посилання на нього тут.
Сурагч

14

Існує системна кнопка за замовчуванням для "Оновити":

- (void)viewDidLoad {
    [super viewDidLoad];

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

}

- (IBAction)refreshClicked:(id)sender {

}

11

Ви можете використовувати це:

Ціль-С

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

Швидкий

let rightSideOptionButton = UIBarButtonItem()
rightSideOptionButton.title = "Right"
self.navigationItem.rightBarButtonItem = rightSideOptionButton

6
-(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];

}

Хтось може сказати мені, чи є шкода робити це у ViewWillAppear замість ViewDidLoad
Ніранджан Молкері

6

Для швидкого 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

Я б порекомендував використовувати новий селектор swift2: #selector (classname.functionname)
Порожній

5

Ось рішення в Swift (встановіть параметри, якщо потрібно):

var optionButton = UIBarButtonItem()
optionButton.title = "Settings"
//optionButton.action = something (put your action here)
self.navigationItem.rightBarButtonItem = optionButton

4

Чому ви підкласи UINavigationController ? Не потрібно підкласирувати його, якщо все, що вам потрібно зробити, це додати до нього кнопку.

Налаштуйте ієрархію з а UINavigationControllerвгорі, а потім у viewDidLoad:методі контролера кореневого перегляду : встановіть кнопку та приєднайте її до елемента навігації, зателефонувавши

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];

1
Це гарне запитання. Те, що я намагаюся зробити, насправді є дуже поширеною схемою дизайну, яка є базовим контролером вкладок з контролером навігації для кожної вкладки. Якщо є кращий спосіб, я відкритий для пропозицій. Можливо, і я повинен поставити це питання.
Артілхайро


3

Швидкий 4:

override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "tap me", style: .plain, target: self, action: #selector(onButtonTap))
}

@objc func onButtonTap() {
    print("you tapped me !?")
}

Просто скористайтесь навігаційнимItem.rightBarButtonItem, якщо вам потрібна кнопка праворуч
Ghanshyam Bagul

2
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 110, 50)];
view.backgroundColor = [UIColor clearColor];

UIButton *settingsButton =  [UIButton buttonWithType:UIButtonTypeCustom];
[settingsButton setImage:[UIImage imageNamed:@"settings_icon_png.png"] forState:UIControlStateNormal];
[settingsButton addTarget:self action:@selector(logOutClicked) forControlEvents:UIControlEventTouchUpInside];
[settingsButton setFrame:CGRectMake(40,5,32,32)];
[view addSubview:settingsButton];

UIButton *filterButton =  [UIButton buttonWithType:UIButtonTypeCustom];
[filterButton setImage:[UIImage imageNamed:@"filter.png"] forState:UIControlStateNormal];
[filterButton addTarget:self action:@selector(openActionSheet) forControlEvents:UIControlEventTouchUpInside];
[filterButton setFrame:CGRectMake(80,5,32,32)];
[view addSubview:filterButton];



self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:view];

2

Спробуйте це. Це працює для мене.

Навігаційна панель, а також додано фонове зображення до правої кнопки.

 UIBarButtonItem *Savebtn=[[UIBarButtonItem alloc]initWithImage:[[UIImage    
 imageNamed:@"bt_save.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] 
 style:UIBarButtonItemStylePlain target:self action:@selector(SaveButtonClicked)];
 self.navigationItem.rightBarButtonItem=Savebtn;

0
    UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add:)];
self.navigationItem.rightBarButtonItem = rightBarButtonItem;

0
- (void)viewWillAppear:(BOOL)animated
{    
    [self setDetailViewNavigationBar];    
}
-(void)setDetailViewNavigationBar
{
    self.navigationController.navigationBar.tintColor = [UIColor purpleColor];
    [self setNavigationBarRightButton];
    [self setNavigationBarBackButton];    
}
-(void)setNavigationBarBackButton// using custom button 
{
   UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@"  Back " style:UIBarButtonItemStylePlain target:self action:@selector(onClickLeftButton:)];          
   self.navigationItem.leftBarButtonItem = leftButton;    
}
- (void)onClickLeftButton:(id)sender 
{
   NSLog(@"onClickLeftButton");        
}
-(void)setNavigationBarRightButton
{

  UIBarButtonItem *anotherButton = [[UIBarButtonItem alloc] initWithTitle:@"Show" style:UIBarButtonItemStylePlain target:self action:@selector(onClickrighttButton:)];          
self.navigationItem.rightBarButtonItem = anotherButton;   

}
- (void)onClickrighttButton:(id)sender 
{
   NSLog(@"onClickrighttButton");  
}

0
    self.navigationItem.rightBarButtonItem =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshData)];



}

-(void)refreshData{
    progressHud= [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
    [progressHud setLabelText:@"拼命加载中..."];
    [self loadNetwork];
}

0

Ви повинні додати свій barButtonItem у - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animatedметоді.


0

Просто скопіюйте та вставте цей код Objective-C.

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self addRightBarButtonItem];
}
- (void) addRightBarButtonItem {
    UIButton *btnAddContact = [UIButton buttonWithType:UIButtonTypeContactAdd];
    [btnAddContact addTarget:self action:@selector(addCustomerPressed:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *barButton = [[UIBarButtonItem alloc] initWithCustomView:btnAddContact];
    self.navigationItem.rightBarButtonItem = barButton;
}

#pragma mark - UIButton
- (IBAction)addCustomerPressed:(id)sender {
// Your right button pressed event
}

Я намагаюся допомогти
Vivek

0

Ця проблема може виникнути, якщо ми видалимо контролер перегляду або спробуємо додати новий контролер перегляду всередині конструктора інтерфейсів (main.storyboard). Щоб виправити цю проблему, потрібно додати "Навігаційний елемент" до нового контролера перегляду. Іноді трапляється, що ми створюємо новий екран контролера перегляду, і він не підключається до "Навігаційного елемента" автоматично.

  1. Перейдіть на сторінку main.storyboard.
  2. Виберіть цей новий контролер подання.
  3. Перейдіть до контуру документа.
  4. Перевірте вміст контролера.
  5. Якщо у нового контролера перегляду немає елемента навігації, скопіюйте елемент навігації з попереднього контролера перегляду та вставте його в новий контролер перегляду.
  6. зберегти та очистити проект.

0

Також ви можете додати кілька кнопок за допомогою rightBarButtonItems

-(void)viewDidLoad{

    UIBarButtonItem *button1 = [[UIBarButtonItem alloc] initWithTitle:@"button 1" style:UIBarButtonItemStylePlain target:self action:@selector(YOUR_METHOD1:)];
    UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithTitle:@"button 2" style:UIBarButtonItemStylePlain target:self action:@selector(YOUR_METHOD2:)];

    self.navigationItem.rightBarButtonItems = @[button1, button2];
}

-1

@Artilheiro: Якщо його проект на базі навігації, ви можете створити BaseViewController. Усі інші представлення успадкують цей BaseView. У BaseView u можна визначити загальні методи додати праву кнопку або змінити текст лівої кнопки.

колишній:

@interface BaseController: UIViewController {

} - (void) setBackButtonCaption: підпис (NSString *);

(недійсний) setRightButtonCaption: (NSString *) підпис заголовка: (SEL) селектор;

@end // In BaseView.M

(недійсна) setBackButtonCaption: (NSString *) підпис {

UIBarButtonItem *backButton =[[UIBarButtonItem alloc] init];

backButton.title= caption;
self.navigationItem.backBarButtonItem = backButton;
[backButton release];

} - (недійсний) setRightButtonCaption: (NSString *) підпис заголовка: (вибір SEL) {

  UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] init];
rightButton.title = caption;

rightButton.target= self;

[rightButton setAction:selector];

self.navigationItem.rightBarButtonItem= rightButton;

[rightButton release];

}

А тепер у будь-якому власному представленні реалізуйте цей базовий вигляд виклику методів:

@interface LoginView: BaseController {

У деяких методах виклику базовий метод як:

SEL sel = @selector (switchToForgotPIN);

[супер setRightButtonCaption: @ "забутий PIN" selectot: sel];

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.