Как передать объект из одного ViewController в другой ViewController - PullRequest
0 голосов
/ 02 февраля 2012

У меня есть RootViewController, который вызывает AddQuoteViewController, и есть переменная "subject_id", которую я установил в RootViewController, который не отображается в AddQuoteViewController, и мне нужна помощь, чтобы понять, почему и как это исправить.

    Subject *sub = [self.tableDataSource objectAtIndex:indexPath.row];

    self.subject_id = sub.subject_id;

    [self addQuote_Clicked: sub];

...

- (void) addQuote_Clicked:(id)sender {

    if(aqvController == nil)
        aqvController = [[AddQuoteViewController alloc] initWithNibName:@"AddQuoteView" bundle:nil];

    if(addNavigationController == nil)
        addNavigationController = [[UINavigationController alloc] initWithRootViewController:aqvController];

    [self.navigationController presentModalViewController:addNavigationController animated:YES];
}

Затем в моем AddQuoteViewController я пытаюсь получить доступ к этой переменной следующим образом:

RootViewController *rv = [RootViewController alloc] ;

NSLog(@"rv.Subject_id = %d", rv.subject_id);

Но ничего не получите. Там должен быть простой способ сделать это.

Ответы [ 3 ]

2 голосов
/ 02 февраля 2012

Прежде всего, есть ошибка в вашем третьем блоке кода. Это:

RootViewController *rv = [RootViewController alloc] ;

Должно быть так:

RootViewController *rv = [[RootViewController alloc]init];

Но, строго говоря, это не то, почему вы не видите переменную вашего экземпляра.

Если я правильно понимаю, первые два блока кода находятся в RootViewController, и они создают экземпляр AddQuoteViewController и представляют его. Затем из третьего блока кода, который находится в AddQuoteViewController, вы хотите получить доступ к переменной-члену (subject_id) из RootViewController, которая вызвала его.

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

Возможно, самый простой способ сделать это - создать соответствующее свойство в AddQuoteViewController и установить его при создании:

- (void) addQuote_Clicked:(id)sender {

if(aqvController == nil)
    aqvController = [[AddQuoteViewController alloc] initWithNibName:@"AddQuoteView" bundle:nil];

if(addNavigationController == nil)
    addNavigationController = [[UINavigationController alloc] initWithRootViewController:aqvController];

aqvController.subject_id = self.subject_id;

[self.navigationController presentModalViewController:addNavigationController animated:YES];
}

Вам нужно будет создать свойство subject_id для AddQuoteViewController так же, как для RootViewController.

1 голос
/ 02 февраля 2012

Есть несколько способов сделать это, но короткий ответ - вы можете установить ссылку на RootViewController как свойство на вашем AddQuoteViewController

т.е.

в AddQuoteViewController.h

RootViewController *rvc

...

@property (nonatomic,assign) RootViewController *rvc;

и соответствующий синтез и выпуск в вашем классе реализации.(AddQuoteViewController.m)

Затем, когда вы создаете свой AddQuoteViewController внутри вашего RootViewController, также задаете это свойство:

- (void) addQuote_Clicked:(id)sender {

    if(aqvController == nil)
        aqvController = [[AddQuoteViewController alloc] initWithNibName:@"AddQuoteView" bundle:nil];
    aqvController.rvc = self;
... etc.

Затем вы можете получить доступ к любому свойству контроллера корневого представления внутри вашего AddQuoteViewController черезэто свойство:

NSLog(@"rv.Subject_id = %d", self.rv.subject_id);

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

1 голос
/ 02 февраля 2012

Вы не можете получить доступ к переменным через контроллеры представления, как это.Обратите внимание на создание одноэлементного класса, который будет доступен во всем мире.Я думаю, что одним исключением является то, что вы можете получить к ним доступ в AppDelegate, но не рекомендуется иметь глобальные переменные.

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