iOS开发技巧-Swift版本: 3.Storyboard传参小技巧
在前面, 我们知道用回调函数进行传参, 但那只是传参的一种方式, 现在让我们来看看第二种传参的方法.
1.搭建界面
1.全局界面
2.界面细节
PS: 下面这个操作需要在编码准备里的ViewController定义好@IBAction func saveToMainViewController(segue: UIStoryboardSegue) {} 方法才会显示
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.最终效果
好了, 这次我们就讲到这里, 下次我们继续~~