Запретить viewdidload на subviews

У меня есть myViewController, который создает экземпляры самого себя.

В настоящее время у меня есть UIButton, который запускает метод

-(void)somethingImportant

Однако я хочу, чтобы это somethingImportant произошло во время ViewDidLoad, поэтому мне не нужно нажимать эту кнопку.

Но если я помещаю somethingImportant в ViewDidLoad myViewController, он вызывается рекурсивно столько раз, сколько у меня есть подпредставление myViewController.

Я попытался поместить somethingImportant в приложение 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 вызывается только один раз?


person Sjakelien    schedule 15.03.2016    source источник
comment
Я все еще не понимаю, что вы здесь делаете. Контроллер представления, который управляет вашими дочерними myViewController объектами типа myViewController? Это все еще от природы пахнет рекурсией.   -  person Hamish    schedule 16.03.2016
comment
Ну да. ОТ: рекурсия - это круто. Однако рекурсия начинается только тогда, когда метод вызывается из viewDidLoad. До этого все просто денди. Итак, я надеялся, что есть простой способ обойти это. Что-то вроде ViewDidLoadForTheFirstTime   -  person Sjakelien    schedule 16.03.2016
comment
if view - ›aweakFromNib if viewController -› viewDidLoad   -  person Trung Phan    schedule 16.03.2016
comment
viewDidLoad - это метод UIViewController, а не UIView. Я понимаю, что вы это понимаете, но ваша формулировка сбивает с толку.   -  person Avi    schedule 16.03.2016


Ответы (2)


У меня есть этот класс, который создает экземпляры самого себя.

По сути, это звучит как плохая идея и может легко привести к рекурсии, если вы не будете осторожны. Поэтому я предлагаю вам переосмыслить свою логику. Если вам нужно несколько экземпляров класса, вы должны управлять этими экземплярами извне этого класса, а не изнутри.

Однако, если вы все еще настаиваете на этом, вы можете сделать что-то похожее на то, что предлагает sschale, и использовать переменную для отслеживать, вызвали ли вы свой метод или нет.

Дело в том, что вам нужно определить эту переменную как static, чтобы она сохранялась в области class, а не в области экземпляра.

Например:

static BOOL firstCalled = NO;

- (void)viewDidLoad {
    [super viewDidLoad];

    if (!firstCalled) {
        firstCalled = YES;
        [self foo];
    }
}
person Hamish    schedule 15.03.2016
comment
Ну, может я не правильно выражаюсь. В моем myViewController у меня есть метод, который - (недействителен) что угодно {myViewController * theSubview; [theScrollView addSubview: [представление theSubview]]; } - person Sjakelien; 16.03.2016
comment
В итоге я создал masterViewController, чтобы избавиться от рекурсивных вызовов. - person Sjakelien; 24.03.2016

Каждый подкласс должен вызывать [super viewDidLoad] в цепочке, так что код действительно должен вызываться только один раз.

Однако, если вам нужно убедиться, что он выполняется только один раз, добавьте @property (nonatomic) BOOL runOnce; в интерфейс этого файла, а затем в -(viewDidLoad) выполните:

if(!self.runOnce) {
    //all code that is only run once
    self.runOnce = YES;
}
person sschale    schedule 15.03.2016
comment
Я сделал именно то, что вы предлагаете. Но это не сработало. Чтобы увидеть, что происходит, я вставил NSLog (runOnce? @Yes: @No); непосредственно перед строкой if (! runOnce) {в viewDidLoad. Моя консоль говорила «нет» столько раз, сколько у меня было подвидов. - person Sjakelien; 16.03.2016
comment
Нет, вы должны поместить этот код в цикл if. - person sschale; 16.03.2016
comment
Это вне цикла. - person Sjakelien; 16.03.2016