2

UITableViewこのテーブルを含むビューをナビゲートするたびに更新しようとしています。

コントローラー内に含まれているを使用して、アプリケーションの起動時にテーブルを正しく設定するViewControllerカスタムがあります。UITableViewControllerNSMutableArray

テーブルを含むページに移動するViewControllerと、HTTP 要求でサーバーからデータを取得し、NSMutableArray.

ここに私の問題があります。この配列を自分のに送信することUITableViewControllerに成功しましたが、tableView を更新しても何も起こりません。

を使用しようとしましたが、numberOfRowsInSection または関数[myTable reloadData]を呼び出しません。cellForRowAtIndexPath同じ問題を抱えている人が を使用して解決したのを見ました[self.myTable ReloadData]が、エラーが発生します:

不明な getter/setter メソッドへのアクセス

私は Objective-C にかなり慣れていませんが、このエラーは少しランダムに発生するため、まだ少し不思議です。

UITableViewControllerいずれにせよ、 の宣言(どこで宣言すればよいか) と Interface Builder のリンクをめちゃくちゃにした可能性が高いため、これが解決策を見つける手がかりになる可能性があります。

誰にもアイデアがありますか?

どうもありがとうございました!

編集:これが私のテーブルビューコントローラークラスです:

#import "MyCell.h"

@class Mycell;

@interface MyTableController : UITableViewController {

    IBOutlet MyCell * myCell;
    IBOutlet UITableView * myTable;
    NSMutableArray *data;

}

@property (nonatomic, retain) IBOutlet UITableView * myTable;
- (void) EditTable : (NSMutableArray*) param;


@end

そして今、.m:

@implementation MyTableController
@synthesize myTable;

- (void) viewDidLoad {

[super viewDidLoad];
myTable = [[UITableView alloc] init];   
data = [[NSMutableArray alloc] init];
}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

return 1;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return [data count];
}

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

static NSString *CellIdentifier = @"MyCell";

MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];  >

if (cell == nil) {

    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil];

    for (id currentObject in topLevelObjects){

        if ([currentObject isKindOfClass:[UITableViewCell class]]){

        cell =  (MyCell *) currentObject;

            }
        }

    }


    NSString *datastring = [listenom objectAtIndex:indexPath.row];
    [cell setCell: datastring ];
    return cell;
}


- (void) EditTable : (NSMutableArray*) param{   

//This function is called by the ViewController when the user goes to the page containing the view

    data = param; //The param array contains the data from the HTTP request

    [self.tableView reloadData];

    [self.myTable reloadData]; //I tried both, but only the first one actually calls the previous functions

}
4

3 に答える 3

2

このコード サンプルには多くの問題があります。ここでそれらのいくつかを指摘しますが、次の関連する Apple ドキュメントを読むことを強くお勧めします。

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/TableView_iPhone/AboutTableViewsiPhone/AboutTableViewsiPhone.html

コードのいくつかの問題:

  1. クラスMyTableControllerは UITableViewController のサブクラスであるため、 の属性とプロパティは必要ありませんmyTableView。プロパティは UITableViewControllerのtableView実装の一部として定義および初期化され、dataSource とデリゲートが UITableViewController インスタンスに設定されます。これが、[self.tableView reloadData] がデリゲートおよび dataSource プロトコル メソッドを呼び出している理由です。

  2. また、インターフェイスビルダーを使用しているため、独自のサブビューを作成したい場合は、IB 内でそれを行い、そこにアウトレットを設定するか、サブビューを作成viewDidLoadしてビューに追加することを意味するコードで行う必要があります。と[view addSubview:mySubView]

  3. テーブルのデータを設定するより良い方法は、属性のプロパティを作成し、インスタンスを初期化したビュー コントローラーからdata呼び出すことです。メソッドを使用してこれを行います。通話できます。これは自動的に行われるため、ビューが読み込まれるときにテーブルを明示的に再読み込みする必要はありません。もっと些細な点ですが、あなたがそのままにしておくなら、よりわかりやすい名前に変更し、キャメルケース (例: setDataForTable`) を使用して iOS の規則と一致させるようにします。setDataMyTableControllersetData:[self.tableView reloadData]setDataEditTable

  4. listenomで参照されている属性の init/alloc は表示されませんtableView:cellForRowAtIndexPath:data代わりに使うつもりだったの?

  5. あなたのMyTableController.mファイルは完全版ですか?viewDidUnloadもしそうなら、あなたは行方不明deallocです。どちらも必須です。viewDidUnloadで割り当てられたすべてのオブジェクトを解放する必要がviewDidLoadありdealloc、コントローラーによって保持されているすべてのものを解放する必要があります ( で解放されたオブジェクトを含む) viewDidUnload

于 2011-04-06T05:17:38.113 に答える
0

self.tableViewtableViewController を使用しているので、代わりにこのようにデータをリロードするために使用できるはずです

[self.tableView reloadData];
于 2011-03-11T09:57:06.527 に答える
0

最初に合成する必要があり、次に self.myTable を使用できます

上でやる

@synthesize myTable

その後

[self.myTable reloadData];
于 2011-03-11T10:00:21.140 に答える