相信大家都自定義過View,如果參數傳的過多,那么初始化的方法就會變得很長
/** init方法 */
- (instancetype)initWithTitleArray:(NSArray*)titleArray
?? ? ? ? ? ? ? ? ? titleColorArray:(NSArray*)titleColorArray
?? ? ? ? ? ? ? ? ? ? btnColorArray:(NSArray*)btnColorArray;
如果只是自己使用的話帆谍,那還是可以接受的陨界。但是如果將這個類作為公用類,將來別人用到的時候源内,有可能需要修改初始化方法老厌,往里面添加參數揖膜,有些參數傳值的時候還有約束,需要設置成nil梅桩,這樣就很不利于維護,也不美觀拜隧。
當然我們也可以這樣初始化信息
/** 按鈕上的文字數組 */
@property (nonatomic, strong) NSArray *titleArray;
/** 按鈕上的文字顏色 */
@property (nonatomic, strong) NSArray *titleColorArray;
/** 按鈕背景顏色 */
@property (nonatomic, strong) NSArray *btnColorArray;
能不能像masonry一樣宿百,通過鏈接的方式將參數賦值上去,下面就是我們想要實現的目標洪添。
tv.titleArray(@[@"選擇", @"加入打印列表", @"打印"]) .titleColorArray(@[[UIColor lightGrayColor]).btnColorArray([UIColor blueColor]);
探索
網上查了下資料垦页,oc的方法是以中括號[]調用的,而()只有通過block的形式干奢,所以我們有了大體的方向伸头。
先寫一個titleArray的block山上,注意這里的返回值要寫他本身,否則后續(xù)調用其他參數的時候就會報錯,畢竟void是沒有方法的闯袒。
.h文件
- (TestView *(^)(NSArray *))titleArray;
.m文件
- (TestView *(^)(NSArray *))tvTitleArray { ? ? return ^(NSArray *titleArray) { ? ? ? ? self.titleArray = titleArray; ? ? ? ? return self; ? ? }; }
這里稍微解讀下block
block的一般聲明方式是:返回值類型(^block名稱)(參數列表),
block實現是這樣的,block變量=^(參數列表){函數實現};
當然我們這邊可以通過typedef定義block搪花,下面是使用過程搓谆。
typedef TestView *(^titleColorBlock)(NSArray *);
.h文件
- (titleColorBlock)tvTitleColorArray;
.m文件
- (titleColorBlock)tvTitleColorArray { ? ? return ^(NSArray *titleColorArray) { ? ? ? ? self.titleColorArray = titleColorArray; ? ? ? ? return self; ? ? } }
其他信息就不重復了,最后看下調用以及結果展示
? ? ? ? tv.tvBtnColorArray(@[[UIColor yellowColor], [UIColor redColor]])
? ? ? ? .tvTitleArray(@[@"選擇", @"加入打印列表", @"打印"])
? ? ? ? .tvTitleColorArray(@[[UIColor lightGrayColor], [UIColor greenColor], [UIColor blueColor]])
? ? ? ? .tvUpdateUI();
OK绰寞,收工到逊。