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


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

    效果如下:

    PPiFlatSegmentedControl

    但是作为一个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

  • 相关阅读:
    从零开始学架构(一):架构师成长路径(转)
    从零开始学架构:开篇-文章大纲(转)
    JAVA通信系列二:mina入门总结(转)
    JAVA通信系列三:Netty入门总结(转)
    JAVA通信系列一:Java Socket技术总结(转)
    大型网站架构系列:消息队列(二)(转)
    大型网站架构系列:分布式消息队列(一)(转)
    大型网站架构系列:缓存在分布式系统中的应用(三)(转)
    大型网站架构系列:缓存在分布式系统中的应用(二)(转)
    大型网站架构系列:负载均衡详解(3)(转)
  • 原文地址:https://www.cnblogs.com/mantgh/p/4604193.html
Copyright © 2020-2023  润新知