0

我有一个动态生成的 UITableView(所以我必须使用原型单元,而不是静态单元),上面有很多单元。每个单元格上都会有一个 UILabel。此外,每个单元格还将至少有一个 UIControl(截至目前,它可能是 UITextfield 或 UISegmentedControl,但我希望保持它的灵活性,以防将来添加其他内容)。

用户将通过并将所有控件设置为他们想要的状态,然后在最后按下“计算”按钮。单击该按钮时,我将需要能够获取有关用户对每个控件所做的操作的信息(用户在每个文本字段中输入了什么文本,他们在每个控件中选择了哪个段等) .

设置它的最佳方法是什么?

4

3 回答 3

1

您应该从填充表格的模型对象中获取这些值,而不是从表格本身。如果不了解更多有关数据源的信息以及用户单击按钮时需要哪些值,就很难知道应该如何执行此操作——您需要来自所有行的值吗?仅从其单元格具有标签 cellLabel 的行(如果是,您如何知道将哪个 cellLabel 传递给该方法)?

可以清理多少在很大程度上取决于数据的结构。

于 2012-12-05T20:47:53.877 回答
0

现在,我有几个 UICell 子类,一个用于迄今为止我需要的每个组合(所以我有一个 LabelTextboxCell、LabelSegmentCell、LabelSegmentTextboxCell、LabelTextTextCell 等)。当我调用以获取该单元格的信息时,调用中的代码如下所示:

-(NSString *) getValueFor:(NSString *)cellLabel fromControl:(NSInteger *)controlCount inTable:(UITableView *)table
{
    if ([cellLabel isEqualToString:@"Label1"] || [cellLabel isEqualToString:@"Label3"])
    {
        for (LabelTextboxSegmentCell *cell in table.visibleCells)
        {
             if ([cell.label.text isEqualToString:cellLabel])
             {
                 if (controlCount == 1)
                 {
                     return cell.textfield.text;
                 }
                 else if (controlCount == 2)
                 {
                     return [cell.segment titleForSegmentAtIndex:[cell.segment selectedSegmentIndex]];
                 }
             }
             //else {continue - this is not the cell I want)
         }
    }
    else if ([cellLabel isEqualToString:@"Label2"])
    {
        //...same for loop structure and such as before except specific to LabelTextTextCell
    }
    //.... couple more else ifs and their loops
}

这真糟糕。它有效,但它很混乱,容易出错,将来很难添加,并且完全违背最佳实践。但这是迄今为止我想出的最好的。一定有更好的方法。

于 2012-12-05T17:45:11.937 回答
0

单元格在 tableView 中动态地来来去去。使用它们来存储值会让你发疯。我建议使用可变数组来存储数据并为单元格提供所需的内容。

这是一个简单的 3 个步骤的解决方案。

1,子类化一个 UITableCell 并将其用于所有原型单元格。在单元格子类中您所要做的就是设置单元格中任何元素的所有属性(并在 .m 文件中合成它们)

2,在 IB 中,将所有单元格的类设置为您刚刚创建的 UITableCell 子类,这是关键部分,在 IB 中,控制从单元格拖动到您想要链接到的任何元素(在该单元格中) . 这对于第三步的工作是必不可少的。

3,在您的 UITableViewController 中,在 cellForRowAtIndexPath: 方法中,使用您的单元格子类并使用 tableView 的索引(您在该方法调用单元格中获得)标记您想要的任何内容。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellOneID = @"CellOne";
    MySubclassTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...

    cell.textFieldOne.tag = indexPath.row;
    cell.textFieldOne.delegate = self;

    cell.labelTwo.text = [myMutableArray objectForIndex:indexPath.row];
    cell.labelTwo.tag = indexPath.row;

    return cell;
}

您可以通过更改数组中的相应对象然后调用来更改标签文本:

[self.tableView reloadData];

然后,当您的 textField 调用说它正在发生事情时,您可以检查它的标签并知道它是哪一个。(当然是通过在 VC 中实现 UITextField 委托方法)

于 2012-12-06T17:01:53.390 回答