浅析ios开发中Block块语法的妙用
[self.p_tableArrenumerateObjectsUsingBlock:^(id obj,NSUInteger idx, BOOL *stop) {
<#code#>
}]
另一个常见的地方就是页面跳转present之后的完成回调,
[self presentViewController:<(UIViewController *)> animated:<(BOOL)> completion:<^(void)completion>]
三.块语法在UIAlertView中的集中代码
UIAlertView是一个弹窗控件,有一些按钮,最常见的就是确认和取消,UIAlertView有一个代理处理这些按钮,当用户点击后,该代理可以捕获按钮的下标,然后用户根据下标Index写一些逻辑代码。
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
快语法的第一个妙用就是可以直接在创建这个UIAlertView控件的时候就已经写好逻辑代码,完全不用写在以上回调中。
以下是具体实现。
第一步,申明一个全部的Block对象,根据UIAlertView的回调代理可知,该代理主要参数是一个NSInteger类型的参数,那么我们申明的Block对象可以根据代理的实际情况来创建。
@property(nonatomic,copy)void(^p_alertBlock)(NSInteger);
第二部,在创建这个UIAltView的地方实现这个全部的Block对象。
if(!self.p_alertBlock)
{
self.p_alertBlock = ^(NSInteger buttonIndex)
{
AccountViewController *acc = accc;
switch (buttonIndex) {
case 0:
break;
case 1:
if([acc.p_fmdbdeleteObjc:list])
{
[acc.p_tableArrremoveObjectAtIndex:acc.p_didSelect];
[acc.p_tablereloadData];
}
break;
}
};
}
UIAlertView *alt = [[UIAlertViewalloc] initWithTitle:NSLocalizedString(@"tip",nil)message:NSLocalizedString(@"sureDelet",nil) delegate:selfcancelButtonTitle:NSLocalizedString(@"cancel",nil) otherButtonTitles:NSLocalizedString(@"ok",nil),nil];
[altshow];
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
self.p_alertBlock(buttonIndex);
}
这个用法有一个好处就是可以在UIAlertView还未创建之前就已经确定了它按钮的处理,集中代码,看起来更加的方便和直观。
以上只是一个事例,在系统很多控件中都可以这样实现,诸如UIActionSheet等。
三.块语法替代Delegate
提起ios的消息通知,就少不了代理Delegate。代理尽管很方便,可是实现的过程比较繁琐。如果使用块语法的话,我们可以提前把回调函数的代码实现封装到Block中作为参数传递给数据层,这样子实际上在代理回调中
if(self.delegate && [self.delegaterespondsToSelector:@selector(setAddressSuccess:)])
{
[self.delegatesetAddressSuccess:self.accountList.remark];
}
这句话就被
Block(self.accountList.remark);所取代。
是不是更加的便捷了呢?关键是你根本就不用声明代理,实现,设置代理,维护协议等等复杂的过程。
代理还有一个限制就是必须要对象化,假如一个工具类是一个类的实例方法,你想在某些操作之后把数据回调给C层,这个时候代理就无法实行了,但是Block只不是是一个对象而已,就像NSString一样,可以帮助你实现。
以上只是块语法在系统控件API回调中的妙用和两个类之间代理的妙用,更多的功能还有待在实际开发中逐步挖掘发现。
仁者见仁,智者见智,块语法究竟强大到何种地步,等你用多了就知道了。
浅析ios开发中Block块语法的妙用相关推荐
- iOS开发中的Web应用概述
为了更好的阅读体验,建议阅读原文 插播广告 -- 几十行代码完成资讯类App多种形式内容页 HybridPageKit :一个针对资讯类App高性能.易扩展.组件化的通用内容页实现框架. 想和我一起全 ...
- iOS 开发中的多线程
线程.进程 什么是线程.进程 有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载 ...
- iOS开发UI篇—iOS开发中三种简单的动画设置
[在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要"参与到"动画中 [UIView beginAnimations: ...
- iOS开发中多线程的那些事
iOS开发深入之后还是要接触多线程和runloop的,写篇博客讲解.记录下iOS开发中的多线程技术. 线程.进程 什么是线程.进程 有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比 ...
- iOS开发中各种关键字的区别
1.一些概念 1.浅Copy:指针的复制,只是多了一个指向这块内存的指针,共用一块内存. 深Copy:内存的复制,两块内存是完全不同的, 也就是两个对象指针分别指向不同的内存,互不干涉. 2.atom ...
- ARC中block块作为属性的使用笔记
ARC中block块作为属性的使用笔记 block较难理解,根据在内存中的分布情况就分为3种类型,根据使用的情形又分为很多很多种.虽然用起来容易,但使用不当会造成内存泄露,虽然都是这么说,但你真的研究 ...
- 浅谈iOS 开发中的界面通信
在任何的软件开发中都离不开界面与界面之间的通信,界面通信的最直接的方法就是界面传值. 在开发过程中我们在页面传值时我们通常使用的方法有:属性传值法,block传值法,代理传值法,以及单例传值法,通知传 ...
- 在iOS开发中使用FMDB
在iOS开发中使用FMDB 前言 SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库.iOS SDK 很早就支持了 SQLite,在使用时,只需 ...
- iOS开发中对NSArray或者NSMutableArray中的内容排序
原文引用至 http://blog.unieagle.net/2012/05/10/ios开发中对nsarray或者nsmutablearray中的内容排序/ NSMuta ...
最新文章
- React学习笔记6:React Hooks API总结
- 解决SqlServer2008修改表后保存时出现“save changes is not permitted…”问题
- tomcat的安装和部署项目
- 他人评审18篇SCI文章的一点感受
- linux打开文件异常
- 有趣的圣诞节 库的打包
- MySQL5.7收集表统计信息时对该表上增删改查的影响
- CamOdoCal_2013-IROS_多个普通相机和里程计的内参和外参自动标定
- scala读取本地hdfs_scala读取hdfs数据库
- 药片计数器电路设计与实验
- python excel文件换题头
- 到底什么是5G LAN?
- 2020.10.08丨全长转录组之参考基因组比对
- 惠州市政企信息化(互联网)市场调研报告
- 多源异构作物组学数据融合方法研究——以高粱为例
- 安卓手机 忘记 锁屏密码
- 前端程序员Vue开发经验总结
- 计算机找不到指纹登陆,Win10电脑上登陆选项没有PIN码和指纹设置的解决教程
- Premiere Pro mac 22.6版本更新功能
- chromedriver中的浏览器选项
热门文章
- canal解析mysql日志异常_利用Canal解析mysql binlog日志
- 七十三、Python | Leetcode数字系列(上篇)
- 博士申请 | 宾州州立大学 (PSU) 招收机器学习/对抗学习方向全奖博士
- 通过互信息思想来缓解类别不平衡问题
- 近期有哪些值得读的推荐系统论文?来看看这份私人阅读清单
- ACL 2020 | 多跳问答的基于对齐的无监督迭代解释检索方法
- 漫画解读ERNIE:能和BERT一较高下的知识增强语义表示模型
- 2017年度最值得读的AI论文评选 | 大张旗鼓送福利
- Easy Multiplication 快速傅里叶变换
- hdu 1874 Dijkstra算法模板