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. 20162322 朱娅霖 作业005&006 栈,队列

    20162322 2017-2018-1 <程序设计与数据结构>第五.六周学习总结 教材学习内容总结 集合的介绍(总述) 集合是收集并组织其他对象的对象.主要分为线性集合(集合中的元素排成 ...

  2. 大数据学习笔记1-大数据处理架构Hadoop

    Hadoop:一个开源的.可运行于大规模集群上的分布式计算平台.实现了MapReduce计算模型和分布式文件系统HDFS等功能,方便用户轻松编写分布式并行程序. Hadoop生态系统: HDFS:Ha ...

  3. Willem, Chtholly and Seniorious

    Willem, Chtholly and Seniorious https://codeforces.com/contest/897/problem/E time limit per test 2 s ...

  4. Vue框架H5商城类项目商品详情点击返回弹出推荐商品弹窗的实现方案

    需求场景: 非推荐商品详情页返回的时候弹出弹窗推荐商品,点击弹窗按钮可以直接访问推荐商品: 只有直接进入商品详情页返回才会弹出推荐商品弹窗: 每个用户访问只能弹一次(除非清除缓存). 需求分析: 1. ...

  5. stark组件开发之添加功能实现

    添加功能,还是使用, form 组件来完成!  并且 完成添加之后,需要保留原搜索条件. def memory_url(self): '''用于反向生成url, 并且携带,get请求的参数,跳转到下一 ...

  6. 服务器重新启动,oracle数据库重新连接问题

    最近服务器使用期限到了,用户无法登陆,联系了网络的同事,重新开启了服务器,用户可以重新登陆了,但是在使用oracle数据库的时候,发现报了以下的错误: 很明显是数据库服务没有启动,解决这个问题分两步: ...

  7. centos 网卡自动连接

    /etc/sysconfig/network-scripts/目录下ifcfg-eth0这个文件,把ONBOOT="no"改为yes,

  8. Android手机上浏览器不支持带端口号wss解决方案

    首先抄个示例过来,命名为wss-test.html,然后传到服务器: <!DOCTYPE HTML> <html> <head> <meta http-equ ...

  9. 【Git】 GitLab配置优化及汉化

    GitLab配置 1.修改GitLab绑定的域名 a.修改/etc/gitlab/gitlab.rb配置文件,修改成自己的域名 external_url 'http://gitlab.example. ...

  10. 【Git】 GitLab简单使用

    本例介绍简单实用GitLab,安装请参照[Git] GitLab服务器社区版安装与配置 1.用户和组的管理 a.创建组,在首页点击Create a group b.创建用户,在首页点击Add peop ...