如何从自定义tableview单元格中获取数据

时间:2011-04-26 13:56:57

标签: iphone uitableview cell textfield

我是Iphone app dev的新手。我遇到了一个问题。我有表视图,我在每行插入文本字段。我完成了UI部分。但是如何从tableview中的textfield获取值。我创建了customCell类。我无法使用IBOutlet。

这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...

    return cell;
}

2 个答案:

答案 0 :(得分:0)

你应该有一个dataSource(通常是NSMutableArray),它(通常)包含每个单元格的值。您应该能够通过使用indexPath获得所需的值,例如

NSObject *object = [dataArray objectAtIndex:indexPath.row];

在上面的代码中,我假设tableView的dataSource是一个名为 dataArray 的数组。我还假设它包含 NSObject 类型的对象(在现实世界的例子中通常不是这样,在这种情况下,它通常是一个子类,如NSDictionary或自定义NSObject子类。

确保tableView连接到它的dataSource。连接是通过(至少) UITableView 实例上的方法 setDataSource: numberOfSectionsInTableView: numberOfRowsInSection:委托方法。

您的 UITableViewCell 子类通常不应用于保存数据,如果以这种方式使用它,则采用错误的方法。以下网站应该是使用UITableView类的一个不错的介绍:http://www.mobisoftinfotech.com/blog/iphone/introduction-to-table-view/

答案 1 :(得分:0)

正如Schreurs已经解释过你需要为你的viewController实现UITextFieldDelegate协议(以及UITableViewDataSource),请查看文档中的那些以了解更多可以用它们做什么。但是这比在你的视图中使用不同的UITextField更加棘手。

您必须考虑这样一个事实:当一个单元格离开tableview的可见范围时,它将被释放或重用。因此,如果单元格1包含一个文本字段,您在其中写入内容然后滚动到单元格15,您可能会获得一个包含单元格1及其内容的文本字段的单元格。如果准备要重复使用单元格,清空textFields,则必须将该数据保留在某个位置,以便在适当的单元格中重新输入它。毕竟你要抓住你的头脑是什么textField调用你的委托(可能是你的viewController,所以你必须用一个数字来标记它们,你可以从中提取一个行号 - 即cell.textField.tag = indexPath .row + 100)。

总而言之,你需要在viewController中使用这样的东西

- (void)textFieldDidEndEditing:(UITextField *)textField {
    if ([textField.text length] > 0) {
        NSUInteger row = textField.tag - 1;
        [textFieldValues setObject:textField.text forKey:[NSNumber numberWithInt:row]];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellId = @"cellId";
    TextFieldTableViewCell *cell = (TextFieldTableViewCell *) [tableView dequeueReusableCellWithIdentifier:cellId];
    if (!cell)
        cell = [[[TextFieldTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId] autorelease];

    cell.textField.tag = indexPath.row + 1;
    cell.textField.delegate = self;
    NSString *value = [textFieldValues objectForKey:[NSNumber numberWithInt:indexPath.row]];
    if (value)
        cell.textField.text = value;
    else
        cell.textField.text = @"";

    return cell;
}

然后在TextFieldTableViewCell.h

@property (nonatomic, readonly) UITextField *textField;

最后在你的TextFieldTableViewCell.m

@synthesize textField;

P.S。我正在徘徊当编辑textField离开可见单元格范围时可能发生的事情,并且它没有被重用或释放......给了我一些寒意!所以EndEditing应该足够了。