我制作了一个UITableView并包含一些自定义的UITableViewCells,在第一个单元格中(例如名为cell0)有一些UITextFields用于输入,当我滚动tableView时,cell0将从屏幕顶部消失,那我怎样才能得到在cell0中的UITextField文本?
cellForRowAtIndexPath
将返回nil。
答案 0 :(得分:12)
我找到的唯一方法是tableview委托
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
[cell dealloc]
}
答案 1 :(得分:1)
当UITableViewCells
离开UITableView
的可见区域时,它实际上已从表视图中删除并放回到重用队列中。如果选择重复使用,则由dequeueReusableCellWithIdentifier:
返回。
从视图中删除单元格时没有回调。但是,在prepareForReuse
返回单元格之前,会在单元格上调用dequeueReusableCellWithIdentifier:
。
你最终想做什么?
答案 2 :(得分:1)
根据Apple Documentation关于cellForRowAtIndexPath:
,它返回"表示表格单元格的对象,如果单元格不可见或者indexPath超出范围,则返回nil。“#34;
根据MVC Pattern,UITableViewCell
是一个视图。所以我更喜欢维护一个模型对象 - 也许它就像NSString
实例一样简单 - 如果我是你的话,将文本保存在单元格中。您可以通过向控制器添加UITextField
密钥的观察者来观察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
中的观察者。
答案 3 :(得分:0)
您需要在文本变更时保存文本(例如NSArray
)。
答案 4 :(得分:-2)
您可以将textfield初始化为实例变量。
看起来像:
·H
UITextField *textfiled;
的.m
-(void)viewDidLoad
{
//init textfield
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//init cell...
[cell addSubview:textfield];
return cell;
}