iOS开发笔记(Swift)-针对Swift调用PPiFlatSegmentedControl项目的一些修改
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项目的一些修改的更多相关文章
- 【Swift】iOS开发笔记(二)
前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯 ...
- 菜鸟手下的iOS开发笔记(swift)
在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...
- iOS开发笔记--什么时候调用layoutSubviews
iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...
- iOS开发笔记7:Text、UI交互细节、两个动画效果等
Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...
- iOS开发笔记-两种单例模式的写法
iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...
- IOS开发笔记(4)数据离线缓存与读取
IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...
- IOS开发笔记 IOS如何访问通讯录
IOS开发笔记 IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...
- 文顶顶iOS开发博客链接整理及部分项目源代码下载
文顶顶iOS开发博客链接整理及部分项目源代码下载 网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程 ...
- iOS开发笔记(Swift)-通用App安装引导页的实现
之前一直做的项目都是基于OC开发的,最近开始尝试使用Swift语言来重写整个项目. 本篇文章主要是讲述如何使用Swift来实现常见的通用App安装引导界面. 效果预览: 实现思路: 主要是采用了UIS ...
随机推荐
- 简单的TSQL基础编程格式,存储过程,视图
这里简单整理一下数据库简单的编程,变量定义,赋值,分支语句和循环(这里以Sqlserver),以及存储过程格式 首先是变量定义,赋值,分支语句 --======TSQL数据库基础编程,定义变量,赋值, ...
- MFC笔记4
1.添加图片 1)静态加载图片,直接在resourceView中控件设置就可以以实现 2)动态加载时,按照鸡啄米的教程http://www.jizhuomi.com/software/193.html ...
- spring @Scheduled 并发
一.spring定时任务配置 applicationContext.xml:红色代码部分为需要配置的部分. <?xml version="1.0" encoding=&quo ...
- 深入浅出PF 学习笔记---TypeConverter
StringToHumanTypeConverter类(从TypeConverter继承 using System; using System.Collections.Generic; using S ...
- 深入JVM之类的加载过程
类的加载—连接—初始化 加载:查找并加载类的字节码文件,从硬盘到内存. 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.la ...
- f5 主备模式切换
f5 主备模式 主机down自动切换到备 原主机重新启动,自动切换到原主机
- 17. pt-online-schema-change
在平时MySQL的运维过程中,经常会遇到表结构的变更.在表比较小的时候,直接进行变更,时间较短,但是当表非常大的时候,这么做会导致应用卡死,服务不可用.目前InnoDB引擎是通过以下步骤来进行DDL的 ...
- 为docker配置HTTP代理服务器
背景: node1不能访问外网, node2可以访问外网,node1通过node2的代理服务来访问外网. 1. node1不能访问外网 vim /etc/resolv.conf 注释掉DNS配置文件 ...
- jdk8 永久代变更
java8 去掉了永久代permgen(又称非堆,其实也是堆的一部分),类的方法代码,常亮,方法名,静态变量等存放在永久代中 改为使用元空间 Metaspace , Metaspace 不在是堆的一部 ...
- ----关于position的四个标签----
从[ two1-4 ]分别为absolute,fixed,static,relative标签 四个标签下位移值相同,[ two2 ]和[ two1 ]都出现在左上角,[ two2 ] 盖住了[ two ...