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



我有一个RootViewController,它调用AddQuoteViewController,并且我在RootViewController中设置了一个变量"subject_id",但该变量没有显示在AddQuoteVViewController中,我需要帮助理解为什么以及如何修复它。

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

但一无所获。必须有一个简单的方法来做到这一点。

首先,您的第三个代码块中有一个错误。此:

RootViewController *rv = [RootViewController alloc] ;

应该是这样的:

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

但严格来说,这并不是您没有看到实例变量的原因。

如果我理解正确的话,前两个代码块在RootViewController中,它们实例化一个AddQuoteViewController并呈现它。然后,从AddQuoteViewController中的第三个代码块开始,您想访问产生它的RootViewController的成员变量(subject_id)。

AddQuoteViewController中实例化RootViewController的方法不起作用,因为您正在创建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];
}

您需要像在RootViewController上一样,在AddQuoteViewController上创建subject_id属性。

有多种方法可以做到这一点,但答案很简单-您可以在AddQuoteViewController 上设置对RootViewController的引用作为属性

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

顺便说一句,你在问题中做的一些事情有点不寻常,比如试图通过分配一个新的对象来获得对对象的引用,以及创建一个新导航控制器并将其呈现为模态视图控制器——通常你会做其中之一(不需要创建新的导航控制器)。即,您可以创建一个视图控制器并以模式方式呈现它,或者创建一个查看控制器并将其推送到当前的导航控制器堆栈上。

不能像那样跨视图控制器访问变量。看看如何创建一个全局可访问的单例类。我认为有一个例外是,您可以在AppDelegate中访问它们,但不建议使用全局变量。