如何将对象从一个ViewController传递到另一个ViewController

时间:2012-02-01 22:27:53

标签: iphone objective-c

我有一个调用AddQuoteViewController的RootViewController,并且我在RootViewController中设置了一个变量“subject_id”,它没有出现在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 个答案:

答案 0 :(得分:2)

首先,第三块代码中存在错误。这样:

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 :(得分:1)

您无法在视图控制器之间访问变量。 看看创建一个可全局访问的单例类。 我认为您可以在AppDelegate中访问它们,但不建议使用全局变量。

答案 2 :(得分:1)

有多种方法可以做到这一点,但简短的回答 - 您可以将RootViewController的引用设置为AddQuoteViewController上的属性

在AddQuoteViewController.h中

RootViewController *rvc

...

@property (nonatomic,assign) RootViewController *rvc;

并在您的实现类中进行相应的合成和发布。 (AddQuoteViewController.m)

然后在RootViewController中创建AddQuoteViewController时,还要设置此属性:

- (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);

作为旁注,你在问题中做了一些有点不寻常的事情,比如试图通过分配一个新对象来获得对象的引用,还创建一个新的导航控制器并将其呈现为一个模态视图控制器通常你会做一个或另一个(并且不需要创建一个新的导航控制器)。即你要么创建一个视图控制器并以模态方式呈现它,要么你将创建一个视图控制器并将其推送到当前的导航控制器堆栈。