【问题标题】:Custom UIView with custom initialization doesn't work具有自定义初始化的自定义 UIView 不起作用
【发布时间】:2013-03-12 17:59:09
【问题描述】:

我正在使用最新的 SDK 开发 iOS 应用。

我创建了一个继承自UIView 的类,每次实例化该类时我都必须进行一些初始化。

我必须调用一个名为 setUpVars: 的方法,但我不知道在哪里向该方法发送消息:

- (id)initWithFrame:(CGRect)frame;
- (id)initWithCoder:(NSCoder*)aDecoder;

此类可以与自定义 xib 一起使用,或添加到情节提要中,因此我需要确保在每种情况下都会调用该方法。

- (void)setUpVars
{
    _preferenceKey = @"";
    _preferenceStatus = NO;
    _isDown = NO;
}

我必须在哪里添加[self setUpVars];?

【问题讨论】:

  • 你能展示一下setUpVars方法吗?
  • @pdrcabrod 问题已更新。

标签: ios objective-c uiview


【解决方案1】:

基本上你会想要涵盖这两种情况

- (id)initWithFrame:(CGRect)frame;
{
  self = [super initWithFrame:frame];
  if (self) {
    [self setUpVars];
  }
  return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder;
{
  self = [super initWithCoder:aDecoder];
  if (self) {
    [self setUpVars];
  }
  return self;
}

【讨论】:

  • 别忘了init:。墨菲说它可以被调用,所以它会被调用。
【解决方案2】:

我认为您需要从每个方法发送此消息,也不要忘记awakeFromNib 方法。

您可以创建BOOL 变量,类似于isAlreadySetup 并在setUpVars 方法中将其设置为YES。

【讨论】:

    【解决方案3】:

    文档说

    awakeFromNib

    在从 Interface Builder 存档,或 nib 文件。

    - (void)awakeFromNib
    {
     [self setUpVars];
    }
    

    【讨论】:

      【解决方案4】:

      如果您使用 Interface Builder 来设计您的界面,initWithFrame: 在随后从 nib 文件加载您的视图对象时不会被调用。相反,initWithCoder 被调用。因此,如果您更喜欢通用方式,则可以在这两种方法中初始化变量。在这两种情况下都有效

      【讨论】:

        【解决方案5】:

        我倾向于认为你应该从负责的控制器的 -(void)viewDidLoad 方法中调用这个方法

        【讨论】:

        • viewDidLoad 是处理子视图的正确位置,因为您知道在调用它时,界面构建器定义的所有视图都已正确加载。此外,变量管理将在控制器而不是视图上完成。
        • 那些正确或错误的变量是视图的内部状态而不是视图控制器,视图控制器为视图状态设置默认值是没有意义的,并且会导致非常脆弱的设计
        • 初始化应该在对象本身的init方法中完成。 UIView 子类不应依赖外部类(包括所有者)来正确初始化它。 viewDidLoad 是设置不同于初始化默认值的任何属性(如果它们是属性)的理想场所。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-26
        • 1970-01-01
        • 2017-04-30
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        相关资源
        最近更新 更多