0

基本的には、一番上に追加できるリストビューを作成しています。これを行うための最善の方法は、UITableViewCell自体をNSMutableArrayに格納することです。これは、オブジェクト内のすべてのデータを含む配列からUITableViewCellを単純にプルできるため、このリストビューの長さが10セルを超えることはありません。

また、ストーリーボードを使用しているため、initWithCoderを使用していることにも注意してください。

次のコードは私が試しているものであり、機能しません。

// This is where my NSMutableArray is initialized:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder]) {
        if (!_CellsArray) {
            UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TestCell"];
            _CellsArray = [NSMutableArray arrayWithObject:cell];
        }
    }
    return self;
}

//UITableView Delegate & DataSource Methods

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"TestCell"];
    [_CellsArray insertObject:cell atIndex:0];
    return [_CellsArray objectAtIndex:indexPath.row];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 10;
}

私はこれに間違った方法でアプローチしている可能性があることを認識しています、それが私がここにいる理由です:)

ありがとうございました。

編集:コードのタイプを修正しました(TimerCell-> UITableViewCell)

4

3 に答える 3

3

呼び出される順序と何が起こるかを見てみましょう。

  1. ビュー コントローラーがアーカイブされていないため、initWithCoder:メソッドが呼び出されます。このメソッドは可変配列を作成し、その中に のインスタンスを 1 つ配置しますTimerCell。上記のインスタンスはそれ以上構成されません (initWithStyle:reuseIdentifier:何らかの構成を行うためにオーバーライドした場合を除きます)。

  2. データ ソース メソッドtableView:numberOfRowsInSection:が呼び出され、テーブル ビューに 10 行あることが通知されます。

  3. したがって、あなたtableView:cellForRowAtIndexPath:は10回呼び出されます。毎回、新しいインスタンスを作成UITableViewCellし、可変配列に挿入します。(10 回の呼び出しの後、変更可能な配列にはTimerCell、インデックス 10 に 1 つ、UITableViewCellインデックス 0 ~ 9 に 10 個の が含まれます。) セルの内容や外観を構成することは何もせず、指定された行インデックスのセルを返します。最初の呼び出しでは、行 0 を要求されるため、作成してインデックス 0 に挿入したセルが返されます。2 番目の呼び出しでは、行 1 を要求されるため、配列のインデックス 1 のセルが返されます。インデックス 0 に新しいセルを挿入したので、最後の呼び出しで作成したセルはインデックス 1 にシフトしています。 、そしてあなたはそれをもう一度返します。これは呼び出しごとに続きます。同じ未構成をUITableViewCell10 回返します。


UIKit を考え抜こうとしているようです。これはほとんど良いことではありません。(時期尚早の最適化は諸悪の根源だと言われています。)

UITableViewセル再利用のメカニズムがすでにあります。自分のセルの内容を追跡し、そのメカニズムに任せるのが最善です。これを入力するのに非常に時間がかかったので、その方法を説明する他の回答が書かれています。それら、またはAppleのドキュメントまたはサードパーティのUITableViewチュートリアルを参照してください。

于 2012-06-15T05:27:16.983 に答える
0

セル情報を配列に保存してみませんか。次に、-cellForRowAtIndexPath:メソッドで、各セルを変更するために必要なデータを抽出するだけです。

簡単な例を次に示します。


//Lets say you have an init like this that inits some cell information
- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder]) {
        cellArray = [NSArray alloc] initWithObjects:@"firstCell",@"secondCell",@"thirdCell",nil];
    }
    return self;
}

//then for each cell, just extract the information using the indexPath and change the cell that way
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...
    cell.textLabel.text = [cellArray objectAtIndex:indexPath.row];

    return cell;
}

于 2012-06-15T05:22:01.167 に答える
0

テーブルビューは物を保存しません。むしろ、表示したいデータを要求するだけで、通常は別の場所 (NSArray や NSFetchedResultsController など) からそのデータを取得します。必要なものをデータ コンテナーに保存し、テーブルに表示させます。

// Probably your data model is actually a member of your class, but for purposes of demonstration...
static NSArray* _myArray = [[NSArray alloc] initWithObjects:@"Bob", @"Sally", @"Joe", nil];

- (NSInteger) tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_myArray count];
}


- (UITableViewCell*) tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    static NSString* CellIdentifier = @"TestCell";

    // Make a cell.
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if( cell == nil ) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Setup the cell with the right content.       
    NSString* aString = [_myArray objectAtIndex:[indexPath row]];
    cell.textLabel = aString;

    return cell;
}

リストにさらに多くのものが必要な場合は、それを配列に追加すれば完了です。

編集:別の注意として、 initWithCoder: は通常、View Controllerの初期化を行うのに最適な場所ではありません。その理由は、呼び出された時点で、まだロードされていない可能性が高いからです (IBOutlets など)。私はviewDidLoad(その場合はviewDidUnloadでクリーンアップすることを忘れないでください)またはawakeFromNibを好む傾向があります。

于 2012-06-15T05:24:36.717 に答える