UIViewController: использование необъявленного идентификатора - PullRequest
0 голосов
/ 07 мая 2011

У меня есть метод, который выглядит следующим образом:

- (void)testMethod:(int)myNumber {
    switch (myNumber) {
        case 0: {
            MyViewController0 *controller = [self.myViewControllers objectAtIndex:myNumber];
            if ((NSNull *)controller == [NSNull null]) {
                controller = [[MyViewController0 alloc] initWithNibName:@"MyView0" bundle:nil];
                controller.aVariable = self.myVariable;
                [self.myViewControllers replaceObjectAtIndex:myNumber withObject:controller];
                [controller release];
            }
            if (controller.view.superview == nil) {
                // do some stuff with controller ...
            }
            break;
        }
        case 1: {
            MyViewController1 *controller = [self.myViewControllers objectAtIndex:myNumber];
            if ((NSNull *)controller == [NSNull null]) {
                controller = [[MyViewController1 alloc] initWithNibName:@"MyView1" bundle:nil];
                [self.myViewControllers replaceObjectAtIndex:myNumber withObject:controller];
                [controller release];
            }
            if (controller.view.superview == nil) {
                // do some stuff with controller ...
            }
            break;
        }
        // ...
    }
}

Моя проблема связана с этими строками, которые всегда одинаковы:

if (controller.view.superview == nil) {
    // do some stuff with controller ...
}

Итак, я хочу удалить эти строкивнутри распределительного шкафа и поместите их в конец метода.

Проблема в том, что если я это сделаю, я получу ошибку: Use of undeclared identifier controller.Я думаю, это потому, что вполне возможно, что controller может остаться необъявленным (если ни один случай не будет успешным).

Но что я могу сделать, чтобы избежать вставки этих строк в каждое утверждение case, могу ли я вместо этого поставитьодин раз в конце метода?

Ответы [ 2 ]

1 голос
/ 07 мая 2011
- (void)testMethod:(int)myNumber {
    UIViewController* controller = nil;

    switch (myNumber) {
        case 0: {
            controller = [self.myViewControllers objectAtIndex:myNumber];
            if ((NSNull *)controller == [NSNull null]) {
                controller = [[MyViewController0 alloc] initWithNibName:@"MyView0" bundle:nil];
                ((MyViewController0*)controller).aVariable = self.myVariable;
                [self.myViewControllers replaceObjectAtIndex:myNumber withObject:controller];
                [controller release];
            }

            break;
        }
        case 1: {
            controller = [self.myViewControllers objectAtIndex:myNumber];
            if ((NSNull *)controller == [NSNull null]) {
                controller = [[MyViewController1 alloc] initWithNibName:@"MyView1" bundle:nil];
                [self.myViewControllers replaceObjectAtIndex:myNumber withObject:controller];
                [controller release];
            }
            break;
        }
        // ...
    }

    if( !controller ) {
       //todo
    } else
    if ( !controller.view.superview ) {
                // do some stuff with controller ...
    }


}
1 голос
/ 07 мая 2011

Это потому, что вы объявляете переменную только в этих конкретных областях, и вы пытаетесь использовать ее за пределами объявленной области действия (что нельзя, поскольку это целая точка области действия).

Вам нужно это до переключения:

UIViewController* controller = nil;

Тогда в ваших инструкциях case вы просто присваиваете существующую переменную controller вместо объявления ее в этой области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...