Bagaimana cara menambahkan tombol kanan ke UINavigationController?

191

Saya mencoba menambahkan tombol segarkan ke bilah atas pengendali navigasi tanpa hasil.

Inilah tajuknya:

@interface PropertyViewController : UINavigationController {

}

Inilah cara saya mencoba menambahkannya:

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

Jawaban:

362

Coba lakukan di viewDidLoad. Secara umum Anda harus menunda apa pun yang dapat Anda lakukan sampai saat itu, ketika sebuah UIViewController dinyalakan, mungkin masih cukup lama sebelum ditampilkan, tidak ada gunanya melakukan pekerjaan lebih awal dan mengikat memori.

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

Mengenai mengapa itu tidak berfungsi saat ini, saya tidak bisa mengatakan dengan kepastian 100% tanpa melihat lebih banyak kode, tetapi banyak hal terjadi antara init dan pemuatan tampilan, dan Anda mungkin melakukan sesuatu yang menyebabkan navigasiItem diatur ulang di antara.

Louis Gerbarg
sumber
45
Saya Anda melakukan ini di luar subkelas UINavigationController, Anda akan menyebutnya seperti ini: someNavController.topLevelController.navigationItem.rightBarButtonItem = anotherButton
ransomweaver
2
Saya menerapkan solusi yang disarankan dan aplikasi saya terus macet sampai saya menyadari bahwa nama metode @selector harus diakhiri dengan titik dua (:).
Stealth
10
Bahkan di dalam metode viewDidLoad UINavigationContoller, saya harus menyebutnya sepertiself.topViewController.navigationItem.leftBarButtonItem = nextButton;
Joseph
Terima kasih! @ Joseph, Klarifikasi Anda menyelamatkan saya. (y) :)
Prasanna
38

Coba tambahkan tombol ke item navigation dari pengontrol tampilan yang akan didorong ke PropertyViewControllerkelas ini yang telah Anda buat.

Itu adalah:

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

Sekarang, infoTombol ini yang telah dibuat secara pemrograman akan muncul di bilah navigasi. Idenya adalah bahwa pengontrol navigasi mengambil informasi tampilan (judul, tombol, dll) dari UIViewControlleryang akan ditampilkan. Anda tidak benar-benar menambahkan tombol dan semacamnya langsung ke UINavigationController.

Adam
sumber
2
Mengatur rightBarButtonItem langsung di UINavigationController tidak bekerja untuk saya (seperti yang diusulkan oleh Louis Gerbarg di atas). Alih-alih mengatur item langsung pada UIViewController yang ada di tangan seperti yang disarankan Adem!
leviathan
4
+1 untuk "Coba tambahkan tombol ke item navigasi pengontrol tampilan yang akan didorong" !
Kjuly
25

Tampaknya beberapa orang (seperti saya) mungkin datang ke sini mencari cara menambahkan tombol bilah navigasi di Interface Builder. Jawaban di bawah ini menunjukkan cara melakukannya.

Tambahkan Pengontrol Navigasi ke Storyboard Anda

Pilih View Controller Anda dan kemudian di menu Xcode pilih Editor> Embed In> Navigation Controller .

masukkan deskripsi gambar di sini

Atau, Anda bisa menambahkan UINavigationBardari Perpustakaan Objek.

Tambahkan Item Tombol Bar

Seret UIBarButtonItemdari Perpustakaan Objek ke bilah navigasi atas.

masukkan deskripsi gambar di sini

Seharusnya terlihat seperti ini:

masukkan deskripsi gambar di sini

Atur Atribut

Anda bisa mengklik dua kali "Item" untuk mengubah teks menjadi sesuatu seperti "Refresh", tetapi ada ikon aktual untuk Refresh yang dapat Anda gunakan. Cukup pilih Inspektur Atribut untuk UIBarButtonItemdan untuk Item Sistem pilih Refresh .

masukkan deskripsi gambar di sini

Itu akan memberi Anda ikon Segarkan bawaan.

masukkan deskripsi gambar di sini

Tambahkan Aksi IB

Kendalikan kontrol dari UIBarButtonItemke View Controller untuk menambahkan @IBAction.

class ViewController: UIViewController {

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

Itu dia.

Suragch
sumber
Maaf, saya tidak bisa mengikuti apa yang Anda bicarakan. Coba buat pertanyaan baru dengan gambar yang menggambarkan apa yang Anda bicarakan. Kemudian tambahkan tautan ke sini.
Suragch
@ Suragch, bagaimana saya bisa melakukan hal yang sama dengan file xib, bukan storyboard? , terima kasih
Cristian Chaparro A.
@CristianChaparroA. Biasanya file xib adalah untuk tampilan tunggal dan bilah navigasi (yang menampung item tombol bilah) adalah untuk banyak tampilan. Saya tidak pernah menggunakan xib dengan item tombol bar. Anda dapat mencoba mengajukan pertanyaan baru dan kemudian menautkannya di sini.
Suragch
14

Ada tombol sistem default untuk "Refresh":

- (void)viewDidLoad {
    [super viewDidLoad];

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

}

- (IBAction)refreshClicked:(id)sender {

}
Manni
sumber
11

Anda bisa menggunakan ini:

Objektif-C

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

Cepat

let rightSideOptionButton = UIBarButtonItem()
rightSideOptionButton.title = "Right"
self.navigationItem.rightBarButtonItem = rightSideOptionButton
Vandit Mehta
sumber
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];

}
Gaurav Gilani
sumber
Adakah yang bisa memberitahu saya apakah ada salahnya melakukannya di ViewWillAppear, bukan ViewDidLoad
Niranjan Molkeri
6

Untuk 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
fandro
sumber
Saya akan merekomendasikan menggunakan pemilih swift2 baru: #selector (classname.functionname)
Emptyless
5

Inilah solusi di Swift (tetapkan opsi sesuai kebutuhan):

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

Mengapa Anda subkelas UINavigationController? Tidak perlu mensubklasifikasikannya jika yang perlu Anda lakukan hanyalah menambahkan tombol.

Siapkan hierarki dengan a UINavigationControllerdi atas, dan kemudian dalam viewDidLoad:metode pengontrol tampilan root Anda : atur tombol dan lampirkan ke item navigasi dengan memanggil

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];
Jasarien
sumber
1
Itu pertanyaan yang bagus. Apa yang saya coba lakukan sebenarnya adalah pola desain yang sangat umum, yang merupakan pengendali tab dasar dengan pengontrol navigasi untuk setiap tab. Jika ada cara yang lebih baik saya terbuka untuk saran. Mungkin saya harus menanyakan pertanyaan itu juga.
Artilheiro
4

Anda dapat mencoba

self.navigationBar.topItem.rightBarButtonItem = anotherButton;
pengguna2999133
sumber
Bekerja seperti pesona :)
Saurabh Bhatia
3

Swift 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 !?")
}
ergunkocak
sumber
Cukup gunakan navigationItem.rightBarButtonItem jika Anda ingin tombol sisi kanan
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];
Sandeep
sumber
2

Coba ini. Ini bekerja untuk saya.

Bilah navigasi dan juga menambahkan gambar latar belakang ke tombol kanan.

 UIBarButtonItem *Savebtn=[[UIBarButtonItem alloc]initWithImage:[[UIImage    
 imageNamed:@"bt_save.png"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] 
 style:UIBarButtonItemStylePlain target:self action:@selector(SaveButtonClicked)];
 self.navigationItem.rightBarButtonItem=Savebtn;
Jaywant Khedkar
sumber
0
    UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add:)];
self.navigationItem.rightBarButtonItem = rightBarButtonItem;
Mahesh Aswathanarayana
sumber
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");  
}
tv.ashvin
sumber
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];
}
Gank
sumber
0

Anda harus menambahkan - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animatedmetode barButtonItem Anda .

Retik
sumber
0

Cukup salin dan tempel kode Objective-C ini.

- (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
sumber
Saya mencoba membantu
Vivek
0

Masalah ini dapat terjadi jika kami menghapus controller tampilan atau mencoba untuk menambahkan controller tampilan baru di dalam pembangun antarmuka (main.storyboard). Untuk memperbaiki masalah ini, perlu menambahkan "Item Navigasi" di dalam pengontrol tampilan baru. Terkadang kami membuat layar pengontrol tampilan baru dan itu tidak terhubung ke "Item Navigasi" secara otomatis.

  1. Pergi ke main.storyboard.
  2. Pilih Pengontrol tampilan baru.
  3. Pergi ke garis besar dokumen.
  4. Periksa tampilan konten Pengendali.
  5. Jika pengontrol tampilan baru tidak memiliki item Navigasi, salin item Navigasi dari Pengontrol Tampilan sebelumnya dan tempel ke pengontrol tampilan baru.
  6. simpan dan bersihkan proyek.
NilamK
sumber
0

Anda juga dapat menambahkan beberapa tombol menggunakan 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];
}
yoAlex5
sumber
-1

@ Artilheiro: Jika ini adalah proyek berbasis navigasi, Anda dapat membuat BaseViewController. Semua tampilan lain akan mewarisi BaseView ini. Di BaseView, Anda dapat menentukan metode umum untuk menambahkan tombol kanan atau mengubah teks tombol kiri.

ex:

@interface BaseController: UIViewController {

} - (void) setBackButtonCaption: (NSString *) caption;

(void) setRightButtonCaption: (NSString *) pemilih teks: (SEL) pemilih;

@end // Di BaseView.M

(void) setBackButtonCaption: (NSString *) caption {

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

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

} - (void) setRightButtonCaption: (NSString *) selectot caption: (SEL) pemilih {

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

rightButton.target= self;

[rightButton setAction:selector];

self.navigationItem.rightBarButtonItem= rightButton;

[rightButton release];

}

Dan sekarang di setiap tampilan kustom, terapkan tampilan dasar ini memanggil metode:

@interface LoginView: BaseController {

Dalam beberapa metode metode panggilan dasar seperti:

SEL SEL = @selector (switchToForgotPIN);

[super setRightButtonCaption: @ "Forgot PIN" selectot: sel];

iPhoneDev
sumber