繁体   English   中英

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

[英]How do I pass object from one ViewController to another ViewController

我有一个调用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);

但是什么也得不到。 必须有一种简单的方法来执行此操作。

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

RootViewController *rv = [RootViewController alloc] ;

应该是这样的:

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

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

如果我理解正确,则代码的前两个块位于RootViewController ,它们实例化一个AddQuoteViewController并将其呈现。 然后,在您的第三个代码块(位于AddQuoteViewController ,您想要访问RootViewController的成员变量( subject_id )。

of RootViewController . 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属性。

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

这样做的方法有很多种,但答案很简单-您可以将对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);

附带说明一下,您在问题中所做的一些事情有些不寻常,例如尝试通过分配一个新对象来引用该对象,并创建一个新的导航控制器并将其显示为模式视图控制器通常您会做一个或另一个(并且不需要创建新的导航控制器)。 也就是说,您要么创建一个视图控制器并以模态形式显示它,要么创建一个视图控制器并将其推入当前的导航控制器堆栈中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM