【问题标题】:UITextView in UITableViewCell - Problem with TagsUITableViewCell 中的 UITextView - 标签问题
【发布时间】:2011-09-02 06:24:17
【问题描述】:

我在 UITableViewCells 中有一个带有文本字段的 Grouped TableView。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
static NSString *CellIdentifier = @"Cell";

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

}


if(indexPath.section < 6) {
    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 10,580, 31)];
    textField.tag = indexPath.section + 22;
    textField.delegate = self;
    [cell.contentView addSubview:textField];
    [textField release];
}
return cell;
}

所以当我按下保存按钮时,会调用 saveItem 方法:

- (void)saveItem {
    NSMutableArray *textFieldArray = [[NSMutableArray alloc] init];
    for (int i = 0; i <6; i++) {
        [textFieldArray addObject:(UITextField *)[self.view viewWithTag:22+i]];
    }
...
}

我可以毫无问题地更改前 4 个 TextField 的值。它们也被保存了,但是当我更改第 5 或第 6 个文本字段中的值时,我的应用程序崩溃并出现错误:

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* -[NSMutableArray insertObject:atIndex:]:尝试在 0 处插入 nil 对象”

有什么建议吗?

到目前为止谢谢。

【问题讨论】:

  • 六个部分都显示了吗?
  • 是的,它们也填充了正确的值。

标签: iphone objective-c ios uitableview uitextfield


【解决方案1】:

我认为问题在于:当您点击保存按钮时,并非所有部分都会显示。因此,当您尝试使用标签 5 和 6 访问 view 时,它们为 nil,因为它们未显示,因此未从您的视图中添加(或删除)。

要对此进行测试,只需尝试滚动到您的tableView 底部并尝试点击保存按钮

【讨论】:

  • 好的,当我关闭键盘并显示所有单元格时,它可以工作。那么如何使用隐藏它们的键盘访问它们?
  • 您应该将来自textFields 的值保存在UITableViewController 的某些变量中,否则您将丢失它们的值。
  • 好的,它现在与textFieldDidEndEditing 完美搭配。谢谢!
【解决方案2】:

1.无论您尝试访问该对象的任何内容都对您不可用。这意味着 [self.view viewWithTag:22+i] 给出 nil。

2.tableview 不会为所有单元分配内存。它只分配您可以看到的内存。

3.一旦滚动您的表格视图并看到第 6 部分,然后按保存按钮,您的应用将不会崩溃。

【讨论】:

    【解决方案3】:

    只需要修改你的代码

    if(indexPath.section <= 6) {     
         UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 10,580, 31)];     
         textField.tag = indexPath.section + 22;     
         textField.delegate = self;     
         [cell.contentView addSubview:textField];     
         [textField release]; 
    }
    

    【讨论】:

      【解决方案4】:

      另外,请不要在cellForRowAtIndexPath 中创建文本字段。您应该在 initviewDidLoad 方法中创建它。

      【讨论】:

        猜你喜欢
        • 2020-03-19
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2012-07-06
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多