• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

iOS开发笔记(Swift)-针对Swift调用PPiFlatSegmentedControl项目的一些修改 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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/4, 10, SCREEN_WIDTH/2, 25), items: data, iconPosition: IconPositionRight, target:self, andSelection:"segmentControlSelected:")
        
        segmentControl.color=TextServcie.getcolorfromHEX("#36b5fc")
        segmentControl.borderWidth=0
        segmentControl.selectedColor=TextServcie.getcolorfromHEX("#0193e6")
        segmentControl.selectedTextAttributes=[NSFontAttributeName:UIFont.systemFontOfSize(13),
            NSForegroundColorAttributeName:UIColor.whiteColor()]
        segmentControl.textAttributes=[NSFontAttributeName:UIFont.systemFontOfSize(13),
            NSForegroundColorAttributeName:TextServcie.getcolorfromHEX("#0971b0")]
        self.navigationItem.titleView=segmentControl;

 

  调用@Selector代码:

 

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

 

实现效果:

 

 

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[Swift]LeetCode156.二叉树的上下颠倒$BinaryTreeUpsideDown发布时间:2022-07-13
下一篇:
Swift基本语法以及与OC的比较发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap