# Adding new delegate

## ทำให้ปุ่ม Checkmark ใช้งานได้

ทีนี้เราก็เหลืออย่างเดียวละ คือทำให้ปุ่ม checkmark สามารถ toggle ค่า isDone ได้

เนื่องจาก TodoItemTableViewCell เป็น View เราจะไม่แก้ไข TodoItem เอง เราจึงสร้าง delegate ขึ้นมาใหม่เพื่อให้ Controller เราที่เป็นคนใช้ View นี้จัดการกับ Model เอง

เพิ่ม Protocol **TodoItemTableViewCellDelegate** กำหนดฟังก์ชั่น 1 อัน เพื่อเรียกว่าปุ่ม Checkbox โดนกดแล้วนะ

สร้างตัวแปรเก็บ delegate แก้ให้ **configure(item:)** รับ delegate ด้วย พร้อมกับสร้าง Action สำหรับรับ event ตอนปุ่มโดนกด โดยจะเรียกกลับไปที่ delegate

{% code title="TodoItemTableViewCell.swift" %}

```swift
import UIKit

protocol TodoItemTableViewCellDelegate:class {
    func todoItemTableViewCellDidTapCheckboxButton(cell: TodoItemTableViewCell)
}

class TodoItemTableViewCell: UITableViewCell {

    weak var delegate: TodoItemTableViewCellDelegate?

    @IBOutlet weak var checkboxButton: UIButton?
    @IBOutlet weak var titleLabel: UILabel?

    func configure(item: TodoItem, delegate: TodoItemTableViewCellDelegate?) {
        titleLabel?.text = item.title
        checkboxButton?.setImage(UIImage(named: item.isDone ? "check": "uncheck"), for: .normal)
        self.delegate = delegate
    }
    
    @IBAction func checkboxButtonDidTap() {
        delegate?.todoItemTableViewCellDidTapCheckboxButton(cell: self)
    }

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}
```

{% endcode %}

จากนั้นผูกปุ่มกับ  Action ที่เราสร้างโดยให้เรียกเมื่อ Touch up inside นั่นคือแตะแล้วปล่อยบนปุ่ม

![](https://1168329629-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGk7Utff0rVWsqK4eYO%2F-LHMEVUWKNijWdN7C4qF%2F-LHMJaXxgWGVGXy3RP8T%2Fbinding2.gif?alt=media\&token=6c3243da-9d39-4a50-9fc9-1bf4e2e6ef97)

จากนั้นที่ ViewController ของเราให้ประกาศตัวเป็น **TodoItemTableViewCellDelegate** พร้อมส่งตัวเองเป็น delegate มาตอน configure cell ใน **tableView(\_:cellForRowAt:)**

```swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "todoItemCell", for: indexPath) as! TodoItemTableViewCell
    let item = todo.item(at: indexPath.row)
    cell.configure(item: item, delegate: self)
    return cell
}
```

จากนั้นเขียนฟังก์ชั่น delegate แบบนี้ เมื่อรับ event มาเราจะหาก่อนว่า cell ส่ง event มา เป็น cell ไหน todoItem อะไรที่เราต้องแก้ isDone แล้วสั่ง toggle พร้อมกับ reload ที่ cell นั้น

```swift
func todoItemTableViewCellDidTapCheckboxButton(cell: TodoItemTableViewCell) {
    if let indexPath = tableView?.indexPath(for: cell) {
        todo.item(at: indexPath.row).toggleIsDone()
        tableView?.reloadRows(at: [indexPath], with: .automatic)
    }
}
```

เป็นอันจบ ลองรันได้

![](https://1168329629-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGk7Utff0rVWsqK4eYO%2F-LHMEVUWKNijWdN7C4qF%2F-LHMKI4KL45OwSo0tDjR%2Ffinish.gif?alt=media\&token=472153f6-da9c-4c5e-9b24-024fde1c1771)
