UINavigationController'a sağ düğme nasıl eklenir?


191

Başarısız bir gezinme denetleyicisinin üst çubuğuna bir yenileme düğmesi eklemeye çalışıyorum.

İşte başlık:

@interface PropertyViewController : UINavigationController {

}

İşte nasıl eklemek çalışıyorum:

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

Yanıtlar:


362

ViewDidLoad içinde yapmayı deneyin. Genellikle bu noktaya kadar yapabileceğiniz her şeyi ertelemelisiniz, bir UIViewController başlatıldığında, görüntülenmeden önce hala biraz zaman alabilir, erken iş yapmanın ve belleği bağlamanın anlamı yoktur.

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

Neden şu anda çalışmıyor, daha fazla kod görmeden% 100 kesinlik ile söyleyemem, ancak init ve görünüm yükleme arasında bir sürü şey olur ve navigasyon öğesinin sıfırlanmasına neden olan bir şey yapıyor olabilirsiniz. arasında.


45
Bunu UINavigationController alt sınıfının dışında yapıyorsunuz, şöyle ifade edersiniz: someNavController.topLevelController.navigationItem.rightBarButtonItem = anotherButton
ransomweaver

2
Önerilen çözümü uyguluyordum ve @selector yöntem adının iki nokta üst üste (:) ile bitmesi gerektiğini fark edene kadar uygulamam kilitlenmeye devam etti.
Stealth

10
Bir UINavigationContoller'ın viewDidLoad yönteminin içinde bile, şöyle demeliydimself.topViewController.navigationItem.leftBarButtonItem = nextButton;
Joseph

Teşekkürler! @Joseph, Açıklaman beni kurtardı. (y) :)
Prasanna

38

Düğmeyi PropertyViewController, oluşturduğunuz bu sınıfa aktarılacak olan görünüm denetleyicisinin navigationItem öğesine eklemeyi deneyin .

Yani:

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

Şimdi, programlı olarak oluşturulan bu infoButton gezinme çubuğunda görünecektir. Buradaki fikir, navigasyon denetleyicisinin ekran bilgilerini (başlık, düğmeler vb.) Görüntülenmek üzere olduğu bilgiden UIViewControlleralmasıdır. Aslında doğrudan düğmelere vb. Eklemezsiniz UINavigationController.


2
RightBarButtonItem öğesini doğrudan UINavigationController üzerinde ayarlamak benim için çalışmadı (yukarıda Louis Gerbarg tarafından önerildiği gibi). Bunun yerine, öğeyi doğrudan Adem'in önerdiği gibi UIViewController'a ayarlamak işe yaradı!
Leviathan

4
+1 için "Düğmeyi gezinmeye yönlendirilecek görünüm denetleyicisinin öğesine eklemeyi deneyin" !
Kjuly

25

Görünüşe göre bazı insanlar (benim gibi), Interface Builder'a nasıl bir gezinme çubuğu düğmesi ekleneceğini arıyor olabilir. Aşağıdaki cevap nasıl yapılacağını göstermektedir.

Film Şeridinize Gezinti Denetleyicisi Ekleme

Görünüm Denetleyicinizi seçin ve ardından Xcode menüsünde Editör> Yerleştir> Gezinti Denetleyici'yi seçin .

resim açıklamasını buraya girin

Alternatif olarak, UINavigationBarNesne Kitaplığı'ndan bir ekleyebilirsiniz .

Çubuk Düğme Öğesi Ekleme

A UIBarButtonItemNesne Kitaplığı'ndan üst gezinme çubuğuna sürükleyin .

resim açıklamasını buraya girin

Şöyle görünmelidir:

resim açıklamasını buraya girin

Öznitelikleri Ayarlama

Metni "Yenile" gibi bir şeye değiştirmek için "Öğe" yi çift tıklayabilirsiniz, ancak Yenile için kullanabileceğiniz gerçek bir simge vardır . Bunun için Özellik Denetçisini seçin UIBarButtonItemve Sistem Öğesi için Yenile'yi seçin .

resim açıklamasını buraya girin

Bu size varsayılan Yenile simgesini verecektir.

resim açıklamasını buraya girin

IB Eylemi Ekleme

Kontrol UIBarButtonItemeklemek için Görünüm Denetleyicisine sürükleyin @IBAction.

class ViewController: UIViewController {

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

Bu kadar.


Üzgünüm, bahsettiğin şeyi tam olarak takip edemiyorum. Ne hakkında konuştuğunuzu gösteren bir resimle yeni bir soru sormayı deneyin. Ardından buraya bir bağlantı ekleyin.
16'da Suragch

@Suragch, film şeridi yerine xib dosyalarıyla aynı şeyleri nasıl yapabilirim? , teşekkürler
Cristian Chaparro A.

@CristianChaparroA. Xib dosyaları genellikle tek görünümler içindir ve gezinme çubuğu (çubuk düğmesi öğelerini barındıran) birden çok görünüm içindir. Çubuk düğme öğeleriyle hiç xib kullanmadım. Yeni bir soru sormayı deneyebilir ve daha sonra buradan bağlantı kurabilirsiniz.
Mart'ta Suragch

14

"Yenile" için varsayılan bir sistem düğmesi vardır:

- (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

Bunu kullanabilirsiniz:

Objective-C

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

hızlı

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

}

Herkes bana ViewDidLoad yerine ViewWillAppear bunu yaparken herhangi bir zarar olduğunu söyleyebilir
Niranjan Molkeri

6

Hızlı 2 için:

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

Yeni swift2 seçicisini kullanmanızı öneririm: #selector (classname.functionname)
Emptyless

5

Swift'teki çözüm (seçenekleri gerektiği gibi ayarlayın):

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

4

Neden alt sınıftasın UINavigationController? Yapmanız gereken tek şey bir düğme eklemekse alt sınıflamaya gerek yoktur.

UINavigationControllerÜstte bir ile bir hiyerarşi ayarlayın ve ardından kök görünüm denetleyicinizin viewDidLoad:yönteminde: düğmeyi ayarlayın ve arayarak gezinme öğesine ekleyin

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];

1
Bu iyi bir soru. Ne yapmaya çalışıyorum aslında her sekme için bir gezinme denetleyicisi ile temel bir sekme denetleyicisi olan çok yaygın bir tasarım deseni olduğunu. Daha iyi bir yol varsa önerilere açığım. Belki de bu soruyu sormalıyım.
Artilheiro


3

Hızlı 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 !?")
}

Sağ taraftaki düğmeyi istiyorsanız, navigationItem.rightBarButtonItem öğesini kullanın
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

Bunu dene, benim için çalışıyor.

Gezinme çubuğu ve ayrıca sağ düğmeye arka plan resmi ekledi.

 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 öğenizi - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animatedyönteme eklemeniz gerekir .


0

Bu Objective-C kodunu kopyalayıp yapıştırmanız yeterlidir.

- (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
}

Yardım etmeye çalışıyorum
Vivek

0

Bu sorun, görünüm denetleyicisini silersek veya arabirim oluşturucuya (main.storyboard) yeni görünüm denetleyicisi eklemeye çalışırsak oluşabilir. Bu sorunu gidermek için yeni görünüm denetleyicisine "Gezinme Öğesi" eklenmesi gerekir. Bazen yeni bir görünüm denetleyicisi ekranı oluşturur ve otomatik olarak "Gezinme Öğesi" ne bağlanmaz.

  1. Ana panoya gidin.
  2. Yeni görünüm Denetleyicisini seçin.
  3. Belge ana hattına gidin.
  4. Görünüm Denetleyici içeriğini kontrol edin.
  5. Yeni görünüm denetleyicisinin bir Gezinme öğesi yoksa, önceki Görünüm Denetleyicisinden Gezinme öğesini kopyalayın ve yeni görünüm denetleyicisine yapıştırın.
  6. projeyi kaydedin ve temizleyin.

0

Ayrıca kullanarak birden fazla düğme ekleyebilirsiniz 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: Gezinme tabanlı bir proje ise, BaseViewController oluşturabilirsiniz. Diğer tüm görünümler bu BaseView'i devralır. BaseView'da u sağ düğme eklemek veya sol düğme metnini değiştirmek için genel yöntemler tanımlayabilir.

örn:

@interface BaseController: UIViewController {

} - (geçersiz) setBackButtonCaption: (NSString *) başlık;

(void) setRightButtonCaption: (NSString *) altyazı seçimi: (SEL) seçici;

@end // BaseView.M'de

(void) setBackButtonCaption: (NSString *) başlık {

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

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

} - (geçersiz) setRightButtonCaption: (NSString *) altyazı seçimi: (SEL) seçici {

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

rightButton.target= self;

[rightButton setAction:selector];

self.navigationItem.rightBarButtonItem= rightButton;

[rightButton release];

}

Ve şimdi herhangi bir özel görünümde, bu temel görünümü uygulamak yöntemleri çağırmak:

@interface LoginView: BaseController {

Bazı yöntemlerde temel yöntemi şu şekilde çağırın:

SEL sel = @selektör (switchToForgotPIN);

[super setRightButtonCaption: @ "PIN'i Unuttum" seçimi: sel];

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.