Ios 我应该如何设置UITableViewCell子类,其中包含uicontrol?

Ios 我应该如何设置UITableViewCell子类,其中包含uicontrol?,ios,uitableview,subclass,Ios,Uitableview,Subclass,我有一个动态生成的UITableView(所以我必须使用原型单元格,而不是静态单元格),上面有很多单元格。每个单元格上都有一个UILabel。此外,每个单元格还将至少有一个UIControl(目前为止,它可以是UITextfield或UISegmentedControl,但我希望在将来添加其他内容时保持灵活性) 用户将检查并将所有控件设置为他们想要的状态,然后按下末尾的“计算”按钮。点击该按钮,我需要能够获得关于用户对每个控件所做操作的信息(用户在每个文本字段中输入了什么文本,他们在每个控件中选

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

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


设置这个的最佳方法是什么?

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

-(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
}

这太可怕了。它是可行的,但它很混乱,容易出错,将来很难添加,而且完全违背了最佳实践。但这是迄今为止我想到的最好的。必须有更好的方法。

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


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

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

这里有一个解决方案,分为3个简单步骤

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

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

3、在UITableViewController的CellForRowatineXpath:方法中,使用单元格子类,并用tableView的索引标记其中所需的任何内容(您在该方法调用中获得的单元格索引)

通过更改数组中的相应对象,然后调用以下命令,可以更改标签文本:

[self.tableView reloadData];

然后,当你的textField打电话告诉你有什么事情发生在它身上时,你可以检查它的标签,知道它是哪一个。(当然是通过在VC中实现UITextField委托方法)

如何调用此方法?它是对更改其中一个控件中的一个值的响应吗?@rdelmar:否,当用户单击按钮以执行基于控件状态的某些计算时,会调用它。我跟踪用户与其他地方控件的交互,这同样令人困惑和混乱,因此如果有一种方法可以同时清理这两个控件,那将是理想的。啊,是的,我理解你的意思。数据源本身有点混乱,但我认为这绝对是正确的。我必须仔细研究一下,以确保它对我有用,但它看起来很有希望。我明白了。注意,在我的代码中,textFieldOne的委托被设置为self。如果有,可以将委托方法:textfielddendediting:(UITextField*)textField或相关方法添加到VC中。在那里,您会收到通知,文本字段已被编辑,请检查标记并提取当前文本。请记住,这些单元格中的任何内容都是非永久性的,因此最好在输入数据时捕获数据并将其存储在其他位置,然后在滚动期间重新创建单元格时将其反馈回来。希望能有帮助。是的,我有一个对象,我把所有的用户选择都存储在其中,我现在检查对象中的内容,而不是查看表本身。
[self.tableView reloadData];