iOS delegate, 代理/委托与协议.
之前知知道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, 代理/委托与协议.的更多相关文章
- iOS - Delegate 代理
1.Delegate 1.1 协议 协议:是多个类共享的一个方法列表.协议中列出的方法没有相应的实现,计划由其他人来实现.协议中列出的方法,有些是可以选择实现,有些是必须实现. 1>.如果你定义 ...
- ios delegate 代理模式 观察者模式 不同视图间的通信
delegate,在ios中比比皆是,NSURLConnection(网络请求有),tableView, connectionView,等系统自带 的常见代理.甚至,自己写代码的时候,随意间敲打出了p ...
- protocol(协议) 和 delegate(委托)也叫(代理)---辨析
protocol和delegate完全不是一回事. 协议(protocol),(名词)要求.就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现. 委托(delegate),(动 ...
- [置顶] Objective-C ,ios,iphone开发基础:protocol 协议(委托,代理)的声明
协议是为了弥补Objective-c中类只能单继承的缺陷,在Objective-c2.0之前当一个类遵循一个协议的时候,必须在类中实现协议的所有方法,在Objective-c2.0之后协议中的方法就有 ...
- ios中关于delegate(委托)的使用心得
ios中关于delegate(委托)的使用心得 分类: iOS开发2012-05-15 10:54 34793人阅读 评论(9) 收藏 举报 iosuiviewtimerinterfaceprinti ...
- 【IOS学习】之四、协议,委托,分类粗解
何为协议,何为委托,何为分类(类别)? 委托 即 代理 delegate: 他是 (接口的实现类)类似c中的回调. 把某个对象要做的事情委托给别的对象去做. 那么别的对象就是这个对 ...
- iOS阶段学习第30天笔记( UIViewController—Delegate(代理) )
iOS学习(UI)知识点整理 一.UIViewController的介绍 1)概念:UIViewController 即视图控制器,用来管理和控制页面跳转的一个类 ,iOS里面采用了MVC的体系结构, ...
- [IOS Delegate和协议]
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/25655443 作者:小马 代理和协议的语法这里不赘述,自己查资料. 这个demo的 ...
- iOS 委托和协议区别和联系
iOS上的协议类似于C#.Java上面的接口,他是从类中抽出来的一系列方法,但方法的实现是在实现这个协议的类中,任何实现这个协议的类都需要实现协议类中的@require方法: 委托是一种设计模式,是一 ...
随机推荐
- android framework浅析_转
Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层. 1. Linux内核(Linux Kernel) 1)Android运行在linux kernel 2.6之上 ...
- [转载]WGS84坐标与Web墨卡托坐标互转
//经纬度转Wev墨卡托 dvec3 CMathEngine::lonLat2WebMercator(dvec3 lonLat) { dvec3 mercator; ; +lonLat.y)*PI/) ...
- iOS - (TableView中利用系统的 cell 设置 cell.textlabel 位置和大小)
今天工作稍微的遇到了一点小小的难题,需求效果中 TableView cell 中的 Label 字体大小比原先系统中的要大些且 Label 位置不是在前面,而是在中间往后,对于这个问题我第一时间也是想 ...
- 说说 PWA 和微信小程序--Progressive Web App
作者:云图图链接:https://zhuanlan.zhihu.com/p/22578965来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 利益相关:微信小用户,谷歌小 ...
- App上架出现问题-ERROR ITMS-90034
1.打开钥匙串,显示->显示已过期的证书,因为有些过期的证书会被钥匙串隐藏起来,让过期的证书都显示出来,删掉过期的证书. 2.经检查,我发现我的AppleWWDRCA.cer证书过期了,所以我就 ...
- mysql参数sql_log_bin
如果想在主库上执行一些操作,但不复制到slave库上,可以通过修改参数sql_log_bin来实现. 比如想在主库上修改某个表的定义,但是在slave库上不做修改: master mysql> ...
- Java基础之序列化对象——反序列化对象(DeserializeObjects)
控制台程序,使用如下代码能读入包含Junk对象的文件: import java.io.*; import java.nio.file.*; class DeserializeObjects { pub ...
- Redis:安装
此篇文章并不介绍linux下安装方法.围绕windows安装而介绍 两种安装方式: 1)下载压缩包,解压后(运行起来有个窗口,关闭掉就不在运行),没有windows服务被注册:可以只用命令在cmd将其 ...
- Java初学--无限循环
利用for循环和while循环分别做到,从键盘读取任意数,输入0自动跳出无限循环,并判断有几个正数几个负数. 1.for循环的无限循环: import java.util.Scanner;//引用Sc ...
- JavaScript: Advanced
DOM 1. 节点 getElementsByName方法 <!DOCTYPE HTML> <html> <head> <script type=" ...