簡體   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