2010-12-18 106 views
0

我真的需要更多的幫助!視圖控制器之間傳遞數組?

我想從一個視圖控制器傳遞數組到另一個視圖控制器。我認爲後者是一個'孩子'視圖控制器?

我的代碼如下:

MainViewController.h:

#import <UIKit/UIKit.h> 
#import <AudioToolbox/AudioToolbox.h> 
#import <AVFoundation/AVFoundation.h> 

@interface HelloWorldIOS4ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate, AVAudioPlayerDelegate> { 
    NSMutableArray *countProductCode; 
    UIPopoverController *detailViewPopover; 
} 

@property (nonatomic, retain) NSMutableArray *countProductCode; 

@property (nonatomic, retain) UIPopoverController *detailViewPopover; 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 
... 
@end 

MainViewController.m

#import "HelloWorldIOS4ViewController.h" 
#import "JSON.h" 
#import "PopoverContentViewController.h" 

@implementation HelloWorldIOS4ViewController 

@synthesize detailViewPopover; 
@synthesize countProductCode; 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

    NSDictionary *results = [jsonString JSONValue]; 
    NSLog(@"RETURN: %@", results); 

    [countProductCode removeAllObjects]; 

    NSArray *products = [results objectForKey:@"items"]; 

    for (NSDictionary *row in products) 
    { 
     NSString *code = [row objectForKey:@"ic"]; 
     [countProductCode addObject:code]; 
    } 

    PopoverContentViewController.countProductCodes = countProductCode; 
}  

PopoverViewController.h:

@interface PopoverContentViewController : UITableViewController { 
    NSMutableArray *countProductCodes; 
} 
@property (nonatomic, retain) NSMutableArray *countProductCodes; 
@end 

PopoverViewControl ler.m:

#import "PopoverContentViewController.h" 
#import "HelloWorldIOS4ViewController.h" 

@implementation PopoverContentViewController 

@synthesize countProductCodes; 
... 

我已經削減了很多,但我從的NSLog的周圍點綴的負載知道我取回數據等,但我不能數組countProductCode傳遞給PopoverViewController'scountProductCodes陣列。

我不斷收到

「訪問未知 'setCountProductCodes:' 類方法」

錯誤。

這可能真的很愚蠢,我正在做,但它讓我瘋了!

任何人都可以幫忙嗎?

感謝 詹姆斯

回答

2

在您的代碼:

PopoverContentViewController.countProductCodes = countProductCode; 

應該是:

popoverContentViewController.countProductCodes = countProductCode; 

你的實例名應與類名不同。

+0

這可能是真實的,但並沒有解決父母和孩子視圖控制器之間的強耦合的根本問題。 – GorillaPatch 2010-12-22 11:11:24

1

在mainViewController類,在下面的方法

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 

您正在訪問的 「countProductCodes」 使用的類名。您應該使用其對象進行訪問。

PopoverContentViewController *obj = [[PopoverContentViewController alloc] init]; 
obj.countProductCodes = countProductCodes; 
+0

好的,所以這會將我的數組傳遞給PopoverContentViewController類的對象(一個實例?)。 - 任何想法如何讓PopoverContentViewController然後顯示我的數組作爲表視圖?您的幫助非常感謝 – 2010-12-18 16:11:30

+0

您可以在PopoverContentViewController類中訪問該數組,如「self.countProductCodes」 – Satya 2010-12-20 07:07:15

6

親愛的詹姆斯, 我想你想有在模型 - 視圖 - 控制器模式一探究竟。在你的應用程序中,你試圖實現某種「超類」。讓我解釋一下這是什麼意思:

在你的MainViewController類中,這顯然是一個控制器,還有一部分模型被實現。這是一個壞主意,但是一開始就很常見。也許我誤解你的設計,但這裏是我將如何實現它:

示範我會實現一個合適的模型對象,這可能是你的情況一樣容易定製NSObject子類有NSMutableArray作爲屬性。此外,這種模式將具有從互聯網上檢索數據的方法。這是正確的:在模型中進行聯網。你將不得不有你想要從你的控制器調用的方法,如- (void) refreshProductCode。如果你想變得很花哨,用NSOperation來封裝下載(然後你會使用NSURLConnection的同步變體,因爲操作本身已經被異步執行了),那麼如果你解析JSON字符串需要的是好的東西更長,這也是在後臺執行的,你的用戶界面將保持響應。

所以現在模型正在下載你的東西 - 很好,但我怎麼知道它什麼時候完成?那麼你會在模型完成後發佈一個通知。如果下載失敗會怎樣?你猜對了:發佈通知失敗。

控制器需要顯示模型數據的控制器首先獲取模型對象。在這種情況下,模型對象是您的AppController上的一個屬性。然後控制器擁有該模型對象的屬性並保留該屬性,以便模型對象在控制器處於活動狀態時不會消失。控制器然後也註冊模型的通知。那麼典型的下載是如何工作的呢?

  1. 模型對象上獲取的模型對象的實例
  2. 通話-(void) refreshProductCode在狀態欄中
  3. 顯示網絡活動微調,並等待通知
  4. 時通知進來,成功刷新UI並在失敗時重新啓動下載或向用戶顯示備註。還要禁用網絡活動微調器。

如何在視圖控制器之間混洗數據?視圖控制器應該像黑手黨一樣操作:每個視圖控制器都在需要知道的基礎上工作。例如,如果您希望視圖控制器顯示產品的詳細信息,則不會將所有產品的模型傳遞給控制器​​。相反,您將在只有一個產品模型對象的詳細視圖控制器上擁有一個實例變量,其中包含描述文本,照片等所有信息。最酷的是如果您想再次在您的應用中顯示產品信息,那麼您可以重用該視圖控制器,因爲它需要的只是一個產品模型對象來完成其工作。

0

MainViewController.h

+(NSMutableArray)arrayRes; 

MainViewController.m

+(NSMutableArray)arrayRes{ 
return countProductCode; 
} 

執行任何countProductCode陣列上的代碼變化通常

PopoverViewController。米 聲明@class MainViewController;viewDidLoad中

NSMutableArray *newArray; 
newArray = [MainViewController arrayRes]; 
相關問題