我制作了一个 UITableView 并包含一些自定义 UITableViewCells,在第一个单元格(例如命名为 cell0)中有一些 UITextFields 用于输入,当我滚动 tableView 时,cell0 将从屏幕顶部消失,那么如何获取 UITextField 的文本在单元格0?
cellForRowAtIndexPath
将返回零。
我制作了一个 UITableView 并包含一些自定义 UITableViewCells,在第一个单元格(例如命名为 cell0)中有一些 UITextFields 用于输入,当我滚动 tableView 时,cell0 将从屏幕顶部消失,那么如何获取 UITextField 的文本在单元格0?
cellForRowAtIndexPath
将返回零。
我发现的唯一方法是 tableview 委托
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
[cell dealloc]
}
UITableViewCells
离开可视区域时,UITableView
它实际上已从tableview中删除并放回重用队列中。如果它被选中用于重用,它将由dequeueReusableCellWithIdentifier:
.
从视图中删除单元格时没有回调。但是,prepareForReuse
在它被返回之前在单元格上被调用dequeueReusableCellWithIdentifier:
。
你最终想要做什么?
根据Apple Documentation about cellForRowAtIndexPath:
,它返回“表示表格单元格的对象,如果单元格不可见或 indexPath 超出范围,则返回 nil”。
AUITableViewCell
是一个视图,根据MVC Pattern。因此,如果我是您,我更愿意维护一个模型对象——也许它就像一个NSString
实例一样简单——将文本保存在单元格中。您可以通过向控制器添加 keyUITextField
观察者来观察 的变化。UITextFieldTextDidChangeNotification
- (void)textFieldDidChangeText:(NSNotification *)notification
{
// Assume your controller has a NSString (copy) property named "text".
self.text = [(UITextField *)[notification object] text]; // The notification's object property will return the UITextField instance who has posted the notification.
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Dequeue cell...
// ...
if (!cell)
{
// Init cell...
// ...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChangeText:) name:UITextFieldTextDidChangeNotification object:yourTextField];
}
// Other code...
// ...
return cell;
}
不要忘记删除你的观察者-dealloc
。
您需要在文本NSArray
被更改时将文本保存在某处(例如一个 )。
您可以将文本字段初始化为实例变量。
看起来像:
。H
UITextField *textfiled;
.m
-(void)viewDidLoad
{
//init textfield
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//init cell...
[cell addSubview:textfield];
return cell;
}