2010-12-18 2 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のように点在の負荷から知っているが、私はPopoverViewController'scountProductCodes配列に配列countProductCodeを渡すことはできません。

エラー:

は私が

"クラスメソッドへのアクセス不明 'setCountProductCodes'" を得続けます。

これは私がやっていることは本当に愚かなことかもしれませんが、それは私を夢中にしています!

誰でも助けてください。

おかげで ジェームスあなたのコードで

答えて

2

PopoverContentViewController.countProductCodes = countProductCode; 

は次のようになります。

popoverContentViewController.countProductCodes = countProductCode; 

あなたのインスタンス名はクラス名と異なっている必要があります。 mainViewControllerクラスで

+0

ではなく、親と子ビュー・コントローラとの間の強い結合の根本的な問題を解決しません。 – GorillaPatch

1

、以下の方法

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

にあなたはクラス名を使用して "countProductCodes" をアクセスしています。オブジェクトを使用してアクセスする必要があります。

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

これは私の配列をPopoverContentViewControllerクラスのオブジェクト(インスタンス?)に渡します。どのようにPopoverContentViewControllerを取得して、テーブルビューとしての配列を表示するのか?あなたの助けは本当にありがたいです –

+0

あなたは "self.countProductCodes"のようなPopoverContentViewControllerクラスでその配列にアクセスできます – Satya

6

親愛なるジェームス、 ように私はあなたがモデル - ビュー - コントローラのパラダイムをよく見ていたいと思います。あなたのアプリでは、ある種の「スーパークラス」を実装しようとしています。その意味を説明しましょう:

明らかにコントローラであるMainViewControllerクラスには、実装されたモデルの一部もあります。これは悪い考えですが、最初は非常に一般的なものです。たぶん私はあなたのデザインを誤解しますが、ここで私はそれを実装する方法を次のとおりです。

モデル私はあなたのケースでプロパティとしてNSMutableArrayでカスタムNSObjectサブクラスと同じくらい簡単なことができ、適切なモデルオブジェクトを実装します。さらに、このモデルには、インターネットからデータを取り出すためのメソッドが実装されています。それは正しいです:モデルでネットワーキングを行います。コントローラから呼び出す方法は- (void) refreshProductCodeでなければなりません。あなたが本当に気に入らなければならない場合は、ダウンロードをカプセル化するためにNSOperationを使用してください(操作自体はすでに非同期に実行されているため、NSURLConnectionの同期バリアントを使用します)。JSON文字列の解析にはこれはバックグラウンドで実行され、UIは応答性を保ちます。

これでモデルがあなたのものをダウンロードしています - すばらしいですが、完了したらどうすればわかりますか?いったん完了すると、モデルから通知を送信します。ダウンロードに失敗したらどうしますか?あなたはそれを正しく推測しました:それが失敗したという通知を投稿してください。

コントローラモデルからデータを表示する必要のあるコントローラは、まずモデルオブジェクトを取得します。この場合、モデルオブジェクトはAppControllerのプロパティです。コントローラは、このモデルオブジェクトのプロパティを持ち、それを保持するため、コントローラが存続している間にモデルオブジェクトが消えないようにします。コントローラはまた、モデルの通知を登録する。それでは、典型的なダウンロードはどのように動作しますか?

  1. ステータスバーのモデルオブジェクト
  2. コール-(void) refreshProductCode
  3. モデルオブジェクトの表示ネットワークアクティビティスピナーのインスタンスを取得し、通知はUIを更新し、成功に、入って来たときに通知
  4. 待ちます失敗した場合には、ユーザにダウンロードを再開するか、メモを表示してください。また、ネットワークアクティビティスピナーを無効にします。

どのようにView Controller間でデータをシャッフルしますか? View Controllerは、マフィアのように少しずつ動作する必要があります。すべてのView Controllerは、必要に応じて動作しています。たとえば、View Controllerで製品の詳細を表示する場合は、すべての製品を含むモデルをコントローラに渡すことはありません。その代わりに、ディテールビューコントローラーには、説明テキスト、写真などのすべての情報を持つ1つのプロダクトモデルオブジェクトだけを保持するインスタンス変数があります。次に、アプリに商品情報を表示したい場合は、そのビューコントローラを再利用することができます。必要なのは、その仕事を行う製品モデルオブジェクトだけです。 MainViewController.h

0

+(NSMutableArray)arrayRes; 

MainViewController.m

+(NSMutableArray)arrayRes{ 
return countProductCode; 
} 

PopoverViewController通常

としてcountProductCodeアレイ上のコード変更のいずれかを行います。M真であってもよい DECLARE @class MainViewController;のviewDidLoad

NSMutableArray *newArray; 
newArray = [MainViewController arrayRes]; 
関連する問題