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 个文本标签。您似乎很接近,但我认为最好的选择是创建一个包含三个文本标签的自定义表格单元格,然后按照您当前的方式设置它们在这里做的是设置自定义表格单元格的教程: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 没有必要按特定顺序调用。从一开始就在第一排到第七排被调用,这是相当巧合的。理论上它可以按任何顺序调用。想一想:您的表有 30 行。其中 10 个是同时可见的。一开始它被称为第 0 到第 9 行。但请理解这是一个巧合。它可以按任何顺序调用。然后用户滚动 5 行。然后为单元格 10 到 14 调用该方法。在这种情况下,单元格将被重新使用。您的if (cell==nil)分支将不会被输入。又是一排。然后用户回滚 2 行。该方法的下一次调用将针对第 9 行和第 8 行 - 按该顺序。

所以永远不要在这里假设某个顺序,即使您似乎观察到某个顺序。

于 2012-07-23T13:46:50.267 回答