首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在UITableViewCell内编辑UITextField失败

在 UITableViewCell 内编辑 UITextField 失败的问题通常是由于 UITableView 的重用机制引起的。当你滚动 UITableView 时,为了提高性能和减少内存占用,UITableView 会将不再显示的单元格进行重用。这就导致了 UITextField 的状态被错误地更新或者重置。

为了解决这个问题,你可以采取以下步骤:

  1. 为 UITextField 添加一个代理(UITextFieldDelegate),并实现代理方法。
  2. 在 UITableViewCell 的重用队列中注册 UITextField 的通知。
  3. 在 UITableViewCell 的重用队列中移除 UITextField 的通知。
  4. 在 UITableView 的代理方法中设置 UITextField 的代理为当前 UITableViewCell。

以下是一个简单的示例代码:

代码语言:swift
复制
class CustomTableViewCell: UITableViewCell, UITextFieldDelegate {
    @IBOutlet weak var textField: UITextField!

    override func awakeFromNib() {
        super.awakeFromNib()
        textField.delegate = self
        NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidChange(_:)), name: UITextField.textDidChangeNotification, object: textField)
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        NotificationCenter.default.removeObserver(self, name: UITextField.textDidChangeNotification, object: textField)
    }

    @objc func textFieldDidChange(_ notification: Notification) {
        guard let textField = notification.object as? UITextField else { return }
        // 处理文本更改事件
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        // 处理键盘的回车键事件
        return true
    }
}

在 UITableView 的代理方法中设置 UITextField 的代理为当前 UITableViewCell:

代码语言:swift
复制
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell
    cell.textField.tag = indexPath.row
    cell.textField.delegate = cell
    return cell
}

这样,你就可以在 UITableViewCell 内编辑 UITextField 而不会遇到失败的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

史上最全的iOS之访问自定义cell的textField.text的N种方法

前言 问题背景:自定义cell中有一个UITextField类型的子控件。我们经常要在tableView中拿到某个celltextField的文本内容进行一些操作。...通过系统默认发送的通知来拿到每一个celltextField.text 通过自定义的通知来拿到每一个celltextField.text 通过block来拿到每一个celltextField.text...因为项目开发中,受项目复杂度影响,难免会出现不同的控制器界面都会有UITextField类型(或者其子类型)的对象而没有释放,当textField开始编辑、内容发生改变、结束编辑时,都会发送相同的通知。...当A控制器pushB控制器后,我们B控制器界面上的TextField编辑内容,A控制器此时也监听了该通知,所以,A控制器上的contentTextFieldTextDidChange:方法也会被调用。...6>tableView:willDisplayCell:forRowAtIndexPath:方法刷新tableView。

6.8K40
  • 解决UITableView中Cell重用机制导致内容出错的方法总结

    上面主要是一个个的UITableViewCell,可以让UITableViewCell响应一些点击事件,也可以UITableViewCell中加入UITextField或者UITextView等子视图...,使得可以cell上进行文字编辑。...比如,当一个cell含有一个 UITextField的子类并被放在重用queue中以待重用,这时如果一个未包含任何子视图的cell要显示屏幕上,就会取出并使用这个重用的 cell显示无任何子视图的cell...解决方法: 方法1 将获得cell的方法从- (UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier 换为-(...:indexPath]; //根据indexPath准确地取出一行,而不是从cell重用队列中取出 if (cell == nil) { cell = [[UITableViewCell alloc]

    2.4K50

    iOS学习——tableview中带编辑功能的cell键盘弹出遮挡和收起问题解决

    言归正传,下面就说回到我们要解决的问题,UITableView的cell中,系统自带的UITableViewCell的格式没有自带UITextField或UITextView这种可以编辑的区域的,而这种类型的...2.1 UITextField或UITextView点击之后的详细流程   在对cell进行封装和自定义的时候,我们需要考虑我们的UITextField或UITextView从点击编辑框到结束编辑的整个过程是怎么样的...下面的流程就是UITextField或UITextView整个编辑过程中的详细流程步骤: 成为第一响应者之前,文本框调用其代理的textFieldShouldBeginEditing:  方法来允许或阻止其第一响应者...2.2 自定义包含UITextFieldUITableViewCell   首先,我们点击编辑区域的时候,获取到当前编辑区域相对屏幕的位置,这样方便我们判断整个tableview是否需要上移以及需要上移多少比较合适...所以我们cell的编辑区域开始编辑(textFieldDidBeginEditing: ),需要回传自身的位置,就是通过block将当前cell相对屏幕的frame回传到我们的主控制器。

    3.9K80

    Swift - 给TableView添加编辑功能(删除,插入)

    1,下面的样例是给表格UITableView添加编辑功能: (1)给表格添加长按功能,长按后表格进入编辑状态 (2)在编辑状态下,第一个分组处于删除状态,第二个分组处于插入状态 (3)点击删除图标...allNames = [ 0:[String](["UILabel 标签", "UITextField 文本框", "UIButton 按钮"]),...() cell = UITableViewCell.init(style: UITableViewCellStyle.subtitle, reuseIdentifier: identify)...(2)长按表格进入编辑状态,所有单元格都可以进行删除操作。 (3)同时在编辑状态下,在下方会自动出现一个新增操作单元格。点击前面的加号,便会给数据集中添加一条新数据。 ?...additional setup after loading the view, typically from a nib. allNames = [ 0:[String](["UILabel 标签", "UITextField

    3K20

    iOS开发:实现点击常用控件弹出地区选择框(万能方法)

    前言 iOS开发中会遇到一些选择选项的需求,而且点击一个控件弹出一个选择框,选择之后展示到前端,然后再把选择的内容传给后台或者做本地存储。...随后还会分享实现点击UITextField弹出UIDatePicker日期选择器的博文,本篇博文只分享点击控件弹出选择框的方法实现(点击UIButton或者UILabel弹出选择提示框)。...以下案例使用场景:通过点击UITableViewCell,弹出弹框,然后选择地区,最后给cell上面的控件赋值。具体步骤如下所示。...1、声明一个全局属性,来接收选择之后的地区名称参数 @property (strong, nonatomic) NSString *changeRegion; // 地区名称 2、UITableView...UIAlertActionStyleCancel handler:nil]]; [self presentViewController:alert animated:YES completion:nil]; } 4、UITableView

    1.7K32

    UI篇-UIResponder之事件传递和响应精析

    userInteractionEnabled = NO alpha < 0.01 以上三种情况会使该方法返回nil,即当前视图下无最优响应视图 2.hitTest方法内部会调用pointInside方法对点击点进行是否在当前视图bounds进行判断...我们使用UITextView和UITextField的时候,可以通过它们的inputAccessoryView属性给输入时呼出的键盘加一个附属视图,通常是UIToolBar,用于回收键盘。...但是当我们要操作的视图不是UITextView或UITextField的时候,inputAccessoryView就变成了readonly的。...因此我们自建一个UITableViewCell类,并声明inputAccessoryView和inputView为readwrite的,并且重写它们的get方法,这样某个tableviewcell变成第一响应者时...中创建一个 UIBezierPath,通过 [path containsPoint: point]来判断当前的点是否,pointInside的返回值直接影响到touchesEnded的调用,如果返回

    2.5K30

    断言和分段控制器1. 断言(Assertions)2. 分段控制器(UISegmentedControl)

    如果条件不符合预期结果, Xcode会报错指出断言失败。例如,可以断言你的Developer 类响应“writeKillerApp: message”;如果它没有,断言失败,Xcode报错。...UIControlEventTouchDragInside: 当触摸控件窗口内拖动时。 UIControlEventTouchDragOutside: 当触摸控件窗口之外拖动时。...你可以配置滑块控件何时发送通知,滑块被放下时发送,或者在被拖动时发送。 UIControlEventEditingDidBegin: 当文本控件中开始编辑时发送通知。...UIControlEventEditingDidEnd: 当文本控件中编辑结束时发送通知。...UIControlEventEditingDidOnExit: 当文本控件通过按下回车键(或等价行为)结束编辑时,发送通知。

    80930

    六天完成一个简单iOS App - 第二天

    登陆界面的搭建 首先涉及到登录界面状态栏颜色的问题,我们需要将状态栏颜色改为白色,可以控制器实现方法更改 - (UIStatusBarStyle)preferredStatusBarStyle {...如果button是从storyboard或者xib加载会调用aweakfromnib方法,我们可以aweakFromNib中对控件进行一些统一的设置,layoutSubviews中设置控件内容的位置...关于添加约束的方法有很多种,只要确定控件位置宽高就可以约束成功,需要细心一步一步来,即使约束失败也没有关系,删了重新约束即可,只要多试几次慢慢就会掌握。 2....切换占位文字颜色颜色 当textfield处于未编辑状态时,占位文字颜色为灰色,当textfield处于编辑状态时,占位文字颜色为白色 ?...*)textField { //开始编辑时 } - (void)textFieldDidEndEditing:(UITextField *)textField { // 结束编辑时 } 方法三:使用通知

    2.1K50

    iOS UITextField详解

    :(UITextField *)textField{ //开始编辑时触发,文本字段将成为first responder } - (BOOL)textFieldShouldEndEditing...:(UITextField *)textField{ //返回BOOL值,指定是否允许文本字段结束编辑,当编辑结束,文本字段会让出first responder //要想在用户结束编辑时阻止文本字段消失...//这对于想要加入撤销选项的应用程序特别有用 //可以跟踪字段所做的最后一次修改,也可以对所有编辑做日志记录,用作审计用途。...-(BOOL)textFieldShouldReturn:(UITextField *)textField{ //返回一个BOOL值,指明是否允许在按下回车键时结束编辑...return YES; } ``` ### 通知 UITextField派生自UIControl,所以UIControl类中的通知系统文本字段中也可以使用。

    1.8K30

    iOS-UITextField 全面解析iOS中UITextField 使用全面解析UITextField的代理方法通知UITextField storyboard 中设置属性

    //开始编辑时触发,文本字段将成为first responder } - (BOOL)textFieldShouldReturn:(UITextField *)textField { // 当点击键盘的返回键...*)textField{ //返回一个BOOL值,指定是否循序文本字段开始编辑 return YES; } - (BOOL)textFieldShouldEndEditing:(UITextField...{ //返回一个BOOL值指明是否允许根据用户请求清除内容 //可以设置特定条件下才允许清除内容   return YES; } - (BOOL)textField:(UITextField*...//这对于想要加入撤销选项的应用程序特别有用 //可以跟踪字段所做的最后一次修改,也可以对所有编辑做日志记录,用作审计用途。...storyboard 中设置属性 ?

    7.2K60
    领券