Làm cách nào để thêm một nút bên phải vào UINavestionControll?


191

Tôi đang cố gắng thêm nút làm mới vào thanh trên cùng của bộ điều khiển điều hướng nhưng không thành công.

Đây là tiêu đề:

@interface PropertyViewController : UINavigationController {

}

Đây là cách tôi đang cố gắng để thêm nó:

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

Câu trả lời:


362

Hãy thử làm điều đó trong viewDidLoad. Nói chung, bạn nên trì hoãn bất cứ điều gì bạn có thể cho đến thời điểm đó, khi UIViewControll được kích hoạt, nó vẫn có thể mất khá nhiều thời gian trước khi nó hiển thị, không cần phải làm việc sớm và buộc bộ nhớ.

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

Về lý do tại sao hiện tại nó không hoạt động, tôi không thể nói chắc chắn 100% mà không thấy nhiều mã hơn, nhưng có rất nhiều thứ xảy ra giữa init và tải chế độ xem và bạn có thể đang làm gì đó khiến điều hướngItem thiết lập lại giữa.


45
Tôi bạn đang làm điều này bên ngoài lớp con UINavestionControll, bạn sẽ tham khảo nó như thế này: someNavContoder.topLevelContoder.navlationItem.rightBarButtonItem = AnotherButton
ransomweaver

2
Tôi đã thực hiện giải pháp được đề xuất và ứng dụng của tôi liên tục bị lỗi cho đến khi tôi nhận ra rằng tên phương thức @selector phải kết thúc bằng dấu hai chấm (:).
Tàng hình

10
Ngay cả bên trong phương thức viewDidLoad của UINavestionContoller, tôi đã phải gọi nó như thếself.topViewController.navigationItem.leftBarButtonItem = nextButton;
Joseph

Cảm ơn! @Joseph, sự làm rõ của bạn đã cứu tôi. (y) :)
Prasanna

38

Hãy thử thêm nút vào navigationItem của trình điều khiển khung nhìn sẽ được đẩy lên PropertyViewControllerlớp này mà bạn đã tạo.

Đó là:

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

Bây giờ, nút thông tin này đã được tạo theo chương trình sẽ hiển thị trong thanh điều hướng. Ý tưởng là bộ điều khiển điều hướng lấy thông tin hiển thị của nó (tiêu đề, nút, v.v.) từ cái UIViewControllermà nó sắp hiển thị. Bạn không thực sự thêm các nút và như vậy trực tiếp vào UINavigationController.


2
Đặt quyềnBarButtonItem trực tiếp trên UINavestionControll không hoạt động đối với tôi (như đề xuất của Louis Gerbarg ở trên). Thay vào đó, đặt mục trực tiếp trên UIViewControll trong tay như Adem gợi ý đã hoạt động!
leviathan

4
+1 cho "Thử thêm nút vào điều hướng. Bộ điều khiển chế độ xem sẽ được đẩy" !
Kjuly

25

Có vẻ như một số người (như tôi) có thể đến đây để tìm cách thêm nút thanh điều hướng trong Trình tạo giao diện. Câu trả lời dưới đây cho thấy làm thế nào để làm điều đó.

Thêm Bộ điều khiển Điều hướng vào Bảng phân cảnh của bạn

Chọn Trình điều khiển xem của bạn và sau đó trong menu Xcode, chọn Trình chỉnh sửa> Nhúng vào> Trình điều khiển điều hướng .

nhập mô tả hình ảnh ở đây

Ngoài ra, bạn có thể thêm một UINavigationBartừ Thư viện đối tượng.

Thêm một mục nút thanh

Kéo a UIBarButtonItemtừ Thư viện đối tượng vào thanh điều hướng trên cùng.

nhập mô tả hình ảnh ở đây

Nó sẽ giống như thế này:

nhập mô tả hình ảnh ở đây

Đặt thuộc tính

Bạn có thể nhấp đúp vào "Mục" để thay đổi văn bản thành nội dung như "Làm mới", nhưng có một biểu tượng thực tế để Làm mới mà bạn có thể sử dụng. Chỉ cần chọn Trình theo dõi thuộc tính cho UIBarButtonItemvà cho Mục hệ thống, chọn Làm mới .

nhập mô tả hình ảnh ở đây

Điều đó sẽ cung cấp cho bạn biểu tượng Làm mới mặc định.

nhập mô tả hình ảnh ở đây

Thêm một hành động IB

Điều khiển kéo từ UIBarButtonItemBộ điều khiển xem để thêm @IBAction.

class ViewController: UIViewController {

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

Đó là nó.


Xin lỗi, tôi không thể làm theo những gì bạn nói. Hãy thử làm một câu hỏi mới với một hình ảnh minh họa những gì bạn đang nói. Sau đó thêm một liên kết đến nó ở đây.
Suragch

@Suragch, làm thế nào tôi có thể làm những điều tương tự với các tệp xib thay vì bảng phân cảnh? , cảm ơn
Cristian Chaparro A.

@CristianChaparroA. Thông thường các tệp xib dành cho các chế độ xem đơn và thanh điều hướng (lưu trữ các mục nút thanh) dành cho nhiều chế độ xem. Tôi chưa bao giờ sử dụng xib với các mục nút thanh. Bạn có thể thử hỏi một câu hỏi mới và sau đó liên kết với nó ở đây.
Suragch

14

Có một nút hệ thống mặc định cho "Làm mới":

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

Bạn có thể sử dụng điều này:

Mục tiêu-C

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

Nhanh

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

}

Ai đó có thể cho tôi biết có hại gì khi làm điều đó trong ViewWillAppear thay vì ViewDidLoad
Niranjan Molkeri

6

Đối với nhanh 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

Tôi sẽ khuyên bạn nên sử dụng bộ chọn swift2 mới: #selector (classname.feftname)
Emptyless

5

Đây là giải pháp trong Swift (đặt tùy chọn khi cần):

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

4

Tại sao bạn là lớp con UINavigationController? Không cần phải phân lớp nó nếu tất cả những gì bạn cần làm là thêm một nút vào nó.

Thiết lập cấu trúc phân cấp với một UINavigationControllerở trên cùng, sau đó trong viewDidLoad:phương thức của trình điều khiển xem gốc của bạn : thiết lập nút và gắn nó vào mục điều hướng bằng cách gọi

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];

1
Đó là một câu hỏi hay. Những gì tôi đang cố gắng thực sự là một mẫu thiết kế rất phổ biến, đó là một bộ điều khiển tab cơ bản với bộ điều khiển điều hướng cho mỗi tab. Nếu có một cách tốt hơn tôi sẽ mở cho các đề xuất. Có lẽ tôi cũng nên hỏi câu hỏi đó.
Artilheiro


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

Chỉ cần sử dụng navigationItem.rightBarButtonItem nếu bạn muốn nút bên phải
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

Hãy thử nó. Nó làm việc cho tôi.

Thanh điều hướng và cũng thêm hình ảnh nền vào nút bên phải.

 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

Bạn nên thêm barButtonItem vào - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animatedphương thức.


0

Chỉ cần sao chép và dán mã Objective-C này.

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

Tôi đang cố gắng giúp đỡ
Vivek

0

Sự cố này có thể xảy ra nếu chúng ta xóa trình điều khiển xem hoặc cố gắng thêm trình điều khiển chế độ xem mới bên trong trình tạo giao diện (main.storyboard). Để khắc phục sự cố này, nó yêu cầu thêm "Mục điều hướng" bên trong bộ điều khiển chế độ xem mới. Đôi khi, chúng tôi tạo màn hình bộ điều khiển chế độ xem mới và nó không tự động kết nối với "Mục điều hướng".

  1. Đi đến main.storyboard.
  2. Chọn điều khiển xem mới.
  3. Đi đến đề cương tài liệu.
  4. Kiểm tra xem nội dung điều khiển.
  5. Nếu bộ điều khiển chế độ xem mới không có mục Điều hướng thì hãy sao chép mục Điều hướng từ Bộ điều khiển Chế độ xem trước đó và dán vào bộ điều khiển chế độ xem mới.
  6. lưu và làm sạch dự án.

0

Ngoài ra, bạn có thể thêm nhiều nút bằng cách sử dụng 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: Nếu là dự án điều hướng, bạn có thể tạo BaseViewControll. Tất cả các chế độ xem khác sẽ kế thừa BaseView này. Trong BaseView, bạn có thể định nghĩa các phương thức chung để thêm nút phải hoặc thay đổi văn bản nút trái.

Ví dụ:

@interface BaseCont Bộ điều khiển: UIViewControll {

} - (void) setBackButtonCaption: (NSString *) chú thích;

(void) setRightButtonCaption: (NSString *) phụ đề chọn: (Sel) bộ chọn;

@end // Trong BaseView.M

(void) setBackButtonCaption: (NSString *) chú thích {

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

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

} - (void) setRightButtonCaption: (NSString *) phụ đề chọn: (Sel) bộ chọn {

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

rightButton.target= self;

[rightButton setAction:selector];

self.navigationItem.rightBarButtonItem= rightButton;

[rightButton release];

}

Và bây giờ trong bất kỳ chế độ xem tùy chỉnh nào, hãy thực hiện chế độ xem cơ sở này gọi các phương thức:

@interface Đăng nhập Xem: BaseContoder {

Trong một số phương thức gọi phương thức cơ sở là:

SEL sel = @selector (switchToForgotPIN);

[super setRightButtonCaption: @ "Quên mã PIN" selectot: sel];

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.