禁止在子视图上使用viewdidload

时间:2016-03-15 21:41:33

标签: ios objective-c subview viewdidload

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

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

-(void)somethingImportant

但是,我希望在ViewDidLoad中发生某些重要,所以我不必按下该按钮。

但是如果我在myViewController的 ViewDidLoad 中添加某些重要,则会多次递归调用myViewController的子视图。

我尝试在我的应用代理的应用程序didFinishLaunchingWithOptions:中添加 somethingImportant ,但不知怎的,它也无法正常工作。

修改

所以这里可能是相关的代码。我有这个UIScrollView,其中包含很多myViewController的子视图:

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

}

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

2 个答案:

答案 0 :(得分:1)

  

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

这听起来像个坏主意,如果你不小心,很容易导致递归。所以我建议你重新考虑一下你的逻辑。如果您需要一个类的多个实例,则应该从该类外部管理这些实例,而不是从内部管理。

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

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

例如:

static BOOL firstCalled = NO;

- (void)viewDidLoad {
    [super viewDidLoad];

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

答案 1 :(得分:0)

每个子类都应该在链上调用[super viewDidLoad],这样代码才能真正调用一次。

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

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