Controller: UIViewController {
2
3 var girlOldName:String?
4 weak var delegate: EditViewControllerDelegate?
5 @IBOutlet var girlNameTextField: UITextField!
6
7
8 override func viewDidLoad() {
9 super.viewDidLoad()
10 if self.girlOldName != nil {
11 self.girlNameTextField.text = self.girlOldName!
12 }
13 }
14
15 override func viewWillDisappear(animated: Bool) {
16 let name:String! = self.girlNameTextField.text
17 if name != "" {
18 if delegate != nil {
19 delegate!.fetchGirlName(name)
20 }
21 }
22 }
23
24 override func didReceiveMemoryWarning() {
25 super.didReceiveMemoryWarning()
26 }
27
28 deinit {
29 print("释放")
30 }
31 }
2.上面的代码是实现编辑页面并实现相应的委托协议,下方就是要从之前TableView中进行跳转。也就是点击TableView的每一行,然后跳转到编辑页面对其当前点击的cell进行编辑,编辑后返回通过代理进行值的修改。
(1)首先要解决的就是点击Cell跳转到EditViewController, 要执行这个事件,我们还必须实现TableView的另一个协议,就是UITableViewDelegate, 以为点击Cell的事件获取的方法就在TableViewDelegate中。所以我们要在TableView所在的ViewController中的viewDidLoad()中指定UITableViewDelegate的委托代理者。如下所示。同时该ViewContoller也要实现UITableViewDelegate协议。
1 self.myTableView.delegate = self
(2) 实现UITableViewDelegate协议中点击Cell的方法,方法中的内容如下所示。在该方法中,首先我们要暂存一下点击的是哪个Cell, 也就是记录一下点击Cell的IndexPath, 然后就是获取点击的Cell对象,因为通过该Cell对象,可以获取相应Cell上的数据。具体的不多说了,请看代码中的注释。
1 //-----------UITableViewDelegate------------------
2 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
3
4 //记录当前点击的IndexPath
5 self.selectIndexPath = indexPath
6
7 //获取当前点击的Cell对象
8 let currentSelectCell:BeautifulGrillCell? = self.myTableView.cellForRowAtIndexPath(indexPath) as? BeautifulGrillCell
9
10 //从storyboard中实例化编辑视图控制器
11 let editViewController:EditViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("EditViewController") as! EditViewController
12
13 //指定编辑视图控制器委托代理对象
14 editViewController.delegate = self
15
16 //把点击Cell上的值传递给编辑视图控制器
17 if currentSelectCell != nil {
18 editViewController.girlOldName = currentSelectCell!.girlNameLable.text!
19 }
20
21 //push到编辑视图控制器
22 self.navigationController?.pushViewController(editViewController, animated: true)
23 }
(3)上面是跳转,接下来就是要实现EditViewControllerDelegate中的回调方法,来处理相应的回调参数了。下方就是在表视图中实现的回调方法,具体请看代码中的注释:
1 //-----------EditViewControllerDelegate------------------
2
3 func fetchGirlName(name: String) {
4
5 if selectIndexPath != nil {
6 //获取当前点击Cell的索引
7 let index = (selectIndexPath?.row)!
8
9 //更新数据源中相应的数据
10 self.dataSource![index][GIRL_NAME] = name
11
12 //重载TableView
13 self.myTableView.reloadData()
14 }
15
16 }
经过上面的步骤,我们就可以去定义属于自己的协议,并在此协议上实现委托回调了。上面的场景在iOS开发中极为常见,使用场景也是比较广泛的。所以协议无论在Swift还是在iOS开发中都是极为重要的概念之一。好今天的博客内容也挺多的了,就到此为止,剩下的东西,会在以后的博客中继续更新。
上面实例GitHub分享地址(基于Xcode7.1):https://github.com/lizelu/SwiftDelegateDemo
|