1. 程式人生 > >iOS開發技巧-Swift版本: 3.Storyboard傳參小技巧

iOS開發技巧-Swift版本: 3.Storyboard傳參小技巧

在前面, 我們知道用回撥函式進行傳參, 但那只是傳參的一種方式, 現在讓我們來看看第二種傳參的方法.

1.搭建介面

1.全域性介面
1

2.介面細節
2

PS: 下面這個操作需要在編碼準備裡的ViewController定義好@IBAction func saveToMainViewController(segue: UIStoryboardSegue) {} 方法才會顯示

3

4

5

6

2.編碼準備

在真正寫程式碼之前, 我們需要關聯控制元件, 以及宣告變數.
1.ViewController

class ViewController: UIViewController
, UITableViewDelegate, UITableViewDataSource {
var models = ["張三", "李四", "王五", "陳六", "趙七"] @IBOutlet var myTableView: UITableView! override func viewDidLoad() { super.viewDidLoad() myTableView.delegate = self myTableView.dataSource = self } // 宣告一個方法, 從TableViewControllerOne回傳資料到ViewController
@IBAction func saveToMainViewController(segue: UIStoryboardSegue) { // 1.獲取到TableViewControllerOne並且賦給變數data let data = segue.sourceViewController as! TableViewControllerOne // 2.獲取到TableViewControllerOne裡的index索引, 並且把TableViewControllerOne裡的editModel存到對應的models裡 models[data.index!] = data.editModel! // 3.重新整理TableView
myTableView.reloadData() }

2.TableViewControllerOne

    @IBOutlet var editTextField: UITextField!

    var index: Int?
    var editModel: String?
    var modelArray: [String]!


    override func viewDidLoad() {
        super.viewDidLoad()
        //
        editTextField.text = modelArray[index!]
    }

3.開始實現

1.ViewController

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return models.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("tableCell", forIndexPath: indexPath) as! UITableViewCell
        cell.textLabel?.text = models[indexPath.row]
        return cell
    }

    // 操作體驗優化
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // 1.每當點中TableViewCell之後, 都會恢復原來的樣式
        myTableView.deselectRowAtIndexPath(indexPath, animated: true)
    }

    // 重寫連線
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // 1.在Storyboard裡給連線命名為edit
        if segue.identifier == "edit" {

            // 2.宣告path變數為myTableView為當前所點選的indexPath
            var path = myTableView.indexPathForSelectedRow()

            // 3.獲取到TableViewControllerOne並且賦給變數detailTableViewController
            var detailTableViewController = segue.destinationViewController as! TableViewControllerOne

            // 4.設定detailTableViewController裡的變數index為myTableView當前所點選的indexPath
            detailTableViewController.index = path?.row

            // 5.設定detailTableViewController裡的modelArry陣列為myTableView的models陣列
            detailTableViewController.modelArray = models
        }
    }

2.TableVIewControllerOne

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // 1.判斷當前所展示的tableViewCell是否為條件所示
        if indexPath.section == 0 && indexPath.row == 0 {
            // 2.如果成立, editTextField就為第一響應者
            editTextField.becomeFirstResponder()
        }
        // 體驗優化
        // 3.判斷結束之後, 如果誤點中Cell, 那麼就取消選中Cell
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
    }

    // 重寫連線
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // 1.判斷segue的indentifier是否為save
        if segue.identifier == "save" {
            // 2.如果判斷為真, 那麼就把editTextField的內容存入到editModel
            editModel = editTextField.text
        }
    }

4.最終效果

1

好了, 這次我們就講到這裡, 下次我們繼續~~