# 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://144845262-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGk7Utff0rVWsqK4eYO%2F-LfNeczOnmYPwFV90OCY%2F-LfNegEFtRvYb0-9F4Wi%2F39.gif?alt=media\&token=2c2a9026-ca27-4541-92ca-fa52afc37ca6)

จากนั้นที่ 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).isDone.toggle()
        tableView?.reloadRows(at: [indexPath], with: .automatic)
    }
}
```

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

![](https://144845262-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LGk7Utff0rVWsqK4eYO%2F-LfNeczOnmYPwFV90OCY%2F-LfNffY_D0qRob6AeeVM%2F40.gif?alt=media\&token=67a3ce12-4700-4dc8-b10b-e0111cb5842f)
