IB없이 오른쪽 UINavigationbar에 2 개의 버튼을 추가하는 방법은 무엇입니까?


86

UINavigationBarXIB없이에 2 개의 버튼을 추가하려면 어떻게 해야합니까?
2 개의 버튼은 UINavigationBar.

하나의 버튼을 추가하는 방법을 알고 있지만 두 개는 어떻습니까?

답변:


142

iOS 5 이상에서는 다음과 같이 쉽습니다.

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

iOS 5에서도 사용할 수 있다고 생각합니다.
iAmd

1
멋지고 간단합니다! 또한 기존 오른쪽 버튼 (IB에서 설정)을 포함했습니다. UIBarButtonItem * btnCurrent = self.navigationItem.rightBarButtonItem;
Duncan

43

내가 코드를 게시 내비게이션 바의 오른쪽에 두 개의 버튼을 추가합니다 (아래 참조). barStyle = -1서브 클래 싱 대신 설정할 수 있습니다 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];

이 차종은 그것이 다른 배경 색상으로 감사 작동하는지 설정 추가 도구 모음을 포함 내가 찾은 첫 번째 게시물이었다
크리스

이것은이 질문에 대한 정답입니다 ....이 링크의 코드는 완벽하게 작동합니다 ... 굉장한 사람 ... 건배 ... :) 위의 다른 모든 답변은 잘못되었으며 작동하지 않습니다
Sameera Chathuranga

이 솔루션은 navigationController를 UIPopoverController의 contentViewController로 표시 할 때 완벽하게 작동하지 않습니다. UIToolbar를 leftBarButtonItem의 사용자 정의보기로 설정하면 두 번째 버튼의 터치 영역이 올바르지 않습니다 (왼쪽으로 이동하여 두 번째 버튼의 오른쪽을 클릭 할 수 없음을 의미 함). rightBarButtonItem의 경우 두 번째 버튼이 잘못 그려집니다 (왼쪽 만 그려 짐) ...이 경우 UINavigationBar 대신 사용자 정의 UIToolbar를 헤더로
사용해야

1
여기서 트릭 중 하나는 tools.barStyle = -1줄입니다. 반투명 = YES로 UIBarStyleBlack을 사용하면 시각적 아티팩트가 있습니다. (즉, 배경색이 탐색 모음의 색과 일치하지 않습니다.) 문서화되지 않은 기능입니까? 그렇다면이 코드는 다소 취약합니다. 나는 문서의 어느 곳에서도 그것을 보지 못했습니다.
ettore 2012-07-29

28

도구 모음 으로 초기화 된 막대 단추를 사용자 정의보기로 사용할 수 있습니다 .

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

다음과 같은 것을 줄 것입니다.

대체 텍스트

참고 :이 답변은 iOS 6 이상에서 사용되지 않습니다.


3
@SameeraChathuranga 당신은 아무것도하지 않고이 코드를 복사하여 붙여 넣을 수 없습니다. 'self.editButtonItem'및 'someOtherButton'이 먼저 어딘가에 정의되어 있는지 확인해야합니다 ...
Nathan

안녕하세요! 스 니펫 주셔서 감사합니다. 이를 사용하여 두 개의 버튼을 성공적으로 추가했지만 작은 문제가 있습니다. 다음 은 어떻게 보이는지입니다. 보시다시피 도구 모음 주위에 약간의 정사각형 테두리가 보입니다. 이것을 제거하고 위의 스크린 샷에있는 것처럼 매끄럽게 만들려면 어떻게해야합니까? 감사. :)
Isuru 2013 년

이상하게도 "추가"버튼에 테두리가 표시되지 않습니다. 아이콘이없는 UIBarButtonStyles를 사용하는 경우에만 테두리가 표시됩니다.
pojo 2013-09-03

23

다음은 현재 프로젝트의 작업 예입니다.

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

빠른:

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)

버튼 방법 :

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

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

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

9

빠른

당신은에서 할 수있는 신속 같은

        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

UIView를 만들고 해당 뷰에 두 개의 버튼을 추가 할 수 있습니다. 그리고 그 UIView를 오른쪽 버튼으로 추가하십시오 :)

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

self.navigationItem.rightBarButtonItem = rightItem;

@NathanReed, 그것은 self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView: rightItem];([나에 의해] 아래 전체 작업 코드 샘플)
Adnan

7

Prakash 응답은 인터페이스 빌더에서도 작동합니다.

UIView에서 a 를 드래그하면 UINavigationItem여러 개의 UIButton하위 항목을 배치하고 다음 UIView과 같은 계층 구조를 만들 수 있습니다.

3 개의 버튼 계층 구조가있는 탐색 모음

의 배경색을 설정하여 UIView지우고 버튼을 수직으로 가운데에 배치하고 수평 위치를 고정하는 제약을 추가합니다. 다음은 0 줄의 코드로 얻은 결과입니다.

시뮬레이터의 결과


1
작동합니다! 나처럼 혼란스러워하는 사람들을 위해 내가 한 일은 설명 된대로 UINavigationItem으로 드래그하여 대신 Bar Button Item을 UIView로 바꾸는 것입니다. 그 후에는 버튼을 장면으로 드래그하고 제약 조건을 추가하는 것과 똑같습니다. 이 솔루션에 대한 찬사입니다. 코드없이 스토리 보드의 버튼을 드래그하여 다른 장면으로 segue를 생성 할 수 있기 때문입니다. :) 감사합니다!
Bruce

2
이것은 전혀 필요하지 않습니다. 바 버튼 항목을 오른쪽 바 버튼으로 드래그 할 수 있습니다. Xcode 7.3.1
João Nunes 2016 년

4

SWIFT에서이 코드를 추가하여 오른쪽 (또는 왼쪽)에 두 개의 버튼을 설정할 수 있습니다.

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


3

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

두 개의 버튼을 추가 할 필요가 없습니다. 추가하기 만하면됩니다.

UIBarButtonSystemItemFlexibleSpace 

아니

UIBarButtonSystemItemFixedSpace

오른쪽에 있도록 버튼이 있습니다.

이렇게 :

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

나와 같은 누군가가 MonoTouch 답변을 찾고 여기에 올 경우 NavigationItem.RightBarButtonItems배열 보다 더 이상 보지 마십시오 .


1

SWIFT :

(내비게이션 컨트롤러가 있다고 가정) 루트 컨트롤러에서 다음 코드를 사용합니다.

왼쪽: ..

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

권리:

    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;

..

어디:

 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)
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.