0

本当にもっと助けが必要です!

あるView Controllerから別のView Controllerに配列を渡そうとしています。後者は「子」View Controllerだと思いますか?

私のコードは次のとおりです。

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

PopoverViewController.m:

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

@implementation PopoverContentViewController

@synthesize countProductCodes;
...

私は多くを切り取りましたが、NSLogの点線の負荷から、データを取得するなどのことを知っていますが、配列countProductCodeを配列に渡すことはできませんPopoverViewController's countProductCodes

私は得続けます

「不明な 'setCountProductCodes:' クラス メソッドにアクセスしています」

エラー。

これは私がしていることは本当にばかげたことかもしれませんが、それは私を夢中にさせています!

誰でも助けてもらえますか?

ありがとうジェームズ

4

4 に答える 4

6

親愛なる James さん、Model-View-Controller パラダイムを詳しく見てみたいと思います。あなたのアプリでは、ある種の「スーパークラス」を実装しようとしています。それが何を意味するのか説明しましょう:

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

モデル適切なモデル オブジェクトを実装します。これは、プロパティとして aを持つカスタムNSObjectサブクラスと同じくらい簡単です。NSMutableArrayさらに、このモデルには、インターネットからデータを取得するためのメソッドが実装されています。そうです: モデル内でネットワーキングを行います。- (void) refreshProductCodeコントローラーから呼び出すようなメソッドが必要です。本当に凝ったものにしたい場合は、 を使用しNSOperationてダウンロードをカプセル化します (操作自体は既に非同期で実行されているため、 の同期バリアントを使用しNSURLConnectionます)。JSON 文字列の解析に時間がかかる場合は、また、これはバックグラウンドで実行されるため、UI の応答性は維持されます。

これで、モデルはあなたのものをダウンロードしています - 素晴らしいですが、それがいつ完了したかをどうやって知ることができますか? 完了したら、モデルから通知を投稿します。ダウンロードに失敗したら?ご想像のとおり、失敗したという通知を投稿してください。

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

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

ビューコントローラー間でデータをどのようにシャッフルしますか? ビュー コントローラーは、マフィアのように動作する必要があります。すべてのビュー コントローラーは、知る必要がある場合にのみ機能します。たとえば、View Controller に製品の詳細を表示させたい場合、すべての製品を含むモデルをコントローラに渡すことはありません。代わりに、説明テキスト、写真などのすべての情報を含む 1 つの生産モデル オブジェクトのみを保持する詳細ビュー コントローラーにインスタンス変数を設定します。ジョブを実行するために必要なのは製品モデル オブジェクトだけなので、View Controller を再利用できます。

于 2010-12-19T09:38:21.657 に答える
2

あなたのコードで:

PopoverContentViewController.countProductCodes = countProductCode;

次のようにする必要があります。

popoverContentViewController.countProductCodes = countProductCode;

インスタンス名はクラス名とは異なる必要があります。

于 2010-12-18T15:06:31.300 に答える
1

mainViewController クラスでは、次のメソッドで

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

クラス名を使用して「countProductCodes」にアクセスしています。そのオブジェクトを使用してアクセスする必要があります。

お気に入り

PopoverContentViewController *obj = [[PopoverContentViewController alloc] init];
obj.countProductCodes = countProductCodes;
于 2010-12-18T15:11:50.543 に答える
0

MainViewController.h:

+(NSMutableArray)arrayRes;

MainViewController.m

+(NSMutableArray)arrayRes{
return countProductCode;
}

通常どおり countProductCode 配列のコード変更を実行します

PopoverViewController.m 宣言@class MainViewController;し、viewDidLoadで

NSMutableArray *newArray;
newArray = [MainViewController arrayRes];
于 2012-10-19T10:38:01.833 に答える