จะเพิ่มปุ่มใน UINavigationBar ได้อย่างไร?


คำตอบ:


294

ตัวอย่างรหัสเพื่อตั้งค่าrightbuttonบนไฟล์NavigationBar.

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" 
    style:UIBarButtonItemStyleDone target:nil action:nil];
UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"Title"];
item.rightBarButtonItem = rightButton;
item.hidesBackButton = YES;
[bar pushNavigationItem:item animated:NO];

แต่โดยปกติคุณจะมี a NavigationControllerช่วยให้คุณสามารถเขียน:

UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done"
    style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.rightBarButtonItem = rightButton;

1
ฉันได้รับคำเตือนเกี่ยวกับสไตล์: พารามิเตอร์ -> คำเตือน: ปัญหาเชิงความหมาย: การแปลงโดยนัยจากประเภทการแจงนับ 'UIBarButtonSystemItem' เป็นประเภทการแจงนับที่แตกต่างกัน 'UIBarButtonItemStyle'
pojo

3
ซึ่งควรเป็น initWithBarButtonSystemItem: UIBarButtonSystemItemDone เพื่อหลีกเลี่ยงคำเตือน
JordanC

2
ในตัวอย่างฉันไม่เข้าใจว่า "บาร์" มาจากไหน คุณสมบัติแถบด้านบนเริ่มต้นสำหรับ UINavigationItem คืออะไร
aneuryzm

ตัวแปร bar ในคำตอบคือแถบนำทางใด ๆ ที่ไม่ได้รับการจัดการโดยตัวควบคุมการนำทาง หากคุณมีตัวควบคุมการนำทางก็จะมีแถบนำทางเป็นของตัวเองที่จัดการ - ในกรณีนี้ตัวควบคุมมุมมองแต่ละตัวที่คุณกดไปยังตัวควบคุมการนำทางควรกำหนดค่ารายการการนำทางของตัวเอง (ซึ่งรวมถึงการตั้งค่า rightBarButtonItem ใน navigationItem ของตัวเอง ทรัพย์สิน)
Vasiliy Kulakov

สำหรับผู้อ่านปัจจุบันฉันไม่เชื่อว่ามีเหตุผลใดที่จะเรียก[rightbutton release]ภายใต้ ARC (ซึ่งไม่ได้อยู่ในขณะที่เขียนความคิดเห็นนี้)
carbocation

20

คำตอบข้างต้นเป็นสิ่งที่ดี แต่ฉันต้องการอธิบายเคล็ดลับเพิ่มเติม:

หากคุณต้องการแก้ไขชื่อของปุ่มย้อนกลับ (ลูกศร -y มองที่ด้านซ้ายของแถบนำทาง) คุณต้องทำในตัวควบคุมมุมมองก่อนหน้าไม่ใช่ตัวควบคุมที่จะแสดง ก็เหมือนกับการพูดว่า "เฮ้ถ้าคุณเคยดันตัวควบคุมมุมมองอื่นไว้ด้านบนของตัวควบคุมนี้ให้เรียกปุ่มย้อนกลับ" ย้อนกลับ "(หรืออะไรก็ได้) แทนค่าเริ่มต้น"

หากคุณต้องการซ่อนปุ่มย้อนกลับระหว่างสถานะพิเศษเช่นในขณะที่แสดง UIPickerView ให้ใช้self.navigationItem.hidesBackButton = YES;และอย่าลืมตั้งค่ากลับเมื่อคุณออกจากสถานะพิเศษ

หากคุณต้องการแสดงปุ่มสัญลักษณ์พิเศษปุ่มใดปุ่มหนึ่งให้ใช้แบบฟอร์มที่initWithBarButtonSystemItem:target:actionมีค่าเช่นUIBarButtonSystemItemAdd

จำไว้ว่าความหมายของสัญลักษณ์นั้นขึ้นอยู่กับคุณ แต่โปรดระวังแนวทางการเชื่อมต่อกับมนุษย์ การใช้ UIBarButtonSystemItemAdd เพื่อหมายถึงการลบรายการอาจทำให้แอปพลิเคชันของคุณถูกปฏิเสธ


11

การเพิ่มปุ่มที่กำหนดเองลงในแถบนำทาง (พร้อมรูปภาพสำหรับ buttonItem และการระบุวิธีการดำเนินการ (โมฆะ) openView {} และ)

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0, 0, 32, 32);
[button setImage:[UIImage imageNamed:@"settings_b.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(openView) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *barButton=[[UIBarButtonItem alloc] init];
[barButton setCustomView:button];
self.navigationItem.rightBarButtonItem=barButton;

[button release];
[barButton release];

7

ตัวอย่างด้านล่างจะแสดงปุ่มที่มีชื่อ "ผู้ติดต่อ" บนแถบนำทางทางด้านขวา การดำเนินการเรียกเมธอดชื่อ "contact" จาก viewcontroller หากไม่มีบรรทัดนี้จะมองไม่เห็นปุ่มขวา

    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Contact"
                                                                          style:UIBarButtonItemStylePlain target:self action:@selector(contact:)];;

ใส่คำอธิบายภาพที่นี่


3

ใน Swift 2 คุณจะต้องทำ:

let rightButton: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: nil, action: nil)
self.navigationItem.rightBarButtonItem = rightButton

(ไม่ใช่การเปลี่ยนแปลงที่สำคัญ) ใน Swift 4/5 จะเป็น:

let rightButton: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: nil, action: nil)
self.navigationItem.rightBarButtonItem = rightButton

2

ทำไมไม่ใช้สิ่งต่อไปนี้: (จากปุ่มวาดย้อนกลับแบบกำหนดเองบนแถบนำทางของ iPhone )

// Add left
UINavigationItem *previousItem = [[UINavigationItem alloc] initWithTitle:@"Back title"];
UINavigationItem *currentItem = [[UINavigationItem alloc] initWithTitle:@"Main Title"];
[self.navigationController.navigationBar setItems:[NSArray arrayWithObjects:previousItem, currentItem, nil] animated:YES];

// set the delegate to self
[self.navigationController.navigationBar setDelegate:self];

0

รวดเร็ว 3

    let cancelBarButton = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(cancelPressed(_:)))
    cancelBarButton.setTitleTextAttributes( [NSFontAttributeName : UIFont.cancelBarButtonFont(),
                                                          NSForegroundColorAttributeName : UIColor.white], for: .normal)
    self.navigationItem.leftBarButtonItem = cancelBarButton


    func cancelPressed(_ sender: UIBarButtonItem ) {
        self.dismiss(animated: true, completion: nil)
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.