Swift4 Day72:做一個待辦事項Todoey2

Swift4 / iOS11 / 2017.01.07/Core data大師:D

Alice
Daily Swift
7 min readJan 7, 2018

--

出自: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

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選起來

按著Control拉著SearchBar到黃色圈

extension

如果加上//MARK: — Search Bar methods在Section分類上就會更清楚

with request內外使用不同的名稱在loadItem(with: request)

==後面是預設(用於viewdidload)

--

--