UIBarButtonItem trong thanh điều hướng lập trình?


135

Tôi đã tìm kiếm giải pháp này trong một thời gian nhưng không có gì cả. ví dụ: một giải pháp là

 self.navigationItem.setRightBarButtonItem(UIBarButtonItem(barButtonSystemItem: .Stop, target: self, action: nil), animated: true)

Mã này sẽ thêm một nút với hình ảnh "dừng". Cũng giống như thế này, có những giải pháp khác với "tìm kiếm," làm mới ", nhưng nếu tôi muốn thêm một nút lập trình với hình ảnh tôi muốn thì sao?

Câu trả lời:


342

Hình ảnh nút tùy chỉnh mà không cần cài đặt khung nút:

Bạn có thể sử dụng init(image: UIImage?, style: UIBarButtonItemStyle, target: Any?, action: Selector?)để khởi tạo một mục mới bằng cách sử dụng hình ảnh được chỉ định và các thuộc tính khác.

let button1 = UIBarButtonItem(image: UIImage(named: "imagename"), style: .plain, target: self, action: Selector("action")) // action:#selector(Class.MethodName) for swift 3
self.navigationItem.rightBarButtonItem  = button1

Kiểm tra tài liệu này của Apple. tài liệu tham khảo


UIBarButtonItem với hình ảnh nút tùy chỉnh bằng cách sử dụng khung nút

CHO Swift 3.0

    let btn1 = UIButton(type: .custom)
    btn1.setImage(UIImage(named: "imagename"), for: .normal)
    btn1.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
    btn1.addTarget(self, action: #selector(Class.Methodname), for: .touchUpInside)
    let item1 = UIBarButtonItem(customView: btn1)

    let btn2 = UIButton(type: .custom)
    btn2.setImage(UIImage(named: "imagename"), for: .normal)
    btn2.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
    btn2.addTarget(self, action: #selector(Class.MethodName), for: .touchUpInside)
    let item2 = UIBarButtonItem(customView: btn2)  

    self.navigationItem.setRightBarButtonItems([item1,item2], animated: true)

CHO Swift 2.0và cũ hơn

let btnName = UIButton()
btnName.setImage(UIImage(named: "imagename"), forState: .Normal)
btnName.frame = CGRectMake(0, 0, 30, 30)
btnName.addTarget(self, action: Selector("action"), forControlEvents: .TouchUpInside)

//.... Set Right/Left Bar Button item
let rightBarButton = UIBarButtonItem()
rightBarButton.customView = btnName
self.navigationItem.rightBarButtonItem = rightBarButton

Hoặc đơn giản là sử dụng init (customView :) như

 let rightBarButton = UIBarButtonItem(customView: btnName)
 self.navigationItem.rightBarButtonItem = rightBarButton

Đối với hệ thống UIBarButtonItem

let camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: Selector("btnOpenCamera"))
self.navigationItem.rightBarButtonItem = camera

Để đặt nhiều hơn 1 mục sử dụng rightBarButtonItemshoặc cho bên tráileftBarButtonItems

let btn1 = UIButton()
btn1.setImage(UIImage(named: "img1"), forState: .Normal)
btn1.frame = CGRectMake(0, 0, 30, 30)
btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside)
let item1 = UIBarButtonItem()
item1.customView = btn1

let btn2 = UIButton()
btn2.setImage(UIImage(named: "img2"), forState: .Normal)
btn2.frame = CGRectMake(0, 0, 30, 30)
btn2.addTarget(self, action: Selector("action2:"), forControlEvents: .TouchUpInside)
let item2 = UIBarButtonItem()
item2.customView = btn2

self.navigationItem.rightBarButtonItems = [item1,item2]

Sử dụng setLeftBarButtonItemhoặcsetRightBarButtonItem

let btn1 = UIButton()
btn1.setImage(UIImage(named: "img1"), forState: .Normal)
btn1.frame = CGRectMake(0, 0, 30, 30)
btn1.addTarget(self, action: Selector("action1:"), forControlEvents: .TouchUpInside)
self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: btn1), animated: true);

Đối với swift> = 2.2 hành động nên #selector(Class.MethodName)... ví dụ:btnName.addTarget(self, action: #selector(Class.MethodName), forControlEvents: .TouchUpInside)


Câu trả lời chính xác. Chỉ muốn chỉ ra rằng phương thức Selector đã được cập nhật mặc dùlet camera = UIBarButtonItem(barButtonSystemItem: .Camera, target: self, action: #selector(Class.MethodName))
CodeBender

Tôi thấy rằng nếu bạn muốn nút của bạn cũng bao gồm văn bản, bạn phải chỉ định phần CGRect. Có một số ví dụ nổi xung quanh SO không chỉ định điều này.
Micah Montoya

cảm ơn câu trả lời hoàn hảo của bạn Thật không tệ khi thêm một bản cập nhật cho swift 4.
Milad Faridnia 22/07/18

38

Nó dễ dàng hơn nhiều với Swift 4 hoặcSwift 4.2

trong ViewDidLoadphương thức của bạn , xác định nút của bạn và thêm nó vào thanh điều hướng.

override func viewDidLoad() {
    super.viewDidLoad()

    let logoutBarButtonItem = UIBarButtonItem(title: "Logout", style: .done, target: self, action: #selector(logoutUser))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem

}

sau đó bạn cần xác định hàm mà bạn đã đề cập bên trong tham số hành động như bên dưới

@objc func logoutUser(){
     print("clicked")
}

Bạn cần thêm @objctiền tố vì nó vẫn đang sử dụng các công cụ kế thừa (Mục tiêu C).


17

Chỉ cần thiết lập UIBarButtonItemvới customView

Ví dụ:

  var leftNavBarButton = UIBarButtonItem(customView:yourButton)
  self.navigationItem.leftBarButtonItem = leftNavBarButton

hoặc sử dụng setFunction:

  self.navigationItem.setLeftBarButtonItem(UIBarButtonItem(customView: yourButton), animated: true);

1
Tôi sẽ bỏ phiếu cho câu trả lời của bạn vì mã của bạn cũng hoạt động nhưng mã của Bhavin là giải pháp một lần nên tôi chấp nhận câu trả lời của anh ấy. Cảm ơn bạn đã đóng góp của bạn :)
Rahul Sonvane 04/05/2015

11

Tôi chỉ vấp phải câu hỏi này và đây là bản cập nhật cho Swift 3 và iOS 10:

let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: nil)
self.navigationItem.rightBarButtonItem  = testUIBarButtonItem

Nó chắc chắn nhanh hơn nhiều so với việc tạo UIButton với tất cả các thuộc tính và sau đó thêm customView vào UIBarButtonItem.

Và nếu bạn muốn thay đổi màu của hình ảnh từ màu xanh mặc định sang màu trắng, ví dụ: bạn luôn có thể thay đổi màu sắc:

test.tintColor = UIColor.white()

PS Rõ ràng bạn nên thay đổi bộ chọn, vv cho ứng dụng của mình :)


7

Trong Swift 3.0+, UIBarButtonItemlập trình được thiết lập như sau:

   override func viewDidLoad() {
        super.viewDidLoad()
        let testUIBarButtonItem = UIBarButtonItem(image: UIImage(named: "test.png"), style: .plain, target: self, action: #selector(self.clickButton))
        self.navigationItem.rightBarButtonItem  = testUIBarButtonItem
    }

   @objc func clickButton(){
            print("button click")
     }

3

Đặt LeftBarButton với ảnh gốc.

let menuButton = UIBarButtonItem(image: UIImage(named: "imagename").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(classname.functionname))
self.navigationItem.leftBarButtonItem  = menuButton

2

Tôi có cùng một vấn đề và tôi đã đọc câu trả lời trong một chủ đề khác sau đó tôi giải quyết một cách tương tự khác. Tôi không biết cái nào hiệu quả hơn. vấn đề tương tự

//play button

@IBAction func startIt(sender: AnyObject) {
    startThrough();
};

//play button

func startThrough() {
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTime"), userInfo: nil, repeats: true);

    let pauseButton = UIBarButtonItem(barButtonSystemItem: .Pause, target: self, action: "pauseIt");
    self.toolBarIt.items?.removeLast();
    self.toolBarIt.items?.append( pauseButton );
}

func pauseIt() {
    timer.invalidate();

    let play = UIBarButtonItem(barButtonSystemItem: .Play, target: self, action: "startThrough");
    self.toolBarIt.items?.removeLast();
    self.toolBarIt.items?.append( play );
}

1

Đây là một điều điên rồ của táo. Khi bạn nói self.navlationItem.rightBarButtonItem.title thì nó sẽ nói không trong khi trên GUI, nó hiển thị Chỉnh sửa hoặc Lưu. Fresher thích tôi sẽ mất rất nhiều thời gian để gỡ lỗi hành vi này.

Có một yêu cầu là Mục sẽ hiển thị Chỉnh sửa trong tải firt sau đó người dùng nhấn vào nó. Nó sẽ thay đổi thành Lưu tiêu đề. Để lưu trữ này, tôi đã làm như dưới đây.

// xem đã tải sẽ nói Chỉnh sửa tiêu đề

private func loadRightBarItem() {
    let logoutBarButtonItem = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(handleEditBtn))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem
}

// nhấn Chỉnh sửa mục sẽ thay đổi thành Lưu tiêu đề

@objc private func handleEditBtn() {
    print("clicked on Edit btn")
    let logoutBarButtonItem = UIBarButtonItem(title: "Save", style: .done, target: self, action: #selector(handleSaveBtn))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem
    blockEditTable(isBlock: false)
}

// nhấn Lưu mục sẽ hiển thị Chỉnh sửa tiêu đề

@objc private func handleSaveBtn(){
    print("clicked on Save btn")
    let logoutBarButtonItem = UIBarButtonItem(title: "Edit", style: .done, target: self, action: #selector(handleEditBtn))
    self.navigationItem.rightBarButtonItem  = logoutBarButtonItem

    saveInvitation()
    blockEditTable(isBlock: true)

}

1

iOS 11

Đặt nút tùy chỉnh bằng ràng buộc:

let buttonWidth = CGFloat(30)
let buttonHeight = CGFloat(30)

let button = UIButton(type: .custom)
button.setImage(UIImage(named: "img name"), for: .normal)
button.addTarget(self, action: #selector(buttonTapped(sender:)), for: .touchUpInside)
button.widthAnchor.constraint(equalToConstant: buttonWidth).isActive = true
button.heightAnchor.constraint(equalToConstant: buttonHeight).isActive = true

self.navigationItem.rightBarButtonItem = UIBarButtonItem.init(customView: button)

0
func viewDidLoad(){
let homeBtn: UIButton = UIButton(type: UIButtonType.custom)

        homeBtn.setImage(UIImage(named: "Home.png"), for: [])

        homeBtn.addTarget(self, action: #selector(homeAction), for: UIControlEvents.touchUpInside)

        homeBtn.frame = CGRect(x: 0, y: 0, width: 30, height: 30)

        let homeButton = UIBarButtonItem(customView: homeBtn)


        let backBtn: UIButton = UIButton(type: UIButtonType.custom)

        backBtn.setImage(UIImage(named: "back.png"), for: [])

        backBtn.addTarget(self, action: #selector(backAction), for: UIControlEvents.touchUpInside)

        backBtn.frame = CGRect(x: -10, y: 0, width: 30, height: 30)

        let backButton = UIBarButtonItem(customView: backBtn)
        self.navigationItem.setLeftBarButtonItems([backButton,homeButton], animated: true)
}

}
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.