PPiFlatSegmentedControl项目是一个很流行的开源iOS控件库,提供了扁平化风格(Flat style)的SegmentedControl,可以自定义segment的颜色,图标、大小等等,十分灵活美观。

效果如下:

但是作为一个OC项目,在我们进行OC和Swift混合编程时,由于PPiFlatSegmentedControl的创建实例方法中使用了Block,产生了一些问题。

思路:

首先,根据官方文档,Swift中采用闭包来替代Block,但是我水平有限,使用闭包来调用时,程序并不能正常运行。同时Swift中的@Selector经过验证是可以正常使用的,于是我采用了使用@Selector替代Block的方案。

实现方案:

1.修改/添加PPiFlatSegmentedControl源码中的实例化方法

  

  在这里,为PPiFlatSegmentedControl添加了全新的方法,其中最大变化是采用了@Selector。

- (id)initWithFrame:(CGRect)frame items:(NSArray*)items iconPosition:(IconPosition)position target:(id)target andSelection:(SEL)action;

  同时根据需求,为PPiFlatSegmentedControl对象添加了target和selAction属性。

@property (nonatomic) SEL selAction;
@property (nonatomic) id target;

  

  最后就是修改项目返回SelectIndex的方法segmentSelected:,这里有两种方案可以采用,分别是objc_msgSend()和[id performSelector: withObject:]。

-(void)segmentSelected:(id)sender{
if(sender){
NSUInteger selectedIndex=[self.segments indexOfObject:sender];
[self setEnabled:YES forSegmentAtIndex:selectedIndex]; //Calling block
if(self.selBlock){
self.selBlock(selectedIndex);
}
if(_selAction!=nil){
//objc_msgSend(_target,_selAction,[NSNumber numberWithInteger:selectedIndex],selectedIndex);
[_target performSelector:_selAction withObject:[NSNumber numberWithInt:selectedIndex]];
}
}
}

  到这里,我们对OC源码的修改就完成了,下面进行Swift调用的演示。

var data=[["text":"test1"],["text":"test2"]];
var segmentControl = PPiFlatSegmentedControl(frame: CGRectMake(SCREEN_WIDTH/, , SCREEN_WIDTH/, ), items: data, iconPosition: IconPositionRight, target:self, andSelection:"segmentControlSelected:") segmentControl.color=TextServcie.getcolorfromHEX("#36b5fc")
segmentControl.borderWidth=
segmentControl.selectedColor=TextServcie.getcolorfromHEX("#0193e6")
segmentControl.selectedTextAttributes=[NSFontAttributeName:UIFont.systemFontOfSize(),
NSForegroundColorAttributeName:UIColor.whiteColor()]
segmentControl.textAttributes=[NSFontAttributeName:UIFont.systemFontOfSize(),
NSForegroundColorAttributeName:TextServcie.getcolorfromHEX("#0971b0")]
self.navigationItem.titleView=segmentControl;

  调用@Selector代码:

func segmentControlSelected(index:NSNumber){
if(index.intValue==){
switchToFoundation()
}else{
switchToP2P()
}
}

实现效果:

PPiFlatSegmentedControl项目地址:https://github.com/pepibumur/PPiFlatSegmentedControl

iOS开发笔记(Swift)-针对Swift调用PPiFlatSegmentedControl项目的一些修改的更多相关文章

  1. 【Swift】iOS开发笔记(二)

    前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯 ...

  2. 菜鸟手下的iOS开发笔记(swift)

    在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...

  3. iOS开发笔记--什么时候调用layoutSubviews

    iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...

  4. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

  5. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法   单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...

  6. IOS开发笔记(4)数据离线缓存与读取

    IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...

  7. IOS开发笔记 IOS如何访问通讯录

    IOS开发笔记  IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...

  8. 文顶顶iOS开发博客链接整理及部分项目源代码下载

    文顶顶iOS开发博客链接整理及部分项目源代码下载   网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程 ...

  9. iOS开发笔记(Swift)-通用App安装引导页的实现

    之前一直做的项目都是基于OC开发的,最近开始尝试使用Swift语言来重写整个项目. 本篇文章主要是讲述如何使用Swift来实现常见的通用App安装引导界面. 效果预览: 实现思路: 主要是采用了UIS ...

随机推荐

  1. 接入层高性能缓存技术nginx+redis利器OpenResty

    一. OpenRestyOpenResty是一个基于 Nginx与 Lua的高性能 Web平台,其内部集成了大量精良的 Lua库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极 ...

  2. 记一次线上bug排查-quartz线程调度相关

    记一次线上bug排查,与各位共同探讨. 概述:使用quartz做的定时任务,正式生产环境有个任务延迟了1小时之久才触发.在这一小时里各种排查找不出问题,直到延迟时间结束了,该任务才珊珊触发.原因主要就 ...

  3. cdnbest站点里设置防盗链

    设置需求只允许 test.kangleweb.com 访问  ,其他网站链接全部拒绝 (注:如果test.kangleweb.com是用https访问,那引用的内容地址www447.yivpn.cn也 ...

  4. 基于Gitlab统计代码行--统计所有仓库、所有提交人的代码总行数(新增加-删除)

    公司绩效考核要求,统计GITLAB仓库所有人提示有效代码行业 脚本1: 统计所有仓库.所有提交人的代码总行数(新增加-删除) 脚本2: 统计所有仓库.所有提交人的代码提交汇总与删除汇总 脚本3: 统计 ...

  5. MySQL 5.7.9版本sql_mode=only_full_group_by

    这会导致select中只能出现group by后面出现的表的字段. 其实如果使用其他表的字段,聚合函数对无法对应其他表的字段. 建议放在子查询里. 如果想打破这个规则,可以设置sql_mode变量,将 ...

  6. 698. Partition to K Equal Sum Subsets 数组分成和相同的k组

    [抄题]: Given an array of integers nums and a positive integer k, find whether it's possible to divide ...

  7. [leetcode]76. Minimum Window Substring最小字符串窗口

    Given a string S and a string T, find the minimum window in S which will contain all the characters ...

  8. Spring Boot+Quartz实现一个实时管理的定时任务

    转载 https://www.cnblogs.com/wujiwen/p/9615120.html 项目实践过程中碰到一个动态管理定时任务的需求:针对每个人员进行信息的定时更新,具体更新时间可随时调整 ...

  9. cookie、sesstion、strorage

    1. cookie 第一:每个特定的域名下最多生成20个cookie  (数量上) <IE6: 20    |   >ie7:50   |  firefox: 50     |   IE ...

  10. 一个JAVA程序员经常访问的网站

    综合技术网站: CSDN            http://www.csdn.net/ 51CTO             http://www.51cto.com/ 开源中国社区   http:/ ...