iOS開發技巧-Swift版本: 3.Storyboard傳參小技巧
阿新 • • 發佈:2018-12-30
在前面, 我們知道用回撥函式進行傳參, 但那只是傳參的一種方式, 現在讓我們來看看第二種傳參的方法.
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.最終效果
好了, 這次我們就講到這裡, 下次我們繼續~~