之前知知道iOS协议怎么写, 以为真的跟特么java接口一样, 后来发现完全不是.

首先, 说说应用场景, 就是当你要用一个程序类, 或者说逻辑类, 去控制一个storyboard里面的label, 发现如果直接用

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
//由storyboard根据myView的storyBoardID来获取我们要切换的视图
mainView= [mainStoryboard instantiateViewControllerWithIdentifier:@"myView"];

然后去拿这个mainView的label的property, 结果发现这个viewController是可以拿到的, 但是里面的label是nil的.

结果搜索了一下, 发现逻辑类是无法访问视图控制类的(the real problem is no one told me that after I asked so many people, and it's not a fucking unsual issue, correct?).

那么好吧, 这个时候, 据说其中一个解决方案就是这个delegate/protocal这个鬼东西.

首先, 把逻辑类叫做Logic, 视图控制器类就还是ViewController, 在Logic.h里面:

#import <Foundation/Foundation.h>

@protocol LogicDelegate <NSObject>
- (void)DoSomethingOthersCant;
@end

@interface Logic : NSObject
@property (nonatomic, assign) id <LogicDelegate> delegate;
- (void) changeText;
@end

分为两个部分, 一个就是定义协议, 协议名通常是类名+delegate, 在这个例子里面是LogicDelegate, 这部分跟java的接口一个意思, 定义一下抽象方法, 这个例子里面就是DoSomthingOthersCant.

另一个部分就是定义一个property, 也就是谁实现了这个LogicDelegate接口/协议, 就是他了

再有一个方法是给逻辑类使用代理方法的.

那么, Logic.m里面:

#import "Logic.h"
#import "ViewController.h"

@interface Logic ()
{
}

@property (strong,nonatomic) ViewController *viewController;
@end
@implementation Logic

- (void) changeText{
    NSLog(@"xxxx");
   [self.delegate DoSomethingOthersCant];
}

@end

具体的, changeText就在逻辑需要的时候, 去让代理者, 比如视图控制器, 来doSomething它不能do的.

ok, 到了视图控制器类, 首先要指定这个类, 实现LogicDelegate协议.

#import <UIKit/UIKit.h>
#import "Logic.h"

@interface ViewController : UIViewController<LogicDelegate>  //这儿
@property (weak, nonatomic) IBOutlet UILabel *label;
@end

实现类:

#import "ViewController.h"
#import "Logic.h"
@interface ViewController ()
@property Logic *logic;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.logic=[[Logic alloc]init];
    self.logic.delegate = self;
    // Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)pressed:(id)sender {  
    [self.logic changeText ]; 
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)DoSomethingOthersCant
{
    NSLog(@"dododododo");  
    self.label.text=@"DDDDDDd";
}

@end

首先在viewDidLoad的时候把viewController传到logic的实例的delegate属性.

self.logic.delegate = self;

然后定义协议里面要求实现的方法, DoSomethingOthersCant, 内容就是将label的值改变.

简单来说, 逻辑类定义协议, 协议里面有抽象方法, UIViewController类, 就做代理, 具体定义抽象类的实现, 同时要再viewDidLoad的时候, 逻辑property的delegate要把self传进去.

多练习吧, 只能这样了.

iOS delegate, 代理/委托与协议.的更多相关文章

  1. iOS - Delegate 代理

    1.Delegate 1.1 协议 协议:是多个类共享的一个方法列表.协议中列出的方法没有相应的实现,计划由其他人来实现.协议中列出的方法,有些是可以选择实现,有些是必须实现. 1>.如果你定义 ...

  2. ios delegate 代理模式 观察者模式 不同视图间的通信

    delegate,在ios中比比皆是,NSURLConnection(网络请求有),tableView, connectionView,等系统自带 的常见代理.甚至,自己写代码的时候,随意间敲打出了p ...

  3. protocol(协议) 和 delegate(委托)也叫(代理)---辨析

    protocol和delegate完全不是一回事. 协议(protocol),(名词)要求.就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现. 委托(delegate),(动 ...

  4. [置顶] Objective-C ,ios,iphone开发基础:protocol 协议(委托,代理)的声明

    协议是为了弥补Objective-c中类只能单继承的缺陷,在Objective-c2.0之前当一个类遵循一个协议的时候,必须在类中实现协议的所有方法,在Objective-c2.0之后协议中的方法就有 ...

  5. ios中关于delegate(委托)的使用心得

    ios中关于delegate(委托)的使用心得 分类: iOS开发2012-05-15 10:54 34793人阅读 评论(9) 收藏 举报 iosuiviewtimerinterfaceprinti ...

  6. 【IOS学习】之四、协议,委托,分类粗解

    何为协议,何为委托,何为分类(类别)? 委托  即 代理 delegate:  他是 (接口的实现类)类似c中的回调.         把某个对象要做的事情委托给别的对象去做. 那么别的对象就是这个对 ...

  7. iOS阶段学习第30天笔记( UIViewController—Delegate(代理) )

    iOS学习(UI)知识点整理 一.UIViewController的介绍 1)概念:UIViewController 即视图控制器,用来管理和控制页面跳转的一个类 ,iOS里面采用了MVC的体系结构, ...

  8. [IOS Delegate和协议]

    转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/25655443 作者:小马 代理和协议的语法这里不赘述,自己查资料. 这个demo的 ...

  9. iOS 委托和协议区别和联系

    iOS上的协议类似于C#.Java上面的接口,他是从类中抽出来的一系列方法,但方法的实现是在实现这个协议的类中,任何实现这个协议的类都需要实现协议类中的@require方法: 委托是一种设计模式,是一 ...

随机推荐

  1. webconfig和appconfig中出现特殊字符如何处理

    在配置文件出现特殊字符&的字符串(如:abce&efg),就会报错.错误如下: 如何处理呢? config文件的本质是xml,所以必须符合xml的规范我们需要这么处理: abce&am ...

  2. PHP 开放JSON格式接口实例

    转化JSON文件 <?php function arrayRecursive(&$array, $function, $apply_to_keys_also = false) { ; ) ...

  3. 源码维护基本命令diff_patch

    源码维护基本命令 diff------生成源代码补丁diff [命令行选项] 源文件 新文件-r 递归处理相应目录-N 包含新文件到patch-u 输出统一格式(unified format),这种格 ...

  4. javascript实例学习之六—百叶窗效果

    一.要结合布局才能形成百叶窗的效果 二.开启两个定时器,第一个定时器控制的是百叶窗整体一次上翻,一次下翻:另一个控制百叶窗中的各页逐次翻转,形成层次效果.否则就成了普通的滚动广告的效果了 本实现借助于 ...

  5. ZooKeeper -- 分布式开源协调服务

    ZooKeeper是一个为分布式应用所设计的开源协调服务,适用于大型的分布式系统,可以提供统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等服务.ZooKeeper支持Java和C两种编程 ...

  6. bash变量操作

    1.条件变量替换: Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换 条件放在{}中. (1) ${value:-word} 当变量未定义或者值为空时,返回值为word ...

  7. Oracle Flashback Technologies - 闪回被drop的表

    Oracle Flashback Technologies - 闪回被drop的表 在oracle10g中,drop一个表后,表没有真正被删除,支持被rename后放在recyclebin中. #新建 ...

  8. Codeforce Round #222 Div2

    这场断网,本来有个别人的比较卡的无线 但后面睡着了- -! C:额,逆向想下! B:... A:...

  9. for穷举

    穷举:把所有可能的情况都走一遍,使用if条件筛选出来满足的条件的情况.(把所有的可能性都列举一边) 迭代:从初始情况按照规律不断求解中间情况,最终推导出结果.f foreach  专为数组定义的一种命 ...

  10. 【皇甫】☀PPT里的小玩意

    第三次写博客了,感觉写的蛮有趣的,在写的同时,回顾了知识点,又上手操作了一遍,印象更加深刻了,尽管今天写的和那些像JAVA啦,HTML啦,C#啦,没多大关系(个人理解),但确实我们经常能用到的.比如说 ...