Swift4 Day72:做一個待辦事項Todoey2
Swift4 / iOS11 / 2017.01.07/Core data大師:D
出自:iOS 11 & Swift 4 — The Complete iOS App Development Bootcamp
Q:為什麼勾選hello Alice時往下滑的d也會自動勾選呢?
A:因為dequeueReusableCell會重複使用,在畫面看得到的地方時讀入資料,所以你讀不到helloAlice時會將記憶體給下面的cell使用,就會勾到g
DEBUG:
要讓checkmark不是綁在cell而是綁在資料,用model設一個新的class,用done來做判斷。
TodoListViewController
設一個itemArray = [Item]()
跟newItem=Item()
用if跟else判斷itemArray[indexPath.row]的done屬性,可以用
itemArray[indexPath.row].done = !itemArray[indexPath.row].done
代替下面五行程式碼,太酷了石頭😳
然後要記得tableView.reloadData才會傳到cellForRowAt的function
Ternary operator ==>
公式:value = condition ? valueIftrue : valueFalse
一樣用 cell.accessoryType = item.done == true ? .checkmark : .none代替下面的五行程式碼,太酷惹石頭😤~Advanced Swift~
因為程式碼一直重複itemArray[indexPath.row]所以就用item代替,可以減少行數與錯誤率。
在addButtonPressend主要是將儲存位子改到itemArray
let newItem = Item()
newItem.title = textField.text!
self.itemArray.append(newItem)
按下+試著存東西到User Defaults,會Thread 1: signal SIGABRT
因為在User Defaults中只能用standard data(原先設定的itemArray中的東西)不能用custom type(另外用+新增的item),簡單來說就是不能從客戶端存東西。
Encoding Data with NSCoder
1.先把AppDelegate中printNSSearchPathForDirectoriesInDomains那串刪掉
2.在viewDidLoad中建立一個DataFilePath然後print出來
3.會在console拿到一串url貼到terminal上再到Preferences會看到plist
4.在appendingPathComponent(“Item.plist”),把之後要產生的檔案命名為Item.plist
5.寫一個func將存原先在User Defaults的改存在encoder
然後在didSelectRowAt與UIAlertAction中加上self.saveItem()
6. Item加屬性Encodable
7.左邊是用encoder存起來的資料顯示為Array
右邊是User Defaults則是用Dictionary只能接受少量的Data type
這樣存新資料時就不會顯示Thread 1: signal SIGABRT
最後我們還是要用Coredata
開一個coredata檔案把AppDelegate的東西複製到Todey裡
然後建立一個DataModel.xcdatamodeld把Item刪掉
在AppDelegate中的persistentContainer前方lazy加在var前面代表什麼?
lazy就是因為很懶所以當它需要時才會被loading(CS193P中有相同觀念)
也可以節省記憶體
在TodoListViewController中,要用Application不能直接用AppDelegate.persistentContainer.viewContext因為AppDelegate是class要跨檔案使用要讓AppDelegate變成delegate
解法:(UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
Reading Data from Core Data (Read in CRUD)
在開始畫面讀入database
Search Bar
SearchBar前置作業:先放到UI上>UISearchBarDelegate>按著Control拉著SearchBar到黃色圈把delegate選起來
extension
如果加上//MARK: — Search Bar methods在Section分類上就會更清楚
with request內外使用不同的名稱在loadItem(with: request)
==後面是預設(用於viewdidload)