2016年2月21日 星期日

iOS筆記:Swift練習(2)

由下面程式碼得知, 我們可以透過設定preferredStyle的參數來指定UIAlertController的樣式

.ActionSheet 跟 .Alert.

UIAlertAction的Style是一個有三個可能值的列舉

Default, Cancel, Destructive
style可以使用 UIAlertActionStyle.Default 或是 .Default皆可

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        //建立一個類似動作清單的選單
        let optionMenu = UIAlertController(title: nil, message: "What do you want to do", preferredStyle: .ActionSheet)
        //加入動作至選單中
        let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
        optionMenu.addAction(cancelAction)
        //呈現選單
        self.presentViewController(optionMenu, animated: true, completion: nil)
    }

為提示控制器加上動作

現在即是所謂的Closure, 類似於Obj-C中的Block. 可以在程式中做傳遞的程式碼區塊.
(action:UIAlertAction!) -> Void:參數以及回傳的型態.
in表示閉包的參數與回傳值型態的定義已經完成, 可以開始閉包的本體程式.

let callActionHandler = { (action:UIAlertAction!) -> Void in
            ...
        }

完整版:

let callActionHandler = { (action:UIAlertAction!) -> Void in
            let alertMessage = UIAlertController(title: "Service Unavailable", message: "Sorry, the call feature is not available yet. Please retry later.", preferredStyle: .Alert)
            alertMessage.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
            self.presentViewController(alertMessage, animated: true, completion: nil)
        }

        let callAction = UIAlertAction(title: "Call " + "123-456-\(indexPath.row)", style: UIAlertActionStyle.Default, handler: callActionHandler)
let callActionHandler = { (action:UIAlertAction!) -> Void in
            ...
        }

下面則為另外一種實現Closure的方式

let isVisitedAction = UIAlertAction(title: "I've been here", style: .Default, handler: {
            (action:UIAlertAction!) -> Void in
            let cell = tableView.cellForRowAtIndexPath(indexPath)
            cell?.accessoryType = .Checkmark
        })

程式中的問號

上述程式中的Cell是一個Optional, 而Optional只是表示是否有值, 所以上述程式的意思就是Swift會先幫你確認Cell是否存在, 如果存在的話可以允許設定accessoryType的值.

Cell的右邊空間主要是預留給Accessory view:
1. Disclosure indicator
2. Detail disclosure
3. Checkmark
4. Detail

增加刪除列

只要新增以下程式碼就可以看到刪除的選項出現, 至於刪除按鍵點下去後會發生什麼事情就是在大括號內實作:

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        <#code#>
    }

或是透過tableView的deleteRowsAtIndexPaths方法來刪除特定列, 還可以選擇刪除的動畫如:.Right, .Left, .Top .Fade

UITableViewRowAction

這個類別可以對表格視圖自訂動作, 想要加入動作到Row上的話, 只要實作以下:

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
        <#code#>
    }

當你利用這個方式來新增功能的時候在上面所提到的刪除列的方式就不適用. 需要改透過RowActionh才行.

用法:可以指定標題, 樣式以及當下使用者按下按鈕時會執行的程式碼.
以下我們設定了一個Share的動作, 當使用者按下後, 會帶出一個Activity Controller來使用社群分享功能.

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {

        let shareAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Share", handler: {
            (action,indexPath) -> Void in
            let defaultText = "Just checking in at "+self.restaurantNames[indexPath.row]
            let activityController = UIActivityViewController(activityItems: [defaultText], applicationActivities: nil)
            self.presentViewController(activityController, animated: true, completion: nil)
        })

        let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete", handler: {
            (action, indexPath) -> Void in
            self.restaurantNames.removeAtIndex(indexPath.row)
            ...
            self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        })
        return [shareAction, deleteAction]
    }

UIActivityViewController

一個提供數種服務的View Controller, 像是複製項目到剪貼簿, 分享內容到社群網站…等, 只需要建立UIActivityViewController的實體以及訊息, 然後將控制器呈現在畫面上即可.

按鈕的顏色預設是紅色的, 客製化方式如下.

shareAction.backgroundColor = UIColor.blueColor()
        deleteAction.backgroundColor = UIColor(red: 202.0/225.0, green: 202.0/225.0, blue: 203.0/225.0, alpha: 1.0)

Segue

在iOS9中有以下幾種型態
1. Show:一般常見的移動到下一個視窗後有返回按鈕的都是這個.
2. Show Detail:和Show類似但是不會有返回按鈕.
3. Present Modally:以Modal型態呈現. 視窗將會以動畫的方式從底部出現.
4. Present as Popover:將內容以固定點彈跳框來呈現.

Note:CMD + /可以將框起來的部分code註解/取消註解.

最重要的則是要覆寫以下:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "ShowRestaurantDetail" {
            if let indexPath = tableView.indexPathForSelectedRow {
                let destinationController = segue.destinationViewController as! RestaurantDetailViewController
                destinationController.restaurantImage = restaurantImages[indexPath.row]
            }
        }
    }

沒有留言:

張貼留言