วิธีเพิ่มปุ่มขวาให้กับ 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 นั้นเริ่มต้นมันอาจจะยังคงอยู่สักพักก่อนที่มันจะปรากฏขึ้นไม่มีจุดใดในการทำงานก่อนเวลาและผูกหน่วยความจำ

- (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 และการโหลดมุมมองและคุณอาจทำบางสิ่งที่ทำให้การนำทางตั้งค่าใหม่ ระหว่าง.


45
ฉันกำลังทำสิ่งนี้นอกคลาสย่อย UINavigationController คุณจะอ้างถึงสิ่งนี้: someNavController.topLevelController.navigationItem.rightBarButtonItem = anotherButton
ransomweaver

2
ฉันกำลังใช้งานโซลูชันที่แนะนำและแอพของฉันยังคงทำงานผิดพลาดจนกว่าฉันจะรู้ว่าชื่อวิธีการ @soror ต้องลงท้ายด้วยโคลอน (:)
Stealth

10
แม้แต่ในด้านของวิธี viewDidLoad ของ UINavigationContoller ฉันต้องเรียกมันว่าself.topViewController.navigationItem.leftBarButtonItem = nextButton;
Joseph

ขอบคุณ! @ โจเซฟคำชี้แจงของคุณช่วยฉัน (y) :)
Prasanna

38

ลองเพิ่มปุ่มลงในรายการนำทางของตัวควบคุมมุมมองที่จะถูกส่งไปยังPropertyViewControllerคลาสนี้ที่คุณสร้างขึ้น

นั่นคือ:

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

ตอนนี้ปุ่มข้อมูลที่ถูกสร้างขึ้นโดยทางโปรแกรมจะปรากฏในแถบนำทาง แนวคิดคือตัวควบคุมการนำทางเลือกข้อมูลการแสดงผล (ชื่อปุ่มและอื่น ๆ ) จากUIViewControllerที่กำลังจะแสดง UINavigationControllerคุณไม่จริงเพิ่มปุ่มและเช่นโดยตรงกับ


2
การตั้งค่า rightBarButtonItem โดยตรงบน UINavigationController ไม่ทำงานสำหรับฉัน (ตามที่ Louis Gerbarg เสนอไว้ด้านบน) แทนที่จะตั้งค่ารายการโดยตรงบน UIViewController ที่อยู่ในมือเช่น Adem แนะนำให้ใช้งานได้!
leviathan

4
+1 สำหรับ"ลองเพิ่มปุ่มลงในรายการนำทางของตัวควบคุมมุมมองที่จะผลักดัน" !
Kjuly

25

ดูเหมือนว่าบางคน (เช่นฉัน) อาจมาที่นี่เพื่อค้นหาวิธีเพิ่มปุ่มแถบนำทางในเครื่องมือสร้างส่วนติดต่อ คำตอบด้านล่างแสดงวิธีการทำ

เพิ่มตัวควบคุมการนำทางไปยังกระดานเรื่องราวของคุณ

เลือกดูควบคุมของคุณและจากนั้นใน Xcode เมนูเลือกEditor> ฝังใน> นำร่องควบคุม

ป้อนคำอธิบายรูปภาพที่นี่

หรือคุณสามารถเพิ่ม a UINavigationBarจากไลบรารีวัตถุ

เพิ่มรายการปุ่มบาร์

ลากUIBarButtonItemจากไลบรารีวัตถุไปยังแถบการนำทางด้านบน

ป้อนคำอธิบายรูปภาพที่นี่

ควรมีลักษณะเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ตั้งค่าคุณสมบัติ

คุณสามารถดับเบิลคลิก "รายการ" เพื่อเปลี่ยนข้อความเป็น "รีเฟรช" แต่มีไอคอนจริงสำหรับรีเฟรชที่คุณสามารถใช้ได้ เพียงแค่เลือกคุณสมบัติสารวัตรสำหรับUIBarButtonItemและระบบรายการเลือกรีเฟรช

ป้อนคำอธิบายรูปภาพที่นี่

ที่จะให้ไอคอนรีเฟรชเริ่มต้น

ป้อนคำอธิบายรูปภาพที่นี่

เพิ่ม IB Action

การควบคุมการลากจากไปดูตัวควบคุมที่จะเพิ่ม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

คุณสามารถใช้สิ่งนี้:

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

}

ใครช่วยบอกฉันได้ไหมว่ามีอันตรายในการทำเช่นนี้ใน ViewWillAppear แทน ViewDidLoad
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 ใหม่: #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? ไม่จำเป็นต้อง subclass มันหากสิ่งที่คุณต้องทำคือเพิ่มปุ่มลงไป

ตั้งค่าลำดับชั้นด้วย a UINavigationControllerที่ด้านบนจากนั้นใน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

คุณควรเพิ่ม barButtonItem ด้วย- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animatedวิธีการ


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 คุณสามารถกำหนดวิธีการทั่วไปเพื่อเพิ่มปุ่มขวาหรือเปลี่ยนข้อความปุ่มซ้าย

อดีต:

@interface BaseController: UIViewController {

} - (เป็นโมฆะ) setBackButtonCaption: (NSString *) คำบรรยายภาพ;

(เป็นโมฆะ) setRightButtonCaption: (NSString *) คำบรรยายใต้ภาพ selectot: (SEL) selector;

@end // ใน BaseView.M

(เป็นโมฆะ) setBackButtonCaption: (NSString *) คำอธิบายภาพ {

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

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

} - (เป็นโมฆะ) setRightButtonCaption: (NSString *) คำบรรยายภาพ selectot: (SEL) selector {

  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 ลืม" เลือก: sel];

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.