2012-02-01 165 views
0

我有一个调用AddQuoteViewController的RootViewController,并且在RootViewController中设置了一个变量“subject_id”,该变量没有显示在AddQuoteViewController中,我需要帮助理解原因以及如何解决它。如何将对象从一个ViewController传递到另一个ViewController

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

但什么也没得到。必须有一个简单的方法来做到这一点。

+0

[如何从一个ViewController访问对象到另一个ViewController]的可能重复(http://stackoverflow.com/questions/704524/how-to-access-objects-from-one-viewcontroller-to-another-viewcontroller )。这是一个*非常常见的问题,所以如果这里链接的不是你正在寻找的东西,继续寻找 - 这个主题有很多变化可用。 – Caleb 2012-02-01 22:49:13

+0

谢谢Caleb,但我确实花了一些时间寻找,并没有找到我在其他帖子中获得的明确方向。 – jroyce 2012-02-01 22:52:39

回答

1

有这样做的各种方式,但一个简单的答案 - 您可以在AddQuoteViewController设置为属性的RootViewController的参考

在AddQuoteViewController.h

RootViewController *rvc 

...

@property (nonatomic,assign) RootViewController *rvc; 

andrespondin g在你的实现类中进行合成和发布。 (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); 

作为一个侧面说明有你在你的问题正在做几件事情,是有点不寻常,就像试图通过分配一个新的,并且还创造了新的导航共同去的对象的引用并且将其呈现为模式视图控制器,通常您可以执行一个或另一个(并且不需要创建新的导航控制器)。即您可以创建视图控制器并以模态方式呈现它,或者您将创建一个视图控制器并将其推送到当前的导航控制器堆栈中。

+1

这不会成为循环引用吗?这可能会给内存管理增加一些复杂性,但如果这里使用的是ARC,我还不太了解ARC。 – 2012-02-01 22:42:52

+0

感谢这个方向。我知道我的代码有点疯狂 - 那是因为我在字面上找到了自己的脚并在这个过程中摸索着。 – jroyce 2012-02-01 22:48:26

+0

Jefferson先生 - 好点 - 因为aqvc是rootvc的成员,所以当它释放它时仍然会被aqvc保留。所以为了避免这个问题,最好让aqvc中的属性成为assign属性而不是保留在这种情况下。我编辑了这篇文章。 – gamozzii 2012-02-02 00:40:54

1

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

+0

从技术上讲,单身人士可以工作,但这对于OP的问题几乎肯定是一个糟糕的设计选择。单身人士可能会有自己的位置,但如果他们被滥用,他们会很快破坏您的应用程序的设计。我会称这种情况为滥用:) – 2012-02-01 23:53:56

2

首先,您的第三块代码存在错误。这:

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]; 
} 

你需要在AddQuoteViewController创建subject_id属性,您做了同样的方式RootViewController

+0

谢谢你的提示。我认为我的AddQuoteViewController必须已经设置了subject_id变量才能使上述功能正常工作? – jroyce 2012-02-01 22:50:25

+0

是的。你已经完成了它,当你可以在你的第一个代码块中说'self.subject_id'和'sub.subject_id'。 'subject_id'将被声明为'@ property'声明,就像gamozzii的答案所示。 – 2012-02-01 23:07:30

相关问题