【问题标题】:How to work with UITextFields inside of UITableViewCells?如何在 UITableViewCells 中使用 UITextFields?
【发布时间】:2011-11-22 00:48:41
【问题描述】:

我的UITableView 中有 10 个UITableViewCells。每个单元格都有一个UITextField。它们加载得很好,但我需要一种方法将每个单元格的文本设置为其关联的字符串。

是否有 UITextField 的代表可以用来执行此操作,以及如何确定哪个文本字段属于 NSString 等?

编辑:

这是我tableView 的照片。我希望它从服务器将文本加载到每个单元格的 textfield 中,然后用户可以对其进行编辑。或者如果服务器上没有数据,textfield 将是空白的,用户可以添加数据并同步回来。

我为每个单元格创建了一个NSString,例如temperatureStringpulseString

【问题讨论】:

  • 你的问题不是很清楚,所以你得到的回答有点笼统。您需要对文本字段做什么?为什么需要设置单元格的文本而不是让用户编辑它?什么时候需要设置文本,是否需要在某个时候获取用户条目?所有这些问题都会对如何最好地解决问题产生影响。
  • 我更新了问题的更多细节。

标签: iphone objective-c cocoa-touch uitableview uitextfield


【解决方案1】:

编辑:关于新信息,这是我的新解决方案

因此,从外观上看,您将UITextField 插入每个单元格,而不是设置每个单元格的标签,而是为每个UITextField 设置标签

首先定义你的标签

#define DESCRIPTIVE_TAG_VALUE_1 10
#define DESCRIPTIVE_TAG_VALUE_2 11
#define DESCRIPTIVE_TAG_VALUE_3 12
...

在您的UITextField 代表中使用这些来确定哪个UITextField 属于哪个NSString,如果您与每个更新同步,如果您不是。然后获取对UITableView 的引用并检索单元格的每个子视图的每个文本值,该单元格的标签等于您的定义之一(再次在 switch 语句中)。

再次在使用 iOS 使用标签时,他们是你的朋友

您还说您持有对每个 NSString 的引用,您可以只持有对每个 UITextField 的引用,而不是这样,当您同步时,您只需从每个 UITextField 引用中检索。

但 Apple 的最佳做法是在处理多视图时使用唯一标签。这真的取决于你

【讨论】:

  • 我也忘了提及,将相关字符串链接到您项目中的标签,我没有为此提供代码,因为我不知道您的项目的结构
  • 同样的事情将适用于为每个单元格分配一个唯一的标签,并在“cellForRowAtIndexPath”中使用 switch 语句(如在 didSelectRowAtIndexPath 中)来填充 Next 字段。生病编辑我的帖子以了解我的意思
  • 我可以为每个单元格声明一个UITextField 属性,然后在我设置该单元格其余属性的开关中设置它吗?
【解决方案2】:

UITextfield 是 UIView 的一个子类,它有一个 'tag' 属性。您可以将单元格的 indexPath.row 指定为其文本字段的标记作为标识。

【讨论】:

    【解决方案3】:

    根据您对@Javy 的评论(其中包含您应该考虑添加到原始问题中的额外信息),您可以执行以下操作:

    UITableViewCell *cell = nil;
    NSString *key = nil;
    
    switch (indexPath.row)
    {
        case 0:
            cell = self.temperatureCell;
            key = @"temperature";
            break;
        case 1:
            // Do other cases similarly ...
    }
    
    NSString *text = [self.childAppointmentDictionary objectForKey:key];
    cell.textField.text = text;
    

    【讨论】:

      【解决方案4】:

      您应该在tableView: cellForRowAtIndexPath: 中设置文本

      听起来您有一个特定的顺序,希望您的项目出现在这将是使用 NSArray 而不是 NSDictionary 的好时机。

      您可以在 init 或 initwithNibName 中创建一个保留的数组属性:

      self.myListArray = [NSArray arrayWithObjects:@"fever", @"cough", @"runny nose", nil];
      

      然后,假设你只有 1 个部分,你会做 cell.textField.text = [self.myListArray objectAtIndex:indexPath.row];

      您是否有理由为此使用 NSDictionary 而不是 NSArray?

      【讨论】:

      • 谁说我用的是NSDictionary
      • 你做到了。在您对@Jarvy 的评论中。 cell.textField.text = [self.childAppointmentDictionary objectForKey:@"温度"];虽然你很粗鲁,所以我不知道你为什么要我帮你做任何事情。
      【解决方案5】:

      您必须在创建每个文本字段时存储对它们的引用,因此在:

      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
          if (cell == nil) {
              cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
          }
      

      方法,你会添加这一行:

      [myTextFieldArray addObject: cell.textField];
      

      假设 textField 是您的自定义表格视图单元格的属性。

      您还可以在 if (cell == nil) 方法之后的文本字段中设置文本。

      委托方法只是让您知道何时键入文本等。

      编辑:

      考虑到您添加的内容,我同意 Sid 和 Cstriel 的观点。为每个值创建标签:

      #define kTemperatureTag 0
      #define kPulseTag 1
      // etc.
      

      作为 CStreel 的替代方案,我会分配/检索与 indexPath 行匹配的信息,而不必担心分配标签,因为如果您从零开始标签,它们将是相同的。

      - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        // setup / retrieve cell
      
        NSInteger index = [indexPath row];
        switch(index)
        {
        case kTemperatureTag:
          cell.textField.text = [self.childAppointmentDictionary objectForKey:@"temperature"];
                  break;
        // case ...
        }
        // ..
      }
      

      还有:

      - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        NSInteger index = [indexPath row];
          switch(index){
              case kTemperatureTag:
                [self.childAppointmentDictionary addObject:cell.textField.text forKey:@"temperature"];
      

      【讨论】:

      • 我已经有cell.textField.text = [self.childAppointmentDictionary objectForKey:@"temperature"];,它应该设置我的UITextField 的文本。我正在使用一个开关来设置每个单元格的文本,所以在每种情况下,我应该只做[myTextFieldArray addObject: cell.textField];,然后我可以使用它的 indexPath 检索每个文本字段?
      • @Faisal 将此信息添加到您的原始问题中会很有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多