์๋ ํ์ธ์๐
์ด์ ๋ todolist๋ฅผ ๋ณด์ฌ์ค ํ ์ด๋ธ๋ทฐ๊ณผ todolist์ ์๋ฃ๋ฅผ ํ์ํ ์ ์๋ ์ฒดํฌ ๋ฐ์ค ๋ฒํผ์ ๊ตฌํํ์๋๋ฐ์.
[ Project ] todoList ๊ตฌํํ๊ธฐ #1
์ค๋์ ์ทจ์์ ๊ตฌํ๊ณผ todolist์ ๋ค๋น๊ฒ์ด์
์ปจํธ๋กค๋ฌ๋ฅผ ์ถ๊ฐํ์ฌ edit
๋ฒํผ๊ณผ add
๋ฒํผ์ ๊ตฌํํ์์ต๋๋ค.
๋ํ ์ถ๊ฐ์ ์ผ๋ก ๋ฐ์ดํฐ ๋งค๋์ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ฐ์ดํฐ๋ ๋ถ๋ฆฌ๋ฅผ ํด์ฃผ๊ณ ,
todolist์ ์ ๋ ฌ์ ๋ฐ๊พธ์ด์ฃผ๋ ๊ธฐ๋ฅ๋ ๊ตฌํ์ ํด๋ณด์์ด์!!
์์ํด ๋ด ์๋คโจ
์ทจ์์ ๊ตฌํ
todo ์๋ฃ ์์ ์๋ฃํ ๋ถ๋ถ๊ณผ ๋ฏธ์๋ฃํ ๋ถ๋ถ์ ๊ตฌ๋ถ์ ์ํด์ ์ทจ์์ ์ ์ถ๊ฐํ๊ณ ๊ธ๊ผด ์์ ๋ฐ๊พธ์ด์ฃผ์์ด์.
์ฐ์ ์ทจ์์ ์ ๊ตฌํํ๊ธฐ ์ํด์๋ AttributedString์ ๋ํ ์ดํด๊ฐ ํ์ํฉ๋๋ค!
AttributedString์ด๋?
๋ฌธ์์ด, ๋ฌธ์์ด ๊ฐ๊ฐ์ ์์, ๋ฌธ์์ด์ ๋ฒ์์ ๊ด๋ จ๋ ์์ฑ์ ๊ด๋ฆฌํ๋ ๊ฒ์
๋๋ค. ๋ฌธ์์ด๊ณผ ๊ด๋ จ๋ ์์ฑ์ ํฐํธ๋ ํฐํธ์ ์ฌ์ด์ฆ, ํฐํธ ์ฌ์ด์ ๊ฐ๊ฒฉ, ํฐํธ ์์ ๋ฑ๋ฑ์ ์ด์ผ๊ธฐํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ NSAttributedString
๋ ์ฝ๊ธฐ ์ ์ฉ ์์ฑ ๋ฌธ์์ด์ ๋ํ, NSMutableAttributedString
์ ์์ ๊ฐ๋ฅํ ์์ฑ ๋ฌธ์์ด์ ๋ํ ํ๋ก๊ทธ๋จ ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํฉ๋๋ค.
์ด์จ๋ NSAttributedString์ ๋ฌธ์์ด์ ์์ฑ์ ๋ณด์ฌ์ฃผ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๊ฑฐ์ฃ !
[ NSAttributedString์ key ์ข ๋ฅ ]
์ฌ๊ธฐ์ ์ทจ์์ ์ ๊ตฌํํ๋ ์์๋ strikethroughStyle
์
๋๋ค. ๊ทธ๋์ ์ String์ด๋ผ๋ ๋ฌธ์์ด์ ํ์ฅํ์ฌ ๋ฌธ์์ด์ ์ทจ์์ ์ ์ถ๊ฐํ๋ ๋ฉ์๋๋ฅผ ์ ์ธํ์์ด์.
extension String {
func strikeThrough() -> NSAttributedString {
let attributeString = NSMutableAttributedString(string: self)
attributeString.addAttribute(NSAttributedString.Key.strikethroughStyle, value: NSUnderlineStyle.single.rawValue, range: NSMakeRange(0, attributeString.length))
return attributeString
}
}
attributeString์ด๋ผ๋ ๋ณ์์ NSMutableAttributedString(String: self)
์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , ํด๋น ์ธ์คํด์ค์ ๋ด๋ถ ํจ์์ธ addAttribute
ํจ์๋ฅผ ์ฌ์ฉํด ์ทจ์์ ์คํ์ผ์ ์ ์ฉํ์์ต๋๋ค.
todo๋ฅผ ์๋ฃํ์์ ๋, ์ฒดํฌ ๋ฐ์ค๊ฐ ์ฒดํฌ๋๊ณ ํด์ ๋จ์ ๋ฐ๋ผ ์ทจ์์ ๋ ๊ทธ์ด์ง๊ณ , ์ ๊ฑฐ๋ผ์ผ ํ๋ ์ทจ์์ ์ด ์ง์์ก์ ๋์ ๋ฉ์๋๋ ๊ตฌํ์ ํ์์ต๋๋ค.
extension String {
func removeStrikeThrough() -> NSAttributedString {
let attributeString = NSMutableAttributedString(string: self)
attributeString.addAttribute(NSAttributedString.Key.strikethroughStyle, value: 0 , range: NSMakeRange(0, attributeString.length))
return attributeString
}
}
์ด์ ์ทจ์์ ์ ๋์ ํด ๋ด ์๋ค. ์ด์ ๊ตฌํํ checkButton์ด ์ ํ๋๊ณ ํด์ ๋จ์ ๋ฐ๋ผ ๋ณํ์์ผฐ๋ checkButtonTapped ํจ์์ ์ ์ฉ์ ํด๋ณด์์ด์. sender.isSelected ๊ฐ true๋ผ๋ ๊ฒ์ Selected ํจ์๊ฐ ํ์ฑํ๋์์ ๋์ด๋ฏ๋ก checkButton์ ๋๋ฅด๋ฉด ๋นํ์ฑํ ์ํ๋ก ๋ค์ ๋ง๋ค์ด์ผ๊ฒ ์ฃ ?ใ
@IBAction func checkButtonTapped(_ sender: UIButton) {
if sender.isSelected {
sender.isSelected = false
todoText.textColor = UIColor.black
todoText.font = UIFont.systemFont(ofSize:18)
todoText.attributedText = todoText.text?.removeStrikeThrough()
}else {
sender.isSelected = true
todoText.textColor = UIColor.darkGray
todoText.font = UIFont.systemFont(ofSize:18)
todoText.attributedText = todoText.text?.strikeThrough()
}
}
์ถ๊ฐ์ ์ผ๋ก ํฐํธ์ ์์๋ ๋ณ๊ฒฝ์ ํด์ฃผ์์ต๋๋ค.
๊ตฌํํ ํ๋ฉด
๋ค๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ Edit ๋ฒํผ๊ณผ Add ๋ฒํผ ๊ตฌํ
์ฐ์ ๋ค๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ๋ถํฐ ์ถ๊ฐํด ๋ด ์๋ค.
[ ๋ค๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ ์ถ๊ฐ ๋ฐฉ๋ฒ ]
์ด๋ฏธ ๋ฉ์ธํ๋ฉด์ ๊ตฌํํ ๋ค์ ๋ค๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ์์๋ด ์๋ค!
์ฐ์ Main.storyboard์์ ์ถ๊ฐํ๊ณ ์ถ์ ํ๋ฉด์ ViewController๋ฅผ ํด๋ฆญํ ๋ค์
์ค๋ฅธ์ชฝ ์๋์ ํ๋จ์ ๋นจ๊ฐ ํ ๋๋ฆฌ ์์ด์ฝ์ ํด๋ฆญํ ํ Navigation Controller๋ฅผ ๋๋ฌ์ฃผ๋ฉด ๋์ ๋๋ค!
๋ค๋น๊ฒ์ด์ Controller๋ฅผ ์ถ๊ฐํ๋ค๋ฉด, ์ด์ Edit ๋ฒํผ์ ์์ฑํด์ผ๊ฒ ์ฃ ?!
์ด๊ฒ๋ ์์ฃผ์์ฃผ ์ฌ์์!!
[ ๋ค๋น๊ฒ์ด์ ๋ฐ์ ๋ฒํผ ์ถ๊ฐํ๊ธฐ ]
shift + cmd + L
๋จ์ถํค ๋๋ฌ ์๋์ ํ๋ฉด์ด ๋ฌ๋ค๋ฉด ๊ฒ์์ฐฝ์ button ๊ฒ์ํฉ๋๋ค!
Bar Button Item์ ๋๋๊ทธํ์ฌ Navigation Item ์๋์ ์์นํ๋๋ก ์ก์ ํ ๋๊ธฐ
์์ ๊ทธ๋ฆผ๋๋ก ์ถ๋ ฅ์ด ๋์๋ค๋ฉด, ์๋ง Right Bar Button Items ์๋ ์ด๋ฏธ ๋ฒํผ์ด ํ๋๊ฐ ์์ ๊ฑฐ์์!
๋ง์ฝ ์๋ค๋ฉด ์์ ๋ฐฉ๋ฒ์ ๋๊ฐ์ด ํ์ฌ Bar Button Items์ Left Bar Button Items ์๋๋ Right Bar Button Items ์๋์ ์ถ๊ฐํ์๋ฉด ๋ฉ๋๋ค!!
์ ๋ ์ค๋ฅธ์ชฝ์ Edit ๋ฒํผ์ ์ผ์ชฝ์ Add ๋ฒํผ์ ์ถ๊ฐํ์์ด์!
Edit ๋ฒํผ ๊ตฌํํ๊ธฐ
- Editting ๋ชจ๋๋ก ๋ณ๊ฒฝํ๊ธฐ
- Editting ๋ชจ๋๋ก ๋ณ๊ฒฝ๋์์ ๋, ๋ฒํผ ์ด๋ฆ ๋ณ๊ฒฝํ๊ธฐ
๊ตฌํํ๊ณ ์ถ์ Edit ๋ฒํผ์ ํด๋ฆญํ ํ Attribute ๋ฐ์ System Item
์ Edit
๋ก ๊ตฌํํ๋ฉด ๋๋๋ฐ์! ์ ๋ Edit ๋ฒํผ์ด ํด๋ฆญ๋์์ ๋ Done์ผ๋ก ํ
์คํธ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ด์ System Item
์ Custom
์ผ๋ก Bar Item์ Title์ "Edit"์ผ๋ก ๋ณ๊ฒฝํด ์ฃผ์์ต๋๋ค.
EditButton์ ๋๋ ์ ๋ Editing ๋ชจ๋์ Edit ๋ฒํผ์ ์ด๋ฆ์ ๋ณ๊ฒฝํด ์ฃผ๊ธฐ ์ํด์๋ ํด๋น ๋ฒํผ๊ณผ @IBOutlet / @IBAction์ ์ฐ๊ฒฐ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
class ViewController: UIViewController {
// editButton ์ฐ๊ฒฐ
@IBOutlet weak var editButton: UIBarButtonItem!
@IBOutlet weak var date: UILabel!
@IBOutlet weak var tableview: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
setting()
setTitle()
}
// edit Button์ด ๋๋ ธ์ ๋ ๋ฒํผ ์ด๋ฆ ๋ณ๊ฒฝํ๊ธฐ -> ์ถ๊ฐ๋ชจ๋๋ก ๋ณํ
@IBAction func editButtonTapped(_ sender: UIBarButtonItem) {
if self.tableview.isEditing {
// editing ๋ชจ๋ ๋นํ์ฑํ
self.editButton.title = "Edit"
self.tableview.setEditing(false, animated: true)
} else {
// editing ๋ชจ๋ ํ์ฑํ
self.editButton.title = "Done"
self.tableview.setEditing(true, animated: true)
}
}
}
์์ ์ฝ๋์ ๊ฐ์ด ๋ฒํผ๊ณผ ViewController๋ฅผ ์ฐ๊ฒฐํ๊ณ , ๋ฒํผ์ด ๋๋ ธ์ ๋ Editing ๋ชจ๋๋ฅผ ํ์ฑํํ๋ ์ฝ๋๋ฅผ ๊ตฌํํฉ๋๋ค.
์ถ๊ฐ์ ์ธ ์ฝ๋ ์ค๋ช ์ ์๋์ ๊ฐ์ต๋๋ค.
- self.tableview.isEditing
: ํ ์ด๋ธ ๋ทฐ๊ฐ editing ๋ชจ๋์ธ์ง ์๋์ง๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋ ์ ๋ ฅํ๋ ์์
- self.editButton.title = "Edit"
: ๋ฒํผ์ title์ ๋ณ๊ฒฝ
- self.tableview.setEditing(true, animated: true)
: ํ ์ด๋ธ ๋ทฐ๋ฅผ Editing ๋ชจ๋๋ก ํ์ฑํ
๊ตฌํํ ํ๋ฉด
Add ๋ฒํผ ๊ตฌํํ๊ธฐ
- Editing ๋ชจ๋์ผ ๋๋ง Add ๋ฒํผ ๋ณด์ด๊ธฐ
์์ Edit ๋ฒํผ์ ๊ตฌํํ ๊ฒ๊ณผ ๋์ผํ๊ฒ Add ๋ฒํผ์ ๊ตฌํํด ๋ด ์๋ค!
๊ทธ๋ฆผ์์ ๋ณด์ด์ง๋ ์์ง๋ง Edit ๋ฒํผ ๋ฐ๋ํธ์ Add ๋ฒํผ์ด ์กด์ฌํฉ๋๋ค. ํ์ฌ ๋ณด์ด์ง ์๋ ์ด์ ๋ ์ ๊ฐ Drawing
์ Hidden
์ ์ฒดํฌํด ๋๊ธฐ ๋๋ฌธ์ธ๋ฐ์?! ์ ๋ Edit ๋ชจ๋์ผ ๋๋ง todo ๋ฆฌ์คํธ๋ฅผ ์ถ๊ฐํ ์ ์์์ผ๋ฉด ์ข๊ฒ ์ด์ ๊ธฐ๋ณธ ํ๋ฉด์์๋ ๋ฒํผ์ ์จ๊ฒจ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ System Item
์์ Add
๋ฅผ ์ ํํด ์ฃผ์๋ฉด ๋ฉ๋๋ค!
class ViewController: UIViewController {
@IBOutlet weak var editButton: UIBarButtonItem!
@IBOutlet weak var addButton: UIBarButtonItem!
@IBOutlet weak var date: UILabel!
@IBOutlet weak var tableview: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
dataManager.makeListData()
setting()
}
// edit Button์ด ๋๋ ธ์ ๋ ๋ฒํผ ์ด๋ฆ ๋ณ๊ฒฝํ๊ธฐ -> ์ถ๊ฐ๋ชจ๋๋ก ๋ณํ
@IBAction func editButtonTapped(_ sender: UIBarButtonItem) {
if self.tableview.isEditing {
// editing ๋ชจ๋ ๋นํ์ฑํ
self.editButton.title = "Edit"
self.tableview.setEditing(false, animated: true)
// addButton ๋นํ์ฑํ / ์จ๊ธฐ๊ธฐ
self.addButton.isEnabled = false
self.addButton.isHidden = true
} else {
// editing ๋ชจ๋ ํ์ฑํ
self.editButton.title = "Done"
self.tableview.setEditing(true, animated: true)
// addButton ํ์ฑํ / ๋ณด์ด๊ธฐ
self.addButton.isEnabled = true
self.addButton.isHidden = false
}
}
// add Button์ด ๋๋ ธ์ ๋ ์ผ๋ฟ์ฐฝ ๋์ฐ๊ธฐ
@IBAction func addButtonTapped(_ sender: UIBarButtonItem) {
}
}
์์ ์ฝ๋์ ๊ฐ์ด ํด๋น Add ๋ฒํผ๊ณผ @IBOutlet / @IBAction ์ ์ฐ๊ฒฐ์ ํด์ฃผ์๊ณ ์! ์ฐ์ ์์์ ๊ตฌํํ๋ editButtonTapped ํจ์์ ๊ฐ๊ฐ editing์ด ํ์ฑํ๋๊ณ ๋นํ์ฑํ๋์์ ๋, add๋ฒํผ์ ํ์ฑํํ๊ณ ๋ณด์ด๋๋ก! add๋ฒํผ์ด ๋นํ์ฑํ๋๊ณ ๋ณด์ด์ง ์๋๋ก ๊ตฌํ์ ํ์์ต๋๋ค.
- self.addButton.isEnabled
: ๋ฒํผ์ด ํ์ฑํ๋๋์ง ์ ๋๋ ์ง๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋ ์ ๋ ฅ๋ฐ๋ ์์
- self.addButton.isHidden
: ๋ฒํผ์ ์จ๊น๋ชจ๋๋ฅผ ํ์ฑํํ๋์ง ์ ํ๋ ์ง๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋ ์ ๋ ฅ๋ฐ๋ ์์
๊ตฌํํ ํ๋ฉด
Add ๋ฒํผ ๋๋ ธ์ ๋ ์ผ๋ฟ์ฐฝ ๋์ฐ๊ธฐ
Add Button์ด ๋๋ ธ์ ๋, todoList๋ฅผ ์ถ๊ฐํ๋ ์ผ๋ฟ์ฐฝ์ ๊ตฌํํด ๋ด ์๋ค. ์ผ๋ฟ์ฐฝ์๋ title๊ณผ message์ ํ ์คํธ ํ๋๊ฐ ๋์ค๊ณ ํ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด ํ ์คํธ ํ๋๊ฐ ์ถ๊ฐ๊ฐ ๋๊ณ , ์ทจ์๋ฅผ ๋๋ฅด๋ฉด ํ ์คํธ ํ๋๊ฐ ์ถ๊ฐ๋์ง ์์ต๋๋ค.
// add Button์ด ๋๋ ธ์ ๋ ์ผ๋ฟ์ฐฝ ๋์ฐ๊ธฐ
@IBAction func addButtonTapped(_ sender: UIBarButtonItem) {
// ์ผ๋ฟ Controller๋ฅผ ์ฌ์ฉํ ์ผ๋ฟ์ฐฝ ์์ฑ
let alert = UIAlertController(title: "Add", message: "ํด์ผ ํ ์ผ์ ์
๋ ฅํด์ฃผ์ธ์.",
preferredStyle: .alert)
alert.addTextField{ tf in
// ํ
์คํธ ํ๋ ์์ ๊ธ
tf.placeholder = "to do"
}
// ํ์ธ ์ก์
๋ฒํผ ์์ฑ
alert.addAction(UIAlertAction(title: "ํ์ธ", style: .default, handler: { _ in
// ํ
์คํธ ํ๋ ๊ธ ๋ฐ์์ค๊ธฐ
guard let text = alert.textFields?[0].text else {return}
if text != "" {
// ๋ฐ์ดํฐ ๋ฉ๋์ ๋ฅผ ํตํ ๋ฆฌ์คํธ ์
๋ฐ์ดํธ
self.dataManager.updateTodoListData(text)
// ํ
์ด๋ธ๋ทฐ์ ๋ฐ์ดํฐ ๋ฆฌ๋ก๋
self.tableview.reloadData()
}
}))
// ์ทจ์ ์ก์
๋ฒํผ ์์ฑ
alert.addAction(UIAlertAction(title: "์ทจ์", style: .cancel, handler: nil))
self.present(alert, animated: true, completion: nil)
}
์์ addButtonTapped() ์ฝ๋์ ์ผ๋ฟ์ฐฝ์ ์ถ๊ฐํ๋ ํจ์๋ฅผ ๊ตฌํํ์์ต๋๋ค.
์ด๋ค ์๋ฏธ์ธ์ง ์ฝ๋๋ฅผ ํ๋ํ๋ ๋ฏ์ด๋ด ์๋ค!
- UIAlertController(title: "Add", message: "ํด์ผ ํ ์ผ์ ์
๋ ฅํด ์ฃผ์ธ์.", preferredStyle: .aleart)
: UIAlertController๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฟ์ฐฝ์ ์์ฑ
title (์ผ๋ฟ์ฐฝ์ ์ด๋ฆ), message (์ผ๋ฟ์ฐฝ์ ์ ๋ชฉ ๋ฐ์ ๋ค์ด๊ฐ ๋ฉ์์ง ๋ฌธ๊ตฌ), preferredStyle (. actionSheet์. alert ์ค ์ ํ)
-. actionSheet : ํ๋ฉด์ ์๋์ชฝ์ ์์นํ ์ฐฝ
-. alert : ํ๋ฉด์ ์ค๊ฐ์ ์์นํ ์ฐฝ
- tf.placeholder = "to do"
: ํ ์คํธ ํ๋์ placeholder ์ค์
placeholder๋? ํ ์คํธ๋ฅผ ์ ๊ธฐ ์ ์ ๋ณด์ด๋ ๊ธ
- alert.addTextField {}
: ์ผ๋ฟ ์ฐฝ์ TextField ์ถ๊ฐ
- alert.addAction()
: ์ผ๋ฟ ์ฐฝ์ Action ์ถ๊ฐ
- UIAlertAction(title: "ํ์ธ", style:. default, handler: { ํด๋ก์ })
: UIAlertAction ์ถ๊ฐ
title (์ผ๋ฟ ์ก์ ์ ์ด๋ฆ), style (. default,. cancel,. destructive ์ค ์ ํ ), handler(๋ฒํผ์ผ๋ก ์ธํด ์ํ๋ ์์ ์ฝ๋ ์ถ๊ฐ)
-. default : ์ผ๋ฐ์ ์ธ ์ฝ๋
-. cancel : ์คํ ์ทจ์
-. destructice : ๊ฐ์กฐํ๋ ์ฝ๋๋ก ๊ธ์จ ์์์ด ๋ค๋ฆ
- alert.textFields?[0].text
: TextFields ๋์ 0๋ถํฐ ์์ํ ๋ฌธ์์ด ์ถ์ถ
- self.tableview.reloadData()
: tableview ๋ค์ ๋ฆฌ๋ก๋
- self.present(alert, animated: true, completion: nil)
: ์ผ๋ฟ์ฐฝ ๋์ฐ๊ธฐ
๊ตฌํํ ํ๋ฉด
ListDataManager ํด๋์ค ์์ฑ
: ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ณ ๊ด๋ฆฌํ ์ ์๋ ListDataManager ํด๋์ค๋ฅผ ์์ฑํ์์ต๋๋ค. ์ธ๋ถ์์ todoList ๋ฐ์ดํฐ์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก private๋ก ๊ตฌํํ๊ณ , ํจ์๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋๋ก ๊ตฌํํ์์ต๋๋ค.
class ListDataManager {
private var todoListDataArray: [TodoData] = []
func makeListData() {
todoListDataArray = [
TodoData(id: 0, title: "์ค์ด์ฌ๊ธฐ", isChecked: false),
TodoData(id: 1, title: "ํค๋์
๊ณ ์น๊ธฐ", isChecked: false),
TodoData(id: 2, title: "์ฑ
์ฌ๊ธฐ", isChecked: false),
TodoData(id: 3, title: "์์์ ๋จน๊ธฐ", isChecked: false),
TodoData(id: 4, title: "๋ณ์ ๋ฐฉ๋ฌธ", isChecked: false),
TodoData(id: 5, title: "๋ฌผ 2L ๋ง์๊ธฐ", isChecked: false),
TodoData(id: 6, title: "๊ฐ์์ง ์ฐ์ฑ
์ํค๊ธฐ", isChecked: false),
TodoData(id: 7, title: "์๊ธฐ์๊ฐ ํ๊ธฐ", isChecked: false),
TodoData(id: 8, title: "iOS ๊ฐ์๋ฃ๊ธฐ", isChecked: false),
TodoData(id: 9, title: "TIL ์์ฑํ๊ธฐ", isChecked: false),
TodoData(id: 10, title: "์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ๊ธฐ", isChecked: false),
TodoData(id: 11, title: "์ด๊ณตํ๊ธฐ", isChecked: false),
]
}
func getTodoListData() -> [TodoData] {
return todoListDataArray
}
func updateTodoListData(_ title: String) {
let todo = TodoData(id: todoListDataArray.count + 1, title: title, isChecked: false)
todoListDataArray.append(todo)
}
func deleteTodoListData(_ row: Int) {
todoListDataArray.remove(at: row)
}
func insertTodoListData(_ row: Int, _ todoData: TodoData) {
todoListDataArray.insert(todoData, at: row)
}
}
๋ค๋น๊ฒ์ด์ Title์ UI Lable ์ถ๊ฐํ๊ธฐ
๋ค๋น๊ฒ์ด์ ๋ฐ๊ฐ ์ถ๊ฐ๋๋ฉด์ ์๋ ์๋ ์ ๋ชฉ์ด ์๋๋ก ๋ฐ๋ ค๋๊ฒ ๋์ด์ ๋ค๋น๊ฒ์ด์ ์ Title์ UILable์ ์ถ๊ฐํ๊ณ ๊ธฐ์กด์ todoList๋ ์ญ์ ๋ฅผ ํด์ฃผ๊ฒ ์ต๋๋ค.
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
dataManager.makeListData()
setting()
setTitle()
}
// ๋ค๋น๊ฒ์ด์
title์ UILabel ์ถ๊ฐํ๊ธฐ
func setTitle() {
let title = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 40))
title.textAlignment = .center
title.font = UIFont.init(name: "American Typewriter Bold", size: 29.0)
title.text = "Todo List"
self.navigationItem.titleView = title
}
}
๋ค๋น๊ฒ์ด์ title์ UILabel์ ์ถ๊ฐํ๋ setTitle() ํจ์๋ฅผ ์์ฑํ๊ณ viewDidLoad() ํจ์์ ์ถ๊ฐํด ์ค๋๋ค.
title์ UILabel๋ก ๊ตฌํํ์ฌ ํฐํธ์ ํ ์คํธ, ์ ๋ ฌ์ ์ค์ ํด ์ฃผ๊ณ , ๋ง์ง๋ง์ titleView๋ก ์ธํ ์ ํด์ฃผ์์ต๋๋ค.
Editing ๋ชจ๋์์ ์์ ์ญ์ ํ๊ธฐ / ์์ ์ด๋ํ๊ธฐ
Editing ๋ชจ๋๋ tableView์์ ์ค์ ์ด ๋๋ ์์์ด๊ธฐ ๋๋ฌธ์ ์ ๋ฒ ์๊ฐ์ ์์ฑํด ๋ ๋ณธ ํด๋์ค์ ๊ตฌ๋ถํ์ฌ UITableViewDataSource์ UITableViewDelegate ํ๋กํ ์ฝ์ ์ฑํํ ํ์ฅ ํด๋์ค์ ๊ตฌํ์ ํด ์ค ์์ ์ ๋๋ค.
extension ViewController: UITableViewDataSource, UITableViewDelegate {
// editing ๋ชจ๋์ ์คํ์ผ
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
return .delete
}
// editing ๋ชจ๋์์์ ์์ ์ญ์
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCell.EditingStyle.delete {
print("delete")
self.dataManager.deleteTodoListData(indexPath.row)
self.tableview.reloadData()
}
}
// editing ๋ชจ๋์์์ row ์ด๋๊ตฌํ
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
let todolistArray = dataManager.getTodoListData()
let targetList: TodoData = todolistArray[sourceIndexPath.row]
dataManager.deleteTodoListData(sourceIndexPath.row)
dataManager.insertTodoListData(destinationIndexPath.row, targetList)
}
}
์ฐ์ ์์์ ์ญ์ ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด editing Style
์ delete
๋ฅผ ์ถ๊ฐํด ์ฃผ์๊ณ , commit editingStyle์ด ํฌํจ๋ ํจ์์์ ์ญ์ ํ๋ ์์๋ฅผ ๊ตฌํํด ์ค๋๋ค. ๋ฐฐ์ด์์ ํด๋น ์์๋ฅผ ์ญ์ ํ ๋๋ ์์์ ์์ฑํ ๋ฐฐ์ด ์ญ์ ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ํ row์ ์ด๋์ ๊ตฌํํ๊ธฐ ์ํด ์ด๋์ํฌ ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ๊ณณ์ ์ ์ฅํด ๋ ๋ค ํด๋น ๋ฐฐ์ด์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฐฐ์ด์์ ์ญ์ ํด ์ฃผ๊ณ , ์ฎ๊ธด ๊ณณ์ ๋ฐฐ์ด์ ์ถ๊ฐํฉ๋๋ค. ์ด ๋๋ ๋ํ ์์์ ๊ตฌํํ deleteํจ์์ insertํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํฉ๋๋ค.
- func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {}
: tableView์ ํธ์ง๋ชจ๋๋ฅผ ์ค์ ํ ์ ์๋ ํจ์ - func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {}
: tableView์ ์ฝ์ ๊ณผ ์ญ์ ๋ฅผ ๊ฒฐ์ ํ ์ ์๋ ํจ์ - func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {}
: tableView์ cell์ ํน์ ์์น๋ก ์ด๋์ํฌ ์ ์๋ ํจ์
์์ฐ ์์
์๋ก์ด ๊ตฌํ๋ ๋ง์ด ํด๋ณด๊ณ , ๋ง๋๋ ๋๋ก ์์ ๋ง๋ค์ด์ ธ์ ์์ฃผ ์ฆ๊ฑฐ์ ๋ ํ๋ฃจ์์ด์.
์ฒ์์ ์ทจ์์ ๊ตฌํ์ด ํ๋ค์ด์ ์ฉ์ฉ๋งค๋ค๊ฐ NSAttributedString๋ถํฐ ๋ค์ ๊ณต๋ถ๋ฅผ ํ๊ฒ ๋์์ต๋๋ค. ๋ ์์ธํ๊ฒ ๊ณต๋ถํ์ฌ ๋ค์ ํฌ์คํ ์์ ์ ๋ก๋ํ๋๋ก ํ๊ฒ ์ต๋๋ค.ใ