#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*