下面通过一个样例来说明协议代理模式,功能如下:
1,主页面有一个标签和一个修改按钮,点击修改按钮会跳转到编辑页面
2,编辑页面中修改输入框的文字后,点击“确定”则返回主页面,同时主页面的标签值会替换成新值
3,如果点击编辑页面的“取消”按钮则直接返回主页面
效果图如下:
实现过程:
1,首先在storyboard中绘制如下两个界面,同时将主界面的“修改”按钮与编辑页做present modally关联
2,设置这个关联Segue的Identity为 EditView
3,主界面ViewController.swift
|
import
UIKit
class
ViewController
:
UIViewController
,
EditViewControllerDelegate
{
@IBOutlet
weak
var
label:
UILabel
!
override
func
viewDidLoad() {
super
.viewDidLoad()
// Do any additional setup after loading the view,typically from a nib.
}
override
func
didReceiveMemoryWarning() {
super
.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//页面跳转时
override
func
prepareForSegue(segue:
UIStoryboardSegue
,sender:
AnyObject
?) {
if
segue.identifier ==
"EditView"
{
//通过seque的标识获得跳转目标
let
controller = segue.destinationViewController
as
!
EditViewController
//设置代理
controller.delegate =
self
//将值传递给新页面
controller.oldInfo = label.text
}
}
func
editInfo(controller:
EditViewController
,newInfo:
String
){
label.text = newInfo;
//关闭编辑页面
controller.presentingViewController!.dismissViewControllerAnimated(
true
,completion:
nil
)
}
func
editInfoDidCancer(controller:
EditViewController
){
//关闭编辑页面
controller.presentingViewController!.dismissViewControllerAnimated(
true
,completion:
nil
)
}
}
|
4,编辑页 EditViewController.swift
|
import
UIKit
class
EditViewController
:
UIViewController
{
@IBOutlet
weak
var
textField:
UITextField
!
var
delegate:
EditViewControllerDelegate
?
var
oldInfo:
String
?
override
func
viewDidLoad() {
super
.viewDidLoad()
// Do any additional setup after loading the view.
if
oldInfo !=
nil
{
textField.text = oldInfo
}
}
override
func
didReceiveMemoryWarning() {
super
.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction
func
done(sender:
AnyObject
) {
delegate?.editInfo(
self
,newInfo: textField.text!)
}
@IBAction
func
cancel(sender:
AnyObject
) {
delegate?.editInfoDidCancer(
self
)
}
}
|
5,编辑页代理 EditViewControllerDelegate.swift
|
protocol
EditViewControllerDelegate
{
func
editInfo(controller:
EditViewController
,newInfo:
String
)
func
editInfoDidCancer(controller:
EditViewController
)
}
|
6,在Storyboard中,将编辑页的Class设为EditViewController presentedViewController:The view controller that is presented by this view controlller(read-only),被本视图控制器present出来的的视图控制器
presentingViewController:The view controller that presented this view controller. (read-only),present出来本视图控制器的视图控制器
如A-->弹出B,则A.presentedViewController = B
B.presentingViewController = A
dismissViewControllerAnimated:YES
Dismisses the view controller that was presented modally by the view controller.
也就是在在A上调该方法,dismiss掉A弹出的vc
如果在B上调,会调用presenting view的该方法,即A的该方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。