Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> iOS

วิธีตั้ง Target และ Action ให้ UIBarButtonItem ใน Runtime

สร้าง 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) { }