史丹佛ios9教學

2016年12月17日 星期六

[SWIFT3]Costmos TableView Cell

// set the color in tableView header  

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let headerView = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 20))
    headerView.backgroundColor = .lightGray
    
    return headerView
    }

//set the height of tableViewHeader
    override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 22

    }

2016年12月15日 星期四

[SWIFT3] Error Handling

let request = NSURLRequest(URL: NSURL(string: "http://www.apple.com")!)
var response:NSURLResponse?
var error:NSError?

let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error)

if error == nil {
    print(response)

    // 解析資料

} else {
   // 處理錯誤
}



/////////////////////////////////////


let request = NSURLRequest(URL: NSURL(string: "http://www.apple.com")!)
var response:NSURLResponse?
var error:NSError?

do {
    let data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: &response)

    print(response)

    // Parse the data

} catch {
    // handle error
    print(error)
}

[SWIFT3]Protocol,Datasauce,Datadelegate

Delegate(委派) 最生活化的例子就是工具人(笑)
我是一個class,但是我有些事情不要親自動手,所以我使用一個工具人來幫我做事情
而這個任務模式就是委派(Delegate)

比起class 裡的繼承並覆寫(override func) Delegate方法可以讓更多的對象委託

魏巍老師說“某個類別的 跟detasource 就要實作他的方法”

委派就是當自己不想做,不能做時外包給別人做,而別人能不能做就要通過檢查看他是否有能力外包(Protocol)


更多的Delegate: HERE

2016年12月6日 星期二

[SWIFT3] Mini Project // My Book Shelf


原始storyBoard


















原始設計概念
第一頁:首頁(設計兩顆按鈕:紅色的那顆指向最後一個TableViewController,Scan鈕開啟掃描器執行掃描barCode的功能)
第二頁:設計來顯示比對資料庫後的結果若資料庫已存在顯示“XXX以在資料庫”按下按鈕挑轉第三頁TableViewController,若不存在資料庫則跳轉第二之一頁
第二之一頁:不存在資料庫的資料表示需要新增,在此給予掃描到的barCode資料,使用者自行輸入書名,按下按鈕新增資料並轉化畫面到第三頁TableViewControlelr(書庫)

實際執行難題
第一二三頁Navigation Controller包著,當執行改造計畫變更設計時,2-1的轉場方式便成為難題

第二頁存在的必要性

版本1.1
改進存檔方式,由原本的userDefault改進為 單純存取檔案,檔案預設為TXT

改進存檔結構,原始預設用struct來存取預計顯示的兩個變數ISBN,BOOKTITLE































原始預想從首頁接受到barCode值之後一路傳到最後一頁並存檔顯示
後來在改進版修正過程中發現,在ShelgTableViewController裡我自定義的一個Array內包含的Dictionary儲存格式並沒有用到一開始設定的struct,也就是第一版present時整體程式前後參數傳值其實不連貫,完全就是兩個部分呵呵呵(崩潰)

改進方案:
修正儲存結構,並開始使用struct
原本是在第3頁才儲存值並顯示,這次改為在2-1頁存檔並在第三頁讀取存檔然後顯示,這會引發一個問題,第二頁存在的必要性以及2-1頁因為沒有跟navigation controller連接所以若要更動轉場畫面會比較麻煩(EX:將2-1的按鈕 原本是按下去後轉場至第三頁並將畫面上的值傳給第三頁,改動後按下按鈕後就存檔,因為檔案已存入所以改為按下去後就dismiss回到第一頁,若要觀看剛剛存入的畫面,只要在第一頁上按下書庫按鈕即可)

待解決的問題:由於第二頁到2-1的轉場是present segue的方式,所以目前尚未找到方法可以直接回到第一頁,若在2-1使用dissmiss 則會回到第二頁

心得:
程式設計之初就得仔細思考並調整實際運作時的轉場,傳值,及資料儲存方式


Mini
Project 改進方案


使用CoreData 改進資料儲存的方法
改進現有資料儲存方法




















開發紀錄
1.解決串接Ali
2.傳值到新的頁面
3.與tableView串接

改進方案
1.tableView客製化,可以刪除單筆資料
2.使用coreData儲存
3.進階跨頁傳值(首頁新增按鈕到tableView)
4.放入









[SWIFT3] Array 陣列 vs Dictionary 字典

[Array] 陣列

由兩個方括號包起來,以下為一個水果的陣列

["apple", "banana", "peach", "guava"]

陣列最常拿來用的屬性就是陣列裡的index value

陣列裡的index Value 從0開始

var fruit = ["apple", "banana", "peach", "guava"]

fruit[0] // apple




=========
Dictionary 字典
關鍵字:  key, value
跟Array最大的不同是沒有排序·所以若需要存個有排序的值就不該用Dictionary
可以自定義dictionary裡的key 執行別與value值型別

["temperature": 75.0, "temperature2":  88.0]
   String                 Double

2016年12月2日 星期五

[SWIFT3] Basic Swift 基礎程式設計

"=" 等號 在程式設計裡 表示  assign
Ex:
      var a = 1 // 把1這個數值 assign進去a 這個變數
        b = a   // 把上一行的a 值 assign給b



==========
var number = [1,2,3,4,5]

number + [6]  //  [1,2,3,4,5,6]

number          // [1,2,3,4,5]   這邊的陣列沒有改變 原因是上一行的算式並沒有把值存到變數

若要改善這狀況 則程式碼得改為

var number = [1,2,3,4,5]

let number = number + [6]  //  [1,2,3,4,5,6]

number          // [1,2,3,4,5,7]   

[SWIFT]變數交換,透過第三個變數來達到變數交換的功能


//Define your name as a constant that constant name is myName, type: String
//Define your age as a constant that constant name is age, type: Int
//Define your height as a constant that name is height, type: Double
//Print “ Hello, my name is ______, I am ___years old. I am _____ cm tall.”

let myName: String = "PiHan"
let age: Int = 37
let height: Double = 180.0


print("Hello: my name is \(myName). I am \(age) years old. I am \(height) cm tall.")


// 變數交換: 假設有 a,b 兩個變數(常數),請交換兩者的值

var a = 0
var b = 1
print("a: \(a) b:\(b)")

var c = a
a = b
b = c

print("a: \(a) b:\(b)")

結語:通過第三方變數暫存交換中的值來達到交換的目的