UIViewController: использование необъявленного идентификатора

#iphone #objective-c #uiviewcontroller

#iPhone #objective-c #uiviewcontroller

Вопрос:

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

 - (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, могу ли я вместо этого поместить его один раз в конце метода?

Ответ №1:

 - (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 ...
    }


}
  

Ответ №2:

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

Это необходимо перед переключением:

 UIViewController* controller = nil;
  

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

Комментарии:

1. Да, я также проверил это, но тогда у меня есть две локальные переменные controller , и они используют UIViewController вместо MyViewControllerX . Итак, я объявляю эту переменную два раза. Удаляя MyViewControllerX * перед controller , у меня возникают проблемы с этой строкой, controller.aVariable = self.myVariable; потому что она не знает о существовании controller.aVariable : Property aVariable not found on object of type UIViewController*