uitableview每行显示3个对象

时间:2012-07-23 13:28:51

标签: iphone objective-c ios uitableview

我有一个包含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列。

我知道如何解决这个问题?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

目前在单元格中只有1个文本标签,您尝试插入3个文本标签。您似乎很接近,但我认为最好的选择是创建一个包含三个文本标签的自定义表格单元格,然后将它们设置为您目前正在这里做的是一个设置自定义tabel单元格的教程:http://www.appcoda.com/customize-table-view-cells-for-uitableview/

答案 2 :(得分: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;
}

Point是没有按特定顺序调用cellForRowAtIndexPath。从头开始调用第一到第七行是相当巧合的。从理论上讲,它可以按任何顺序调用。 想一想: 你的表有30行。其中10个可以同时看到。 在开始时,它被称为第0行到第9行。但是要明白这是巧合。它可以按任何顺序调用。 然后用户滚动5行。然后对于单元10到14调用该方法。在这种情况下,将重新使用单元。您的if (cell==nil)分行将不会被输入。  再次连续。然后用户收回2行。该方法的下一次调用将针对第9行和第8行 - 在该序列中。

所以,即使您似乎观察到某个序列,也永远不要假设某个序列。