0

我有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; 
}

在 C 类。我正在推送 ClassA 视图控制器

C类.m

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

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

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

谢谢, 阿尼什

4

5 回答 5

2

我考虑过以下类的层次结构 - 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
于 2012-05-09T08:58:32.533 回答
1

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

在 classC 中,您正在创建 ClassA 的不同实例,然后检查为前一个实例设置的值。

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

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


我认为你这次完全错了。

  1. 您可以实现委托方法以在弹出之前将对象传回,然后使用它。
  2. 如果您使用静态变量,则该类的所有实例都是通用的。这可能是不可取的。
  3. 或者你可以发布一个 NSNotification。并将对象与它一起传递。这些通知的侦听器可以捕获它并以不同的方式处理它。
于 2012-05-09T08:57:33.240 回答
0

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

要获取 ClassA 的现有实例,您可以控制导航控制器的堆栈(此代码类似于 @rishi 代码,但使用快速枚举):

for (UIViewController *obj in self.navigationController.viewControllers) {
    if ([obj isKindOfClass:[ClassA class]]) {
        ClassA *ca=(ClassA *)obj;
        [ca passValue:value];
    }
}
于 2012-05-09T09:11:46.913 回答
0

不要打印 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];

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

祝你好运

于 2012-05-09T09:44:25.290 回答
0

当你跳到 C 类时改变你的类:

ClassC *obj = [[ClassC alloc]init];
[obj passValue:value];
[self.navigationController popViewControllerAnimated:YES]; 
[obj release];
于 2012-05-09T08:49:10.913 回答