PPiFlatSegmentedControl項(xiàng)目是一個(gè)很流行的開(kāi)源iOS控件庫(kù),提供了扁平化風(fēng)格(Flat style)的SegmentedControl,可以自定義segment的顏色,圖標(biāo)、大小等等,十分靈活美觀。
效果如下:

但是作為一個(gè)OC項(xiàng)目,在我們進(jìn)行OC和Swift混合編程時(shí),由于PPiFlatSegmentedControl的創(chuàng)建實(shí)例方法中使用了Block,產(chǎn)生了一些問(wèn)題。
思路:
首先,根據(jù)官方文檔,Swift中采用閉包來(lái)替代Block,但是我水平有限,使用閉包來(lái)調(diào)用時(shí),程序并不能正常運(yùn)行。同時(shí)Swift中的@Selector經(jīng)過(guò)驗(yàn)證是可以正常使用的,于是我采用了使用@Selector替代Block的方案。
實(shí)現(xiàn)方案:
1.修改/添加PPiFlatSegmentedControl源碼中的實(shí)例化方法
在這里,為PPiFlatSegmentedControl添加了全新的方法,其中最大變化是采用了@Selector。
- (id)initWithFrame:(CGRect)frame items:(NSArray*)items iconPosition:(IconPosition)position target:(id)target andSelection:(SEL)action;
同時(shí)根據(jù)需求,為PPiFlatSegmentedControl對(duì)象添加了target和selAction屬性。
@property (nonatomic) SEL selAction; @property (nonatomic) id target;
最后就是修改項(xiàng)目返回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]]; } } }
到這里,我們對(duì)OC源碼的修改就完成了,下面進(jìn)行Swift調(diào)用的演示。
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;
調(diào)用@Selector代碼:
func segmentControlSelected(index:NSNumber){ if(index.intValue==0){ switchToFoundation() }else{ switchToP2P() } }
實(shí)現(xiàn)效果:

PPiFlatSegmentedControl項(xiàng)目地址:https://github.com/pepibumur/PPiFlatSegmentedControl