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


好了, 这次我们就讲到这里, 下次我们继续~~

posted @ 2015-05-29 01:20  背着吉他去流浪  阅读(504)  评论(0编辑  收藏  举报