UINavigationController에 오른쪽 버튼을 추가하는 방법?


191

탐색 컨트롤러의 상단 표시 줄에 새로 고침 버튼을 성공적으로 추가하려고합니다.

헤더는 다음과 같습니다.

@interface PropertyViewController : UINavigationController {

}

추가하는 방법은 다음과 같습니다.

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

답변:


362

viewDidLoad에서 해보십시오. 일반적으로 UIViewController가 초기화 될 때까지 그 시점까지 할 수있는 모든 것을 연기해야합니다 .UIViewController가 표시되기 전에는 여전히 시간이 오래 걸릴 수 있습니다.

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

현재 작동하지 않는 이유에 대해서는 더 많은 코드를 보지 않고 100 % 확실하게 말할 수는 없지만 init와 view 로딩 사이에 많은 일이 발생하며 navigationItem이 재설정되는 원인이 될 수 있습니다 중에서.


45
someNavController.topLevelController.navigationItem.rightBarButtonItem = anotherButton : 나는 당신이 UINavigationController가 서브 클래스의 외부를하고있다, 당신은 이런 식으로 참조 할 것
ransomweaver

2
제안 된 솔루션을 구현하고 있었고 @selector 메서드 이름이 콜론 (:)으로 끝나야한다는 것을 알 때까지 앱이 계속 중단되었습니다.
Stealth

10
UINavigationContoller의 viewDidLoad 메소드 내부에서도 다음과 같이 호출해야했습니다.self.topViewController.navigationItem.leftBarButtonItem = nextButton;
Joseph

감사! @Joseph, 당신의 설명은 저를 구했습니다. (y) :)
Prasanna

38

PropertyViewController생성 한이 클래스 로 푸시 될 뷰 컨트롤러의 navigationItem에 버튼을 추가해보십시오 .

그건:

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

이제 프로그래밍 방식으로 작성된이 infoButton이 탐색 모음에 표시됩니다. 아이디어는 내비게이션 컨트롤러가 디스플레이하려는 정보 (제목, 버튼 등)를 디스플레이 정보에서 선택 UIViewController한다는 것입니다. 실제로 버튼 등을에 직접 추가하지는 않습니다 UINavigationController.


2
UINavigationController에서 rightBarButtonItem을 직접 설정하면 위의 Louis Gerbarg가 제안한대로 작동하지 않았습니다. 대신 Adem이 제안한 것처럼 UIViewController에서 직접 항목을 설정하면 효과가 있습니다!
leviathan

4
"누를 뷰 컨트롤러의 navigationItem에 버튼을 추가해보십시오" +1 !
Kjuly

25

나와 같은 일부 사람들이 인터페이스 빌더에 탐색 표시 줄 단추를 추가하는 방법을 찾고있을 것 같습니다. 아래 답변은 방법을 보여줍니다.

스토리 보드에 내비게이션 컨트롤러 추가

View Controller를 선택한 다음 Xcode 메뉴에서 Editor> Embed In> Navigation Controller를 선택하십시오 .

여기에 이미지 설명을 입력하십시오

또는 UINavigationBar객체 라이브러리에서을 추가 할 수 있습니다 .

바 버튼 아이템 추가

UIBarButtonItem객체 라이브러리에서 상단 네비게이션 바로 a 를 드래그 합니다.

여기에 이미지 설명을 입력하십시오

다음과 같아야합니다.

여기에 이미지 설명을 입력하십시오

속성 설정

"항목"을 두 번 클릭하여 텍스트를 "새로 고침"과 같은 것으로 변경할 수 있지만 사용할 수 있는 실제 새로 고침 아이콘 이 있습니다. 그냥이에 대한 속성을 속성 선택 UIBarButtonItem하고 대한 시스템 항목이 선택 새로 고침을 .

여기에 이미지 설명을 입력하십시오

기본 새로 고침 아이콘이 표시됩니다.

여기에 이미지 설명을 입력하십시오

IB 조치 추가

컨트롤을에서 UIBarButtonItem컨트롤러로 드래그하여을 추가합니다 @IBAction.

class ViewController: UIViewController {

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

그게 다야.


죄송합니다, 당신이 말하는 것을 따라갈 수 없습니다. 이야기하고있는 것을 보여주는 이미지로 새로운 질문을 해보세요. 그런 다음 여기에 링크를 추가하십시오.
Suragch

@ Suragch, 스토리 보드 대신 xib 파일로 동일한 작업을 어떻게 수행 할 수 있습니까? 감사합니다
Cristian Chaparro A.

@CristianChaparroA. 일반적으로 xib 파일은 단일보기 용이고 탐색 모음 (막대 버튼 항목을 호스팅)은 여러보기 용입니다. 바 버튼 항목으로 xib를 사용한 적이 없습니다. 새 질문을 한 다음 여기에 링크 해보십시오.
Suragch

14

"새로 고침"에 대한 기본 시스템 버튼이 있습니다 :

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

이것을 사용할 수 있습니다 :

목표 -C

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

빠른

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

}

누구나 ViewDidLoad 대신 ViewWillAppear에서 해를 끼칠 수 있다고 말할 수 있습니까?
Niranjan Molkeri

6

신속한 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

새로운 swift2 선택기를 사용하는 것이 좋습니다. #selector (classname.functionname)
Emptyless

5

Swift의 솔루션은 다음과 같습니다 (필요에 따라 옵션 설정).

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

4

왜 서브 클래스 UINavigationController입니까? 버튼을 추가하기 만하면 서브 클래스가 필요하지 않습니다.

UINavigationController상단에 a 를 사용하여 계층 구조를 설정 한 다음 루트보기 컨트롤러의 viewDidLoad:방법에서 버튼을 설정하고 호출하여 탐색 항목에 연결하십시오.

[[self navigationItem] setRightBarButtonItem:myBarButtonItem];

1
좋은 질문입니다. 내가하려고하는 것은 실제로 매우 일반적인 디자인 패턴입니다.이 패턴은 각 탭마다 탐색 컨트롤러가있는 기본 탭 컨트롤러입니다. 더 좋은 방법이 있다면 제안을 위해 열려 있습니다. 나도 그 질문을해야 할지도 모른다.
Artilheiro


3

스위프트 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 !?")
}

오른쪽 버튼을 원하면 navigationItem.rightBarButtonItem을 사용하십시오
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

이것을 시도하십시오. 그것은 나를 위해 일합니다.

탐색 막대 및 배경 이미지를 오른쪽 버튼에 추가했습니다.

 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

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated메소드에 barButtonItem을 추가해야합니다 .


0

이 Objective-C 코드를 복사하여 붙여 넣기 만하면됩니다.

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

0

이 문제는 뷰 컨트롤러를 삭제하거나 인터페이스 빌더 (main.storyboard) 내에 새 뷰 컨트롤러를 추가하려고 할 때 발생할 수 있습니다. 이 문제를 해결하려면 새보기 컨트롤러에 "탐색 항목"을 추가해야합니다. 때때로 새로운 뷰 컨트롤러 화면을 생성하고 "탐색 항목"에 자동으로 연결되지 않는 경우가 있습니다.

  1. main.storyboard로 이동하십시오.
  2. 새 뷰 컨트롤러를 선택하십시오.
  3. 문서 개요로 이동하십시오.
  4. 컨트롤러 내용보기를 확인하십시오.
  5. 새보기 컨트롤러에 탐색 항목이 없으면 이전보기 컨트롤러에서 탐색 항목을 복사하여 새보기 컨트롤러에 붙여 넣습니다.
  6. 프로젝트를 저장하고 청소하십시오.

0

또한 당신은 사용하여 여러 버튼을 추가 할 수 있습니다 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 : 네비게이션 기반 프로젝트라면 BaseViewController를 만들 수 있습니다. 다른 모든 뷰는이 BaseView를 상속합니다. BaseView에서 u는 오른쪽 버튼을 추가하거나 왼쪽 버튼 텍스트를 변경하는 일반적인 방법을 정의 할 수 있습니다.

전의:

@interface BaseController : UIViewController {

}-(void) setBackButtonCaption : (NSString *) 캡션;

(void) setRightButtonCaption : (NSString *) 자막 선택 : (SEL) 선택기;

@end // BaseView.M에서

(void) setBackButtonCaption : (NSString *) 자막 {

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

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

}-(void) setRightButtonCaption : (NSString *) 캡션 선택 : (SEL) 선택기 {

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

rightButton.target= self;

[rightButton setAction:selector];

self.navigationItem.rightBarButtonItem= rightButton;

[rightButton release];

}

이제 모든 사용자 정의보기 에서이 기본보기를 구현하여 메소드를 호출하십시오.

@interface LoginView : BaseController {

일부 메소드 호출 기본 메소드는 다음과 같습니다.

SEL sel = @selector (switchToForgotPIN);

[super setRightButtonCaption : @ "PIN을 잊어 버렸습니다"selectot : sel];

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