0

以前作業していたUITableViewに苦労していて、どういうわけか壊れてしまいました。これは、PaulHegartyのコースのユニットの一部です。

症状は、ビューが読み込まれるが空であるということです。私は明らかにかなり基本的なことを誤解しています。

私が理解している限り、2つの重要な方法は1です。セクションの行数は、私の場合はゼロを返しますが、これは間違っていると思います。

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


 {


 //   #warning Incomplete method implementation.
    // Return the number of rows in the section.
    NSLog(@"TopPlaces %@",self.topPlaces);
    //return 100;
    return [self.topPlaces count];

   }

上記の理由により、行がないため、次のメソッドが呼び出されることはありません。

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

2つ目はViewDidLoad内にあり、データをコンソールに記録でき、すべてが正常に表示されます。つまり、私のデータはViewDidLoad内で生成されます

- (void)viewDidLoad


 {
        [super viewDidLoad];

    dispatch_queue_t    dowloadQueue = dispatch_queue_create("flick downloader", NULL);
    dispatch_async(dowloadQueue, ^{
        NSArray *topPlaces = [FlickrFetcher topPlaces];
        //NSLog(@"Array is %@",topPlaces); // array is OK here
        dispatch_async(dispatch_get_main_queue(), ^{
            NSSortDescriptor *woeDescriptor = [[NSSortDescriptor alloc] initWithKey:@"_content" ascending:YES];  
            NSArray *woeDescriptors = @[woeDescriptor];
            NSArray *sortedReturns = [topPlaces sortedArrayUsingDescriptors:woeDescriptors];
            self.topPlaces = sortedReturns;
            //all the data is present here, count is 100 and array will log to console
           NSLog(@"count here is %u",[self.topPlaces count]);
        });
    });

    // Uncomment the following line to preserve selection between presentations.
    self.clearsSelectionOnViewWillAppear = NO;

}
4

2 に答える 2

3

問題は、データをフェッチするために非同期呼び出しを行うことです(つまり、将来のある時点で配列がデータでいっぱいになるはずです)が、後でテーブルビューをリロードしません。呼び出しreloadDataはトリックを行います:

 ...            
self.topPlaces = sortedReturns;
//all the data is present here, count is 100 and array will log to console
NSLog(@"count here is %u",[self.topPlaces count]);

[self.tableView reloadData]; // Assuming that 'tableView' is your outlet

これにより、テーブルビューにデータソースをもう一度クエリするように指示され、最終的に(現在は空ではない)topPlaces配列内のすべてのデータが読み込まれます。


詳細な説明:

@ nerak99のコメントで、問題がで修正された理由が完全にはわからないことがわかりましたreloadData。さて、例を使用してみましょう:

あなたがレストランを持っていると想像してください。

朝の06:00にその場所を開くと、料理するものが何もないことがわかります。それで、あなたはあなたの人の一人から物資の市場に行くように頼みます(それはあなたの非同期呼び出しです)。

同時に、あなたはウェイトレスに今日のメニューを書くように指示するので、彼女は書きます...まあ、何もありません(それは行数を要求するあなたのテーブルビューです)。

今07:00に市場に行った男は10アイテムで戻ってきます。メニューを更新するための次の論理的なステップは何ですか?返品したアイテムについてウェイトレス(つまりあなた)に実際に通知するため。reloadData

これが理にかなっていることを願っています:)

于 2012-11-01T19:50:11.423 に答える
0

self.topPlacesとは何ですか?アレイをNSLogして、内容があるかどうかを確認してください。そうでない場合は、設定されていることを確認してください。

あなたがより多くの情報を提供するならば、私はより具体的な答えを書くことができるでしょう。

于 2012-11-01T19:42:46.937 に答える