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

时间:2012-05-09 08:47:45

标签: iphone objective-c xcode oop

我有3个班级A班,班级B班,班级C.

我将变量从ClassB传递到ClassA,然后弹出ClassB(View Controller)

// 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

ClassC.m

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

现在在A级。内部视图Didload。我试图打印storeValue。但它返回null。我在这里做错了什么。任何人都可以指导我以正确的方式使用示例代码。

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

谢谢, 阿尼什

5 个答案:

答案 0 :(得分:2)

我考虑过以下课程等级 -   C - > A - >乙 您不需要为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

答案 1 :(得分:1)

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

在classC中,您将创建一个不同的ClassA实例,然后检查上一个实例的值集。

如果声明为static,则可以在所有实例中访问'storeValue'中设置的值。

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


我认为你这次完全错了。

  1. 您可以实现委托方法以在之前传回对象 弹出然后使用它。
  2. 如果你使用静态变量,它将是所有实例的常见变量 那班。这可能是不可取的。
  3. 或者您可以发布NSNotification。并将对象随之传递。 这些通知的监听器可以捕获并处理它 不同。

答案 2 :(得分:0)

在弹出C类时改变你的课程:

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

答案 3 :(得分:0)

正如@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];
    }
}

答案 4 :(得分:0)

不要在viewDidLoad中打印值

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

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

例如:

你想将字符串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方法中输入。

祝你好运