สร้าง UIBarButtonItem และตั้ง Target-Action แบบ Dynamic ระหว่าง Run Time
โค้ดพื้นฐาน
class ViewController: UIViewController {
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
let barButton = UIBarButtonItem()
barButton.title = "Custom"
// หรือใช้ System Item
// let barButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(buttonTapped))
// Target-Action Pattern
barButton.target = self
barButton.action = #selector(buttonTapped)
// เพิ่มลง Navigation Bar
navigationItem.setLeftBarButton(barButton, animated: true)
// หรือ Right
// navigationItem.setRightBarButton(barButton, animated: true)
}
@objc func buttonTapped() {
print("🔘 Button pressed")
// Action logic here
}
}
ใช้กับ Custom View (Button พร้อม Icon)
let customButton = UIButton(type: .system)
customButton.setImage(UIImage(systemName: "gear"), for: .normal)
customButton.setTitle(" Settings", for: .normal)
customButton.sizeToFit()
customButton.addTarget(self, action: #selector(settingsTapped), for: .touchUpInside)
let barButton = UIBarButtonItem(customView: customButton)
navigationItem.rightBarButtonItem = barButton
@objc func settingsTapped() { print("Settings") }
หลายปุ่มพร้อมกัน
let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addTapped))
let editButton = UIBarButtonItem(barButtonSystemItem: .edit, target: self, action: #selector(editTapped))
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
toolbar.setItems([addButton, flexibleSpace, editButton], animated: true)
System Items พร้อมใช้งาน
.done, .cancel, .edit, .save, .add, .flexibleSpace, .fixedSpace.compose, .reply, .action, .organize, .bookmarks, .search, .refresh.camera, .trash, .play, .pause, .rewind, .fastForward
Target-Action Pattern
target- Object ที่มี Method (ปกติคือself)action- Selector ของ Method (#selector(methodName))- Method ต้องมี
@objcและรับ Parameter 0 หรือ 1 ตัว (sender)
// Valid Signatures
@objc func noParam() { }
@objc func withSender(_ sender: UIBarButtonItem) { }
@objc func withSenderEvent(_ sender: UIBarButtonItem, event: UIEvent) { }