Làm cách nào để thêm 2 nút vào UINavigationbar ở phía bên phải mà không cần IB?


86

Làm cách nào để thêm 2 nút vào UINavigationBarmà không có XIB?
2 nút phải được căn chỉnh ở phía bên phải của UINavigationBar.

Tôi biết cách tôi có thể thêm một nút, nhưng còn hai nút thì sao?

Câu trả lời:


142

Với iOS 5+, thật dễ dàng như:

UIBarButtonItem *btnShare = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(share)];
UIBarButtonItem *btnRefresh = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh)];
[self.navigationItem setRightBarButtonItems:[NSArray arrayWithObjects:btnShare, btnRefresh, nil]];

Tôi nghĩ rằng nó cũng có sẵn trong iOS 5.
iAmd

1
Đẹp và đơn giản! Tôi cũng bao gồm nút bên phải hiện có (đặt trong IB) UIBarButtonItem * btnCurrent = self.navigationItem.rightBarButtonItem;
Duncan

43

Tôi đã đăng mã (xem bên dưới) để thêm hai nút vào bên phải của Thanh điều hướng. Bạn có thể đặt barStyle = -1thay vì phân lớp con UIToolbar.

UIToolbar *tools = [[UIToolbar alloc]
                    initWithFrame:CGRectMake(0.0f, 0.0f, 103.0f, 44.01f)]; // 44.01 shifts it up 1px for some reason
tools.clearsContextBeforeDrawing = NO;
tools.clipsToBounds = NO;
tools.tintColor = [UIColor colorWithWhite:0.305f alpha:0.0f]; // closest I could get by eye to black, translucent style.
                                                              // anyone know how to get it perfect?
tools.barStyle = -1; // clear background
NSMutableArray *buttons = [[NSMutableArray alloc] initWithCapacity:3];

// Create a standard refresh button.
UIBarButtonItem *bi = [[UIBarButtonItem alloc]
    initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refresh:)];
[buttons addObject:bi];
[bi release];

// Create a spacer.
bi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
bi.width = 12.0f;
[buttons addObject:bi];
[bi release];

// Add profile button.
bi = [[UIBarButtonItem alloc] initWithTitle:@"Profile" style:UIBarButtonItemStylePlain target:self action:@selector(goToProfile)];
bi.style = UIBarButtonItemStyleBordered;
[buttons addObject:bi];
[bi release];

// Add buttons to toolbar and toolbar to nav bar.
[tools setItems:buttons animated:NO];
[buttons release];
UIBarButtonItem *twoButtons = [[UIBarButtonItem alloc] initWithCustomView:tools];
[tools release];
self.navigationItem.rightBarButtonItem = twoButtons;
[twoButtons release];

đây là bài đăng đầu tiên tôi thấy có bao gồm thanh công cụ bổ sung được thiết lập để làm cho nó hoạt động với các màu nền khác nhau, cảm ơn
Chris

Đây là câu trả lời chính xác cho câu hỏi này .... Mã trong liên kết này đang hoạt động hoàn hảo ... bạn thật tuyệt vời ... chúc mừng ... :) Tất cả các câu trả lời khác ở trên đều sai và không hoạt động
Sameera Chathuranga

Giải pháp không hoạt động hoàn hảo, khi bạn trình bày điều hướngController dưới dạng contentViewController của UIPopoverController. Khi bạn đặt UIToolbar làm chế độ xem tùy chỉnh của leftBarButtonItem, vùng chạm của nút thứ hai không chính xác (bị dịch sang trái, có nghĩa là không thể nhấp vào phía bên phải của nút thứ hai). Khi nói đến rightBarButtonItem, nút thứ hai được vẽ sai (chỉ có phía bên trái của nó được vẽ) ... Trong trường hợp này, tôi sẽ phải sử dụng UIToolbar tùy chỉnh làm tiêu đề thay vì UINavigationBar, tôi nghĩ ...
manicaesar

1
Một trong những thủ thuật ở đây là tools.barStyle = -1dòng: nếu không có một số tạo tác trực quan nếu bạn sử dụng UIBarStyleBlack với mờ = YES. (Cụ thể là màu nền không khớp với màu của thanh điều hướng.) Đó có phải là tính năng không có giấy tờ không? Nếu vậy, mã này thuộc loại mỏng manh. Tôi chưa thấy điều đó ở bất cứ đâu trong tài liệu.
ettore,

28

Bạn có thể sử dụng nút thanh được khởi tạo bằng thanh công cụ làm dạng xem tùy chỉnh.

UIToolbar* toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 103.0f, 44.01f)];
NSArray* buttons = [NSArray arrayWithObjects:self.editButtonItem, someOtherButton, nil];
[toolbar setItems:buttons animated:NO];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:toolbar];

Sẽ cung cấp một cái gì đó như thế này:

văn bản thay thế

Lưu ý: Câu trả lời này đã lỗi thời cho iOS 6 trở lên


3
@SameeraChathuranga bạn không thể chỉ sao chép và dán mã này mà không làm gì cả. Bạn phải đảm bảo rằng 'self.editButtonItem' & 'someOtherButton' được xác định ở đâu đó trước ...
Nathan

Chào! Cảm ơn vì đoạn mã. Bằng cách sử dụng đó, tôi đã thêm hai nút thành công nhưng có một vấn đề nhỏ. Đây là cách nó trông. Như bạn có thể thấy, một đường viền giống hình vuông nhỏ có thể nhìn thấy xung quanh thanh công cụ. Làm cách nào để xóa và làm cho nó liền mạch như bạn có trong ảnh chụp màn hình ở trên? Cảm ơn. :)
Isuru

Kỳ lạ, tôi không nhận được đường viền trên nút "thêm". Tôi chỉ nhận được đường viền nếu tôi sử dụng UIBarButtonStyles không có biểu tượng.
pojo

23

Đây là ví dụ làm việc từ dự án hiện tại của tôi:

hai nút vào UINavigationbar rightBarButtonItem

UIButton *homeBtn =  [UIButton buttonWithType:UIButtonTypeCustom];
[homeBtn setImage:[UIImage imageNamed:@"home-icon"] forState:UIControlStateNormal];
//[homeBtn addTarget:self action:@selector(home) forControlEvents:UIControlEventTouchUpInside];
[homeBtn setFrame:CGRectMake(0, 0, 32, 32)];

UIButton *settingsBtn =  [UIButton buttonWithType:UIButtonTypeCustom];
[settingsBtn setImage:[UIImage imageNamed:@"settings-icon"] forState:UIControlStateNormal];
//[settingsBtn addTarget:self action:@selector(settings) forControlEvents:UIControlEventTouchUpInside];
[settingsBtn setFrame:CGRectMake(44, 0, 32, 32)];

UIView *rightBarButtonItems = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 76, 32)];
[rightBarButtonItems addSubview:homeBtn];
[rightBarButtonItems addSubview:settingsBtn];

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

18
UINavigationBar *navBarView = [[UINavigationBar alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 320.0f, 42.0f)];
    navBarView.tintColor= [UIColor colorWithRed:90.0/255.0f green:53.0/255.0f blue:45.0/255.0f alpha:1.0];

    UIBarButtonItem *left=[[UIBarButtonItem alloc]initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backView)];
    UIBarButtonItem *right=[[UIBarButtonItem alloc]initWithTitle:@"Save" style:UIBarButtonItemStylePlain target:self action:@selector(SaveImage)];
    UIBarButtonItem *Add=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(AddComment:)];

    UINavigationItem *navigationItem = [[UINavigationItem alloc] init];
    navigationItem.leftBarButtonItem = left;
    NSMutableArray *buttonArray=[[NSMutableArray alloc]initWithCapacity:2];
    [buttonArray addObject:right];
    [buttonArray addObject:Add];
    navigationItem.rightBarButtonItems = buttonArray;
    [navBarView pushNavigationItem:navigationItem animated:NO];
[self.view addSubView:navBarView];

14

Nhanh:

override func viewDidLoad() {
    super.viewDidLoad()

    // Additional bar button items
    let button1 = UIBarButtonItem(image: UIImage(named: "image1.png"), style: .Plain, target: self, action: "methodA")
    let button2 = UIBarButtonItem(image: UIImage(named: "image2.png"), style: .Plain, target: self, action: "methodB")
    let button3 = UIBarButtonItem(image: UIImage(named: "image3.png"), style: .Plain, target: self, action: "methodC")

    navigationItem.leftItemsSupplementBackButton = true
    navigationItem.setLeftBarButtonItem(button1, animated: true)
    navigationItem.setRightBarButtonItems([button2, button3], animated: true)

Phương thức cho các nút:

func methodA() {
    performSegueWithIdentifier("segA", sender: nil)
}

func methodB() {
    performSegueWithIdentifier("segB", sender: nil)
}

func methodC() {
    performSegueWithIdentifier("segC", sender: nil)
}

9

NHANH

Bạn có thể làm nhanh chóng như thế này

        var editImg   : UIImage = UIImage(named: "plus")!
        var searchImg : UIImage = UIImage(named: "search")!
        
        var editBtn : UIBarButtonItem = UIBarButtonItem(image: editImg,  style: UIBarButtonItemStyle.Plain, target: self, action: Selector("editBtnPressed:"))
        
        var searchBtn : UIBarButtonItem = UIBarButtonItem(image: searchImg,  style: UIBarButtonItemStyle.Plain, target: self, action: Selector ("searchBtnPressed:"))
        
        var buttons : NSArray = [editBtn, searchBtn]
        
        self.navigationItem.rightBarButtonItems = buttons

        func editBtnPressed(sender: AnyObject){
        
        }
    
        func searchBtnPressed(sender: AnyObject){
        
        }

7

Bạn có thể tạo một UIView và thêm hai nút trong dạng xem đó. Và thêm UIView đó làm nút bên phải :)

UIView* rightItem = [UIView alloc] initWithFrame:frame];
//Create UIButton1 b1
//Create UIButton2 b2
[rightItem addSubview:b1];
[rightItem addSubview:b2];

self.navigationItem.rightBarButtonItem = rightItem;

@NathanReed, Nó phải là self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView: rightItem];(Mẫu mã làm việc đầy đủ bên dưới [của tôi])
Adnan

7

Phản hồi Prakash cũng hoạt động trong trình tạo giao diện.

Kéo một UIViewvào UINavigationItem, sau đó bạn có thể đặt một số UIButtonlàm con của cái này UIViewvà tạo một hệ thống phân cấp như vậy:

Thanh điều hướng với 3 nút phân cấp

Đặt màu nền của nút UIViewthành xóa và thêm một số ràng buộc để căn giữa các nút theo chiều dọc và cố định vị trí nằm ngang. Đây là kết quả tôi nhận được với dòng mã không:

Kết quả trong trình mô phỏng


1
Những công việc này! Đối với những người đang bối rối như tôi, những gì tôi đã làm là thay thế Mục Nút Thanh bằng UIView thay vào đó bằng cách kéo nó vào UINavigationItem như được mô tả. Sau đó, nó sẽ giống hệt như kéo các nút vào cảnh của bạn và thêm các ràng buộc. Kudo cho giải pháp này bởi vì không có bất kỳ mã nào, bây giờ tôi có thể làm điều này cộng với việc tạo ra các cảnh khác nhau bằng cách chỉ cần kéo các nút trong bảng phân cảnh :) Cảm ơn!
Bruce

2
Điều này không cần thiết chút nào. Bạn chỉ có thể kéo các mục nút thanh sang nút thanh bên phải. Xcode 7.3.1
João Nunes,

4

Trong SWIFT, bạn có thể thêm mã này để thiết lập hai nút ở bên phải (hoặc bên trái):

self.navigationItem.rightBarButtonItems = [UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Action, target: self, action: "barButtonItemClicked"), UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: self, action: "barButtonItemClicked")]


3

Đây là mã Swift 4:

    let editImage   = UIImage(named: "plus")!
    let searchImage = UIImage(named: "search")!
    let editButton   = UIBarButtonItem(image: editImage,  style: .plain, target: self, action:#selector(didTapEditButton))
    let searchButton = UIBarButtonItem(image: searchImage,  style: .plain, target: self, action:#selector(didTapSearchButton))
    navigationItem.rightBarButtonItems = [editButton, searchButton]


 @objc func didTapEditButton(sender: AnyObject){

  }

 @objc func didTapSearchButton(sender: AnyObject){

  }

2

Bạn không cần phải thêm hai nút. Bạn chỉ cần thêm

UIBarButtonSystemItemFlexibleSpace 

không phải

UIBarButtonSystemItemFixedSpace

và một nút để nó nằm ở bên phải.

Như thế này:

UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
toolbar.barStyle = UIBarStyleBlackTranslucent;

UIBarButtonItem *spaceButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

UIBarButtonItem *infoButtonItem1 = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(empresaTextFieldDone)];    

toolbar.items = [NSArray arrayWithObjects: spaceButton, infoButtonItem1, nil];   

2
UIView* buttonsView= [[UIView alloc] initWithFrame:CGRectMake(10, 6, 84, 32)];
buttonsView.backgroundColor=[UIColor clearColor];

btn_back = [UIButton buttonWithType:UIButtonTypeCustom];
[btn_back addTarget:self action:@selector(backButtonClick) 
forControlEvents:UIControlEventTouchUpInside];
btn_back.frame = CGRectMake(0, 0, 32, 32);
btn_back.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"close.png"]];

btn_help = [UIButton buttonWithType:UIButtonTypeCustom];
[btn_help addTarget:self action:@selector(helpButtonClick) 
 forControlEvents:UIControlEventTouchUpInside];
btn_help.frame = CGRectMake(42, 0, 32, 32);
btn_help.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"info.png"]];

[buttonsView addSubview:btn_back];
[buttonsView addSubview:btn_help];

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

1

Trong trường hợp ai đó đến đây, giống như tôi, tìm kiếm câu trả lời MonoTouch, thì không cần tìm đâu xa hơn NavigationItem.RightBarButtonItemsmảng.


1

trong SWIFT:

(giả sử Bạn có bộ điều khiển điều hướng) trong Bộ điều khiển gốc sử dụng mã này:

trái: ..

    let leftBtn =  UIBarButtonItem(title: "Do It", style: UIBarButtonItemStyle.Plain,
        target: self, action: "doIt:")
    leftBtn.tag=100
    self.navigationItem.leftBarButtonItem = leftBtn

đúng:

    let rightView = UIView(frame:  CGRectMake(0, 0, 100, 30))
    rightView.backgroundColor = UIColor.redColor()

    let btn1 = UIButton(frame: CGRectMake(0,0,60, 20))
    btn1.setTitle("R1", forState: UIControlState.Normal)
    btn1.tag=101
    btn1.addTarget(self, action: "doIt:", forControlEvents: UIControlEvents.TouchUpInside)
    rightView.addSubview(btn1)

    let btn2 = UIButton(frame: CGRectMake(30,0,60, 20))
    btn2.setTitle("R2", forState: UIControlState.Normal)
    btn2.tag=102
    btn2.addTarget(self, action: "doIt:", forControlEvents: UIControlEvents.TouchUpInside)
    rightView.addSubview(btn2)


    let rightBtn = UIBarButtonItem(customView: rightView)
    self.navigationItem.rightBarButtonItem = rightBtn;

..

Ở đâu:

 func doIt(sender: AnyObject!){
    let tag = sender.tag

}

0
    func makeCustomNavigationBar () {

        // Create the navigation bar
        let navigationBar = UINavigationBar(frame: CGRectMake(0, 20, self.view.frame.size.width, 44)) // Offset by 20 pixels vertically to take the status bar into account
        navigationBar.backgroundColor = UIColor.init(hexString: "E43037")
        navigationBar.delegate = self;

        navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
        navigationBar.shadowImage = UIImage()
        navigationBar.translucent = true

        // Create a navigation item with a title
        let navigationItem = UINavigationItem()
        navigationBar.tintColor = UIColor.whiteColor()

        navigationItem.title = "Forgot Password"
        navigationBar.titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]

        // Create left and right button for navigation item
        let leftButton = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
        leftButton.action = "returnToLoginView"

        let backbuttonImageView =  UIImageView(frame: CGRectMake(0, 0, 30, 30))
        backbuttonImageView.image = UIImage(named: "nav-arrow-left")
        leftButton.image = backbuttonImageView.image
        navigationItem.leftBarButtonItem = leftButton


let rightButton = UIBarButtonItem(title: "Right", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
        rightButton.action = "navigateToDashBoardView"

        let rightButtonImageView =  UIImageView(frame: CGRectMake(0, 0, 30, 30))
        rightButtonImageView.image = UIImage(named: "nav-arrow-left")
        rightButton.image = backbuttonImageView.image
        navigationItem.rightBarButtonItem = rightButton

        // Assign the navigation item to the navigation bar
        navigationBar.items = [navigationItem]

        // Make the navigation bar a subview of the current view controller
        self.view.addSubview(navigationBar)
    }
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.