禁止子视图上的viewdidload

Prohibit viewdidload on subviews

我有这个 myViewController,它实例化自己的实例。

目前,我有一个 UIButton,它触发方法

-(void)somethingImportant

但是,我希望 somethingImportant 在 ViewDidLoad 期间发生,所以我不必按下那个按钮。

但是如果我把 somethingImportant 放在 myViewController 的 ViewDidLoad 中,它会被递归调用多次,因为我有一个 myViewController 的子视图。

我试图将 somethingImportant 放入我的应用程序委托的 application didFinishLaunchingWithOptions: 中,但不知何故这也不起作用。

编辑

下面是可能相关的代码。我有这个 UIScrollView,它有很多 myViewController 的子视图:

- (void)configureScrollView
{
    for (int i = 0; i < [self.childViewControllers count]; i++) {
        ...
        myViewController * theSubview =[self.childViewControllers objectAtIndex:i];
       ....
        [theScrollView addSubview:[theSubview view]];
    }

}

确保 somethingImportant 只被调用一次的最佳方法是什么?

每个子类都应该在链上调用 [super viewDidLoad],这样代码实际上只应该被调用一次。

但是,如果您需要确保它只执行一次,请将 @property (nonatomic) BOOL runOnce; 添加到该文件的界面,然后在 -(viewDidLoad) 中执行:

if(!self.runOnce) {
    //all code that is only run once
    self.runOnce = YES;
}

I have this class, that instantiates instances of itself.

从本质上讲,这听起来像是个坏主意,如果您不小心,很容易导致递归。因此,我建议您重新考虑您的逻辑。如果您需要 class 的多个实例,您应该从 class 外部而不是内部管理这些实例。

但是,如果您仍然坚持这样做 - 您可以执行类似于 的操作,并使用变量来跟踪您是否调用了您的方法。

问题是您需要将此变量定义为 static 以便将其存储在 class 范围,而不是实例范围.

例如:

static BOOL firstCalled = NO;

- (void)viewDidLoad {
    [super viewDidLoad];

    if (!firstCalled) {
        firstCalled = YES;
        [self foo];
    }
}