繁体   English   中英

在目标C中的视图控制器之间传递对象

[英]Passing Objects between View Controllers in Objective C

我有3个班级:A级,B级,C级。

我正在将变量从ClassB传递到ClassA,然后弹出ClassB(视图控制器)

//ClassB.m

    ClassA *obj = [[ClassA alloc]init];
    [obj passValue:value];
    [obj release];

[self.navigationController popViewControllerAnimated:YES]; //It will pop and show ClassC View Controller.

//ClassA.h

NSString* storeValue;
-(void)passValue:(NSString*)getValue;

//ClassA.m

-(void)passValue:(NSString*)getValue
{
   NSLog(@"Value is %@",getValue); // I am Getting Value Here
   storeValue = getValue; 
}

在ClassC中。 我正在推送ClassA View Controller

C类

ClassA *objA = [[ClassA alloc]init];
[self.navigationController pushViewController:objA animated:YES];
[objA release];

现在在A类中。内部视图Didload。 我试图打印storeValue。 但它返回null。 我在这里做错了。 谁能指导我使用示例代码以正确的方式做到这一点。

我尝试使用属性来访问变量。 但它返回空值。

谢谢阿尼什

我考虑过以下类的层次结构-C-> A-> B您无需为A类创建任何对象,因为该对象已经在导航堆栈中。 采用 -

NSMutableArray *activeControllerArray = [self.navigationController.viewControllers mutableCopy];
for(int i = 0, i <[activeControllerArray  count], i++) {
    if([[activeControllerArray objectAtIndex:i] isKindOfClass:[ClassA class]) {
        //Set Property and instance variable here
        ClassA *obj = [activeControllerArray objectAtIndex:i];
        obj.someVariable = somevalue; //you can use in any way that you want

        break;
     }
}
//Pop to previous view now

您实际上是在指ClassA的多个实例。 在ClassB中,您将创建一个新的ClassA对象并设置一个值。

在classC中,您将创建ClassA的另一个实例,然后检查为先前实例设置的值。

如果声明为静态,则可以在所有实例中访问“ storeValue”中设置的值。

其他实例变量属于类的实例,并且由每个实例单独管理。


我认为您这次做的完全错误。

  1. 您可以实现委托方法,以在弹出对象之前将其传递回,然后再使用它。
  2. 如果使用静态变量,则该类的所有实例将是通用的。 这可能不是理想的。
  3. 或者,您可以发布NSNotification。 并将对象与之一起传递。 这些通知的侦听器可以捕获它并以不同的方式处理它。

跳到C类时更改您的类:

ClassC *obj = [[ClassC alloc]init];
[obj passValue:value];
[self.navigationController popViewControllerAnimated:YES]; 
[obj release];

正如@JS Rodrigues所说,您并不是在指向ClassA的现有实例,而只是在创建ClassA的另一个实例。

要获取ClassA的现有实例,可以在navigationcontroller的堆栈上进行控制(此代码类似于@rishi代码,但使用快速枚举):

for (UIViewController *obj in self.navigationController.viewControllers) {
    if ([obj isKindOfClass:[ClassA class]]) {
        ClassA *ca=(ClassA *)obj;
        [ca passValue:value];
    }
}

不要在viewDidLoad中打印值

viewDidLoad在分配之后和传递变量之前触发,因此,您的变量返回NULL

如果确实需要通过这种方式,请在header中设置变量,然后使用通过方法

例如 :

您想要将字符串myString从A传递到B,然后转到B并打印字符串

在A上,导入B,然后执行以下功能

self.bViewController = [[BVIEWCONTROLLER alloc]init];

[self.bViewController setmyString:myString];

//if u're running OS lower than 5.0, include this
[self.bViewController viewDidAppear];

之后,在b视图控制器中打印myString变量,然后在viewDidAppear方法中。

祝好运

暂无
暂无

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

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