0

この問題を解決するためのアイデアがありますか?

これは、それぞれ正しい方法と間違った方法です。
代替テキスト 代替テキスト

これは機能するコードです:

- (UITableViewCell *)[...] cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    @try {
        newsRow = ((NewsRowController *)[tableView dequeueReusableCellWithIdentifier:@"cell"]);
        if (newsRow == nil) {
            if ( [[Device GetModel] isEqualToString:@"iPad Simulator"] || 
                 [[Device GetModel] isEqualToString:@"iPad"])
                [[NSBundle mainBundle] loadNibNamed:@"NewsRow_ipad" owner:self options:nil];
            else [[NSBundle mainBundle] loadNibNamed:@"NewsRow" owner:self options:nil];

            if ([tableArray count] > 0)
                [newsRow setData:[tableArray objectAtIndex:indexPath.row]];
        }       
    }
    @catch (NSException * e) {
        NSLog(@"a!!!!!");
    }
    return newsRow;
}

...しかし、私の3gデバイスでは、テーブル を上下にスクロールするときに時間がかかるため、このようにコードを変更し、viewDidLoadにデバイスチェックを挿入して渡しますcellForRowAtIndexPath

NSArray *cRow;
@property (nonatomic, retain) NSArray *cRow;
[...]
@syntetize cRow;

- (void)viewDidLoad {
[...]
    if ( [[Device GetModel] isEqualToString:@"iPad Simulator"] 
        || 
        [[Device GetModel] isEqualToString:@"iPad"])
        cRow  = [[[NSBundle mainBundle] loadNibNamed:@"NewsRow_ipad" owner:self options:nil] retain];
        else cRow = [[[NSBundle mainBundle] loadNibNamed:@"NewsRow" owner:self options:nil] retain];
[...]
}

- (UITableViewCell *)[...] cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    @try {
        newsRow = ((NewsRowController *)[tableView dequeueReusableCellWithIdentifier:@"cell"]);
        if (newsRow == nil) {

            //
            // ADDED CODE.
            //
            newsRow = [cRow objectAtIndex:0];    
            //

            if ([tableArray count] > 0)
                [newsRow setData:[tableArray objectAtIndex:indexPath.row]];
        }       
    }
    @catch (NSException * e) {
        NSLog(@"a!!!!!");
    }
    return newsRow;
}

これで、テーブルには1行だけが表示されます。スクロールすると行が変わりますが、1行しか表示されません...
代替テキスト
何が問題なのですか?

何か助けはありますか?

ありがとう、
A

4

1 に答える 1

1

この場合、dequeueReusableCellWithIdentifier: を呼び出すと、デキューできるセルがないため、nil が返されます。nil セルが返されるたびにペン先をロードする必要があります。そうしないと、最初のセルの後にテーブルにセルを追加することはありません。

GetModel の呼び出しが遅い場合は、それを viewDidLoad で呼び出して、後で使用できるように保存できます。

各セルに描画しているビューの量が原因で、テーブルがスムーズにスクロールされない可能性があります。背景が常に単色である場合は、セルに追加するすべてのビューが不透明であることを確認する必要があります。画像またはグラデーションの背景が必要な場合は、セルをすべて 1 つのビューで描画することを検討する必要があります。Apple には、これを行う方法の良い例があります: TableViewSuite。特に TimeZoneView ファイルをチェックアウトします。

于 2011-01-21T22:15:43.737 に答える