Vu *_*ran 5 iphone cocoa cocoa-touch objective-c ios
比方说,我有一个UIView的实现.UIView包含两个标签,一个图像和一个框架.
我的"init"方法最终看起来像:
- (id)initWithFrameAndLabelArrayAndImage:(CGRect)frame:(NSArray *)labelArray:(UIImage *)image;
Run Code Online (Sandbox Code Playgroud)
那被认为是不好的做法吗?有一个简单的"initWithFrame"方法并将另一个标签和图片作为@properties更好吗?
没关系.Apple经常这样做.例如,看看NSString:
– initWithBytes:length:encoding:
– initWithBytesNoCopy:length:encoding:freeWhenDone:
– initWithCharacters:length:
– initWithCharactersNoCopy:length:freeWhenDone:
– initWithString:
– initWithCString:encoding:
– initWithUTF8String:
– initWithFormat:
– initWithFormat:arguments:
– initWithFormat:locale:
– initWithFormat:locale:arguments:
– initWithData:encoding:
Run Code Online (Sandbox Code Playgroud)
但是,遵循这些模式,你的:
- (id)initWithFrameAndLabelArrayAndImage:(CGRect)frame:(NSArray *)labelArray:(UIImage*)image;
Run Code Online (Sandbox Code Playgroud)
应该是:
- (id)initWithFrame:(CGRect)frame labels:(NSArray *)labelArray image:(UIImage *)image;
Run Code Online (Sandbox Code Playgroud)
现在,话虽如此,我可能不会传递一系列标签.我会传递数据并让自定义视图获取该数据并创建/布局子视图.您可以在公共方法中公开构成自定义视图的内部视图,并且您可能希望在将来更改渲染和组合它们的方式.
另一种方法是使用委托来呈现标签,通过调用代表获取所需的数据来呈现标签 - 类似于表视图.
虽然有多个参数很好,但你真的不应该有任何未命名的参数.在您的情况下,要调用您的方法,它将如下所示:
[[* alloc] initWithFrameAndLabelArrayAndImage:frame :array :image];
Run Code Online (Sandbox Code Playgroud)
这通常是不好的做法.我会将您的自定义初始化程序重新排列为以下几行:
- (id)initWithFrame:(CGRect)frame labelArray:(NSArray *)labelArray image:(UIImage *)image;
Run Code Online (Sandbox Code Playgroud)
甚至
- (id)initWithFrame:(CGRect)frame andLabels:(NSArray *)labels andImage:(UIImage *)image;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
446 次 |
| 最近记录: |