在为子类添加自定义初始值设定项时,是否有关于应采用何种参数的规则?举个例子,有没有一个特殊的原因,为什么UIView下面没有初始化器,并且不是否有任何论据将它添加到UIView的自定义子类中?
- (instancetype)initWithFrame:(CGRect)frame backgroundColor:(UIColor *)backgroundColor;
我还没能在网上找到答案,所以我希望你们中的一些人能够启发我。
答案 0 :(得分:1)
您可以在其中添加任何内容。但是,你可以添加这么多,它变得荒谬......
initWithFrame:backgroundColor:tintColor:alpha:hidden:userTouchEnabled:...
这实际上取决于您使用子类的内容。
例如,您可以创建一个PlayingCardView
子类。这将具有某些属性...... suit
,faceValue
。因为每张卡必须都有套装和面值,所以将它们放入init方法是有意义的。
因此创建一个初始化者是明智的......
- (instancetype)initWithSuit:(Suit *)suit faceValue:(FaceValue *)faceValue;
因为每张卡都必须有套装和面值。
同样地,您可以使用另一个属性backImage
来设置"返回"的卡。所以你可以......
- (instancetype)initWithSuit:(Suit *)suit faceValue:(FaceValue *)faceValue backImage:(UIImage *)backImage;
现在您可以使用两个初始化程序之一。一个用于"默认"返回图像,另一个设置自定义背面图像。
然后你进入指定的初始化程序,在这种情况下,最好不要在两个init方法中重复代码,这样你就可以制作第一个这样的方法...
- (instancetype)initWithSuit:(Suit *)suit faceValue:(FaceValue *)faceValue
{
UIImage *defaultBackImage = [UIImage imageNamed:@"defaultCardImage"];
return [self initWithSuit:suit faceValue:faceValue backImage:defaultBackImage];
}
指定的初始化会完成卡片的所有实际设置。
实际上,没有固定的方法,没有正确的方法可以做到这一点,找到一个你最容易/最好用的模式可能需要一段时间。
答案 1 :(得分:0)
您的自定义初始值设定项可以使用您想要的任何参数。与任何其他类一样,UIView定义了一些让我们说基本行为,所以如果你需要任何其他行为,你可以自由地使用子类来添加它。不要抱怨UIView或任何其他类没有你认为对他们有好处的方法。
我建议你不要编写一个有很多参数的自定义初始化程序,因为它增加了复杂性。仔细想想正确地将这些课程所需要的内容。