質問

でバグっ死私のviewcontrollerができtableViewControllerを知っておくなければならないと言われ、その財産であるNSArrayはNSDictionaryにデータが読み込まれによりテーブルに表示されます。

うかを明示すべきと言うようなもの:

[self.tableView useData:self.MyArray];

たいてい複数の配列内にtableViewControllerに切り替えることが一つのプログラム.

私は知ることがtableViewControllerを算出するのに使用しsearchViewController、これを実行する事ができます。:

if (tableView == self.searchDisplayController.searchResultsTableView) {

私にもできています:

self.tableView =  self.searchDisplayController.searchResultsTableView;
[self.tableView reloadData];

ももすることができますのでどう設定します。tableViewのデータソース!

役に立ちましたか?

解決

iPhone教材の大部分は、全体的なアプリの設計に十分な注意を払っていないので、

さて、私はあなたの欲求不満を理解しています。彼らは目の保養インタフェースのための真っすぐを作成し、データを処理することは、最初の場所でアプリの全体の目的であってもアプリはのデータを扱う必要があることを道にのみリップサービスを支払う!

教材は、全体のiPhone /ココアのAPIが基づいているModel-View-Controllerデザインパターンを説明する十分な時間を費やすことはありません。あなたが教材を信じるようにあなたを導いてきたようにUIビューは、プログラムの中核であるという誤った信念の下で間違ったオブジェクトに機能を詰め込むために努力を続けるので、あなたは何かを理解するに苦労しています。この勘違いのもとでは、何も意味はなく、さらにアップルのドキュメントを行いません。

あなたは、バックステップと再考する必要があります。データを表示したときにそれを表示するようにするかを決定するために、ビューの機能ではありません。それは、保持管理したり、アプリのデータを格納するためのテーブルビューコントローラの機能ではありません。これらの機能は正常にデータ・モデル・オブジェクトに属している(あなたはおそらく聞いたことがない。)あなたはビュー間でデータモデルタスクとビューコントローラを分割しようとしているので、あなたがトラブルを抱えている、彼らが所属していないでした。

あなたはテーブルビューコントローラのプロパティとして、テーブルのデータを保持しているので、

どうやら、あなたのアプリケーションであっても、データモデルを持っていません。あなたは、多くの場合、単純なチュートリアルの例でこれを見ますが、それはほとんどの些細なアプリケーションが、任意の複雑さの下で崩れる悪いデザインです。

その代わり、自分のデータがに保存されていると、独自のカスタムオブジェクトで管理されなければなりません。これは、データモデルです。あなたは、このようなデータモデルオブジェクトに何かを作成しますので、二つのアレイにまたがってデータを持っているように、あなたのケースでは、それが聞こえるます:

@interface MyDataModel : NSObject {
@protected
    NSArray *arrayOne;
    NSArray *arrayTwo;
@public
    NSArray *currentlyUsedArray;

}
@property(nonatomic, retain)  NSArray *currentlyUsedArray;

-(void) switchToArrayOne;
-(void) switchToArrayTwo;
-(void) toggleUsedArray;

@end

#import "MyDataModel.h"

@interface MyDataModel ()
@property(nonatomic, retain)  NSArray *arrayOne;
@property(nonatomic, retain)  NSArray *arrayTwo;

@end


@implementation MyDataModel

- (id) init{
    if (self=[super init]) {
        self.arrayOne=//... initialize array from some source
        self.arrayTwo=//... initialize array from some source
        self.currentlyUsedArray=self.arrayOne; //whatever default you want
    }
    return self;
}

-(void) switchToArrayOne{
    self.currentlyUsedArray=self.arrayOne;
}

-(void) switchToArrayTwo{
    self.currentlyUsedArray=self.arrayTwo;
}

- (void) toggleUsedArray{
    if (self.currentlyUsedArray==self.arrayOne) {
        self.currentlyUsedArray=self.arrayTwo;
    }else {
        self.currentlyUsedArray=self.arrayOne;
    }
}

(実際のデータがカプセル化され、他のオブジェクトのみcurrentlyUsedArrayにアクセスできることであることに注意してください。データモデルは、データの内部状態に基づいて提供するデータを決定する。)

このデータ・モデル・オブジェクトは、普遍的にアクセス可能な場所にあるべきです。最善の方法は、それシングルトン作ることですが、迅速かつ汚い方法は、アプリデリゲートの属性としてそれを駐車することです。

あなたは、コントローラのテーブルビュー内ですから、プロパティを持つことになります:

MyDataModel *theDataModel;
@property (nonatomic, retain) MyDataModel *theDataModel;

その後、実施中

@synthesize theDataModel;

-(MyDataModel *) theDataModel; {
    if (theDataModel; !=nil) {
        return theDataModel; ;
    }
    id appDelegate=[[UIApplication sharedApplication] delegate];
    self.theDataModel=appDelegate.theDataModelProperty;
    return theDataModel;
}

次に、あなたのテーブルビューのデータソース方式でます:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    ...
    cell.textLabel.text=[self.theDataModel.currentlyUsedArray objectAtIndex:indexPath.row];
    return cell;
}

もし、いくつかのイベントの の任意の場所をアプリでのは、あなただけのアプリデリゲートからのデータモデルオブジェクトを呼び出して、それを適切なスイッチ・アレイ・メッセージを送信する配列を切り替えるする必要がありますます。

id appDelegate=[[UIApplication sharedApplication] delegate];
[appDelegate.theDataModelProperty toggleUsedArray];

これ以降のすべてのデータ操作、その特定のテーブルビューまたはいくつかの他の完全に無関係なビューで、データを使用するかどうか適切なアレイを形成します。

なぜ、このすべてのトラブルを通過?これは、アプリケーションをモジュールになります。あなたは簡単にデータ管理ひとつひとつの時間を書き換えることなく別の方法でデータを表示し、それぞれが異なるビューに追加することができます。あなたは、WebViewの中またはコマンドラインで、テーブルに表示されるデータを管理するデータモデルを使用することができます。あなたも簡単に完全に異なるアプリケーションにデータモデルを移動することができます。

このモジュール方式は、大規模で複雑なアプリケーションの管理がとても簡単になります。あなたは、データを操作し、制御オブジェクトを1つだけ持っています。あなたは、いくつかのほとんど使われないコードセグメントにおけるいくつかのマイナーなエラーが全体のアプリをゴミ箱になることを心配する必要はありません。あなたは簡単にビューをプラグインやアプリを壊すことなく、簡単にそれらを削除することができます。

もちろんこれは簡単な例ですが、それは良い練習を示しています。

しかし、あなたが求めることができる、どのようにこれは、データをロードすると、ときにそれをロードするために何を知っているテーブルビューの問題を解決するのでしょうか?シンプルで、の。のそれはWHを知るためにテーブルビューの仕事ではないしません。ロードするデータの場合、またはロードします。データモデルは、どのようなデータを処理し、テーブルビューコントローラが時に処理します。 (それは、URLのために、例えば更新されたときあなたも、データモデルの問題の通知を持つことができる。そして、ビューコントローラが通知を登録すると、いつでもデータモデルの変更reloadDataを呼び出すことができます。)

無慈悲区画化とMVCでの機能をカプセル化することによって、あなたは維持し、デバッグが容易なシンプルな、再利用可能なコンポーネントから複雑なアプリケーションを作成します。

これだけ全く重要な概念にリップサービスを支払う悪いほとんどの教材に本当にです。

他のヒント

テーブルビューのコントローラさん"を知ることなく"言われたとのこと、何でもない本質的にしている物件のように述したデータが出ているのです。提供するデータを、一つの細胞では、一般的にビューコントローラのサブクラス.

通常、テーブルビューコントローラオブジェクトは、両方のテーブルビューの委員のテーブルビューのデータソースに限ります。から リンゴのdocs:

A UITableViewオブジェクトが必要 委員データソースです。以下の モデル-ビュー-コントローラ設計 パターンのデータソースを媒介する と、アプリケーションのデータモデル (そのモデルオブジェクト) 表示delegateに、その他 手をはじめ、多くの分野で、外観および の挙動を表す。 のデータ 源の委譲ことが多いが 必ずしも、同じオブジェクト、 そのオブジェクトがカスタム サブクラスのUITableViewController.

多くの場合はテーブル表示しませんが、配列や辞書引きのデータからでは、そのようなおデータソースなどの細胞も含む)を検出します。だけこのメソッドを実装する必:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

戻りのないコンテンツのセルしたいの連続だけを求められています。またロジックがミックス/match/プからのデータも出来ます。

なお混乱からスープのサンプルコードもその明かがでしょうか。されています。建表示をゼロからどこの作品ではないんだのは容易なこの追加により新しいクラスへのプロジェクトを選択することができUITableViewControllerサブクラス内側からXCodeの"新しい"ウィザードを閉じます。まprepopulateます。mファイルのすべての関連する空の手法を含む。


編集:な変化を表示ビューコントローラーが所有している。いくインスタンスの参考に"tableView"、おviewコントローラーを所有し、引数は、委譲方法 tableView:cellForRowAtIndexPath:, がんに渡されたのだと テーブルのビューがいます。きの検索の設定を通常の方法と同一のviewcontrollerの委譲のためのデフォルトテーブルコンテンツの検索結果を取得しました呼び出されます。 に関してはこちらをご参照docsこ.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top