переменная вне области видимости между контроллерами представления - PullRequest
0 голосов
/ 09 февраля 2010

Я работаю над навигационным приложением для iphone. У меня есть некоторая информация, которую я хочу передать, когда я помещаю новый контроллер представления в стек, скажем, myObject. Итак:

aViewController *vc = [[aViewController alloc] initwith....];
vc.object = myObject //myObject is defined in the current view controller
[self.navigationController pushViewController:vc]; //vc.object has correct value here

[vc release]

Переменная объекта в aViewController установлена ​​для сохранения нового объекта. Что происходит, когда я попадаю в код нового контроллера представления, я вижу, что этот объект установлен как «вне области видимости», и я не могу добраться до него, хотя я проверил, что vc.object действителен, когда контроллер представления выталкивается.

Что означает ошибка вне области видимости, и как лучше всего это исправить? Спасибо!

Ответы [ 2 ]

1 голос
/ 07 сентября 2010

У меня была похожая проблема.

В моем случае NSMutableArray был объявлен как закрытая переменная в классе.

Когда я обернул переменную публичным свойством с тем же именем И добавил "self". перед именем переменной в didSelectRowAtIndexPath моя ошибка исчезла.

0 голосов
/ 10 февраля 2010

Хорошо, очень стыдно объявить, что я все понял неправильно. Кажется, что объект был вне области видимости в первую очередь. myObject - это фактически [myObjectList objectForIndex: index], где myObjectList - это NSMutableArray * myObjectList. Это не синтезированное свойство. Объект - это класс, производный от NSObject (@interface Object: NSObject)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    for(Object* p in myObjectList)
    {
        NSLog(@"%@", p.name); //this returns a garbled message
    }
    MyObjectDetailViewController * vc = [[MyObjectDetailViewController alloc] initWithStyle:UITableViewStylePlain];
    vc.object = [myObjectList objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:vc animated:YES]; //when i hover over "vc" in debugger, it shows that vc.object is defined(i see my name variables) but when i hover over myObjectList in the previous line, the objects say "out of scope"

    [vc autorelease];
}

Чтобы покрыть всю землю, вот где создается экземпляр массива. Эта функция является функцией обратного вызова из sqlite's sqlite3_exec.

int callback (void* context, int count, char** values, char** columns)
{
    NSMutableArray *list = (NSMutableArray*)context;
    Object *obj = [[Object alloc] initWithName:[NSString stringWithUTF8String:values[kName]]];
    [list addObject:obj];
    [obj release];
    NSLog(@"After release");
    for(Object *p in list)
    {
        NSLog(@"%@", p.name); //this prints out okay
    }
    return SQLITE_OK;
}

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

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