0

20 個のオブジェクトを含む配列があります。その配列にはさらに多くのオブジェクトが存在する可能性があります。簡単にするために、その配列内の唯一の nsstring オブジェクトとしましょう。

これらの要素のうち 3 つをすべての行に表示したいと考えています。したがって、行数は

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {
  int i = 0;

if ( ([myArray count] % 3) > 0 )
{
    i++;
}
return [myArray count] / 3 + i;

}

私はヘルパーを持っていますint lastObj=0

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

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)
{
  ---instaniate the cell

   for (int i = 1; i <= 3; i++)
    {
        if (lastObj <= [myArray count])
        {
            --create cell content
            -- cellContent.myLabel.text=[myArray onbjectAtIndex:lastObj]
            --add cellContent to cell 
            lastObj++;

        }
    }
return cell;
}

その配列に5つのオブジェクトがある場合、それらは正しく表示されます。しかし、リストに 14 個の要素がある場合、最初の 9 個の要素が表示され、要素 0 から始まり、残りは表示されません。アプリでは、3 つの行が表示され、それぞれに 3 つの配列要素があります。だから私は3列を模倣しようとしています。

この問題を解決する方法はありますか?

4

3 に答える 3

2
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {
   return ceil(((float)[myArray count]) / 3.0);
  }

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

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)
{
  ---instaniate the cell
}
   //initiate 3 labels, then say:

   if(myArray.count-1 >= IndexPath.row * 3)
       cellContent.myLabel_1.text=[myArray onbjectAtIndex:IndexPath.row * 3];

   if(myArray.count-1 >= (IndexPath.row * 3)+1)
       cellContent.myLabel_2.text=[myArray onbjectAtIndex:(IndexPath.row * 3)+1];

   if(myArray.count-1 >= (IndexPath.row * 3)+2)
       cellContent.myLabel_3.text=[myArray onbjectAtIndex:(IndexPath.row * 3)+2];

   //the above "if"-s are to prevent reading values out of the array's bounds
   //add labels to cell 

    return cell;
}
于 2012-07-23T13:42:29.427 に答える
0

現在、3 つのテキスト ラベルを挿入しようとしているセルには 1 つのテキスト ラベルしかありません。近いようですが、3 つのテキスト ラベルを持つカスタム テーブル セルを作成し、現在のように設定するのが最善の方法だと思います。ここで行うのは、カスタム表セルをセットアップするためのチュートリアルです: http://www.appcoda.com/customize-table-view-cells-for-uitableview/

于 2012-07-23T13:41:06.507 に答える
0

これを試して:

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

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
      ---instaniate the cell
      cell = [[UITableViewCell alloc] init]; //If you don't ARC then retain accordingly. 

    }

       for (int i = indexPath.row * 3 ; i < indexPath.row * 3 + 3; i++)
        {


            if (i <= [myArray count])
            {

                --create cell content
                -- cellContent.myLabel.text=[myArray onbjectAtIndex:i]
                --add cellContent to cell 
                //forget about your last object helper. That would not work anyway. 

            }
        }
    return cell;
}

ポイントは、 cellForRowAtIndexPath は必ずしも特定の順序で呼び出されるわけではないということです。最初から1列目から7列目まで呼ばれるのは偶然です。理論的には、任意の順序で呼び出すことができます。次のことを考えてみてください。テーブルには 30 行あります。一度に10個表示されます。最初は0行から9行まで呼び出されますが、これは偶然と理解してください。任意の順序で呼び出すことができます。次に、ユーザーは 5 行スクロールします。次に、セル 10 から 14 に対してメソッドが呼び出されます。この場合、セルは再利用されます。あなたのif (cell==nil)支店は入りません。再び連続。次に、ユーザーは 2 行戻ります。メソッドの次の呼び出しは、行 9 と 8 に対して行われます - この順序で。

したがって、特定のシーケンスを観察しているように見えても、ここで特定のシーケンスを想定しないでください。

于 2012-07-23T13:46:50.267 に答える