[IOS]Protocol协议及委托代理(Delegate)传值-用代码寻找storyboard相应视图

Protocol协议及委托代理(Delegate)传值

前言:

因为Swift是不支持多继承的,所以很多时候都是用Protocol(协议)来代替。Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法。也就是说,它只告诉你要做什么,但具体怎么做,它不关心。

理解

当一个类要使用某一个Protocol(协议)时,都必须要遵守协议。比如有些必要实现的方法,你没有去实现,那么编译器就会报警告,来提醒你没有遵守××协议。注意,我这里说的是警告,而不是错误。对的,就算你不实现那些“必要实现”的方法,程序也是能运行的,只不过多了些警告。

Protocol(协议)的作用:

  • 定义了一套公用的接口。

@required:必须实现的方法

@optional:可选 实现的方法(可以全部都不实现)

  • 委托代理(Delegate)传值


他本身是一种设计模式,它的意思是委托别人去做某事。 比如:两个类之间的传值,类A调用类B的方法,类B在执行过程中遇到问题通知类A,这时候我们需要用到代理(Delegate)。


又比如:控制器(Controller)与控制器(Controller)之间的传值,从C1跳转到C2,再从C2返回到C1时需要通知C1更新UI或者是做其它的事情,这时候我们就用到了代理(Delegate)传值。

代理的实现

创建一个文件,实现如下协议。

import Foundation

protocol DetailViewProtocol {
    func changeLabel(newString:String)
}

在根视图中实现协议。

import UIKit

class ViewController: UIViewController, DetailViewProtocol {

    @IBOutlet weak var Label: UILabel!
    // 完成代理方法。实现传值的关键!
    func changeLabel(newString:String) {
        self.Label.text = newString
    }
    // 视图转移,并且完成协议的认定。 
    @IBAction func BtnClick(sender: AnyObject)     {
    // rootView定义为UIStoryboard。这样才能在storyboard中找到相应的视图。
        let rootView = UIStoryboard(name: "Main", bundle: nil)
    // 用Identifier找到相应的视图,并且强制转换为DetailView,如此才能对DetailView里面的内容进行操作。
        let anoView = rootView.instantiateViewControllerWithIdentifier("second") as! DetailView
   // 赋予代理。
        anoView.delegate = self
   // 视图转移。注意!一定要写!不能在storyboard里拉线。
   // 在storyboard里拉线,实际上是有其他代码来完成的,但那个代码里并没有实现对代理的赋予。
        self.showDetailViewController(anoView, sender: nil)
    }
}
//
// DetailView.swift
// NewDemo
//
// Created by 颜泽鑫 on 4/12/16.
// Copyright © 2016 颜泽鑫. All rights reserved.
//

import UIKit

class DetailView: UIViewController {
    @IBOutlet weak var BtnClick: UIButton!
    @IBOutlet weak var Text: UITextField!
    var delegate : DetailViewProtocol?
    // 定义一个变量为代理。这样才能使用代理里面的方法。

    @IBAction func BttnClick(sender: AnyObject) {
        let str = Text.text
        // print(str)
        // 调用代理函数,改变Label值
        self.delegate!.changeLabel(str!)
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    @IBAction func TextEndEditing(sender: AnyObject) {
        Text.resignFirstResponder()
    }
}

你可能感兴趣的:([IOS]Protocol协议及委托代理(Delegate)传值-用代码寻找storyboard相应视图)