針對Swift調用PPiFlatSegmentedControl項目的一些修改

jopen 9年前發布 | 14K 次閱讀 Apple Swift開發 PPiFlatSegmentedControl

PPiFlatSegmentedControl項目是一個很流行的開源iOS控件庫,提供了扁平化風格(Flat style)的SegmentedControl,可以自定義segment的顏色,圖標、大小等等,十分靈活美觀。

效果如下:

針對Swift調用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]];
    }
}

}</pre>
到這里,我們對OC源碼的修改就完成了,下面進行Swift調用的演示。

var data=[["text":"test1"],["text":"test2"]];
        var segmentControl = PPiFlatSegmentedControl(frame:  CGRectMake(Yunshouyi.SCREEN_WIDTH/4, 10, Yunshouyi.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;</pre><br />

調用@Selector代碼:

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

實現效果:

針對Swift調用PPiFlatSegmentedControl項目的一些修改

 

 

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

來自:http://www.cnblogs.com/mantgh/p/4604193.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!