Ios 使用UIAppearance代理而不是普通默认值有什么好处?

Ios 使用UIAppearance代理而不是普通默认值有什么好处?,ios,objective-c,uiappearance,Ios,Objective C,Uiappearance,请您向我解释一下,使用UIAppearance代理对象自定义我的UIView子类属性,而不是创建setter方法来提供所需的默认值(如以下代码示例中所示),会有什么好处: @interface CustomView : UIView + (void)setDefaultBackgroundColor: (UIColor *)defaultBackgroundColor; @end @implementation CustomView static UIColor *defaultBack

请您向我解释一下,使用
UIAppearance
代理对象自定义我的
UIView
子类属性,而不是创建setter方法来提供所需的默认值(如以下代码示例中所示),会有什么好处:

@interface CustomView : UIView

+ (void)setDefaultBackgroundColor: (UIColor *)defaultBackgroundColor;

@end

@implementation CustomView

static UIColor *defaultBackgroundColor_ = nil;

- (id)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
  if (self) {
    if (!defaultBackgroundColor_)
      defaultBackgroundColor_ = [UIColor blackColor];
  }
  return self;
}

+ (void)setDefaultBackgroundColor: (UIColor *)defaultBackgroundColor {
  defaultBackgroundColor_ = defaultBackgroundColor;
}

@end
在我读过的所有关于
UIAppearance
用法的文章中,他们说,更改这个代理的属性可以让类的实例自动获得相同的值。我不能完全理解的是,代理对象是否真的需要用于此目的?在这种情况下,使用静态变量保存默认值有什么缺点吗

为了让事情更清楚,我比较了这种方法:

 [CustomView appearance]setBackgroundColor:someNewColor];
为此:

 [CustomView setDefaultBackgroundColor:someNewColor];

这并不是
UIAppearance
的实际用例。如果您正在编写一个只在单个项目中使用的
UIView
子类,那么只需按照您想要的方式进行设计即可

如果您决定使该子类在所有项目中都可用,并且可能需要为每个项目专门设置样式,
UIAppearance
。或者,如果您想使用大量实例,而不必单独设置每个实例的样式


UILabel
的工作原理类似。它是一个
UIView
子类,设计用于各种不同的项目。

这实际上不是
UIAppearance
的用例。如果您正在编写一个只在单个项目中使用的
UIView
子类,那么只需按照您想要的方式进行设计即可

如果您决定使该子类在所有项目中都可用,并且可能需要为每个项目专门设置样式,
UIAppearance
。或者,如果您想使用大量实例,而不必单独设置每个实例的样式


UILabel
的工作原理类似。它是一个
UIView
子类,设计用于各种不同的项目。

好吧,假设我已经决定让该子类在其他项目中可用。我不明白,使用
[MyCustomView外观]setBackgroundColor]有什么好处vs
[MyCustomView setDefaultBackgroundColor]。在这两种情况下,我们只是为所有新实例提供默认颜色。我说的对吗?@Storix不一定。使用
UIAppearance
协议,当包含Instancesof
(或任何名称)时,您可以很好地控制何时使用具有
外观的特定样式。此外,我不确定,但我不知道在使用静态属性与外观时,自定义控件的子类化将如何影响样式设置。我不认为您很容易就能扩展它?我想,在Objective C runtime的帮助下,在包含Instancesof
的情况下,结合静态变量实现类似于
外观的方法并不困难。但是我得到的关于
UIAppearance
proxy的信息是,它提供了以下优点:1。可读性和可维护性(由于代理设计模式,我们有统一的接口)2。我们不需要重新发明轮子:)谢谢你的回答。@Storix是的,你完全可以自己重新创造它。但是,UIAppearance已经为您创建了:)好吧,假设,我已经决定使该子类在其他项目中可用。我不明白,使用
[MyCustomView外观]setBackgroundColor]有什么好处vs
[MyCustomView setDefaultBackgroundColor]。在这两种情况下,我们只是为所有新实例提供默认颜色。我说的对吗?@Storix不一定。使用
UIAppearance
协议,当包含Instancesof
(或任何名称)时,您可以很好地控制何时使用具有
外观的特定样式。此外,我不确定,但我不知道在使用静态属性与外观时,自定义控件的子类化将如何影响样式设置。我不认为您很容易就能扩展它?我想,在Objective C runtime的帮助下,在包含Instancesof
的情况下,结合静态变量实现类似于
外观的方法并不困难。但是我得到的关于
UIAppearance
proxy的信息是,它提供了以下优点:1。可读性和可维护性(由于代理设计模式,我们有统一的接口)2。我们不需要重新发明轮子:)谢谢你的回答。@Storix是的,你完全可以自己重新创造它。但是,已经为您创建了UIAppearance:)