具有多个UITextField的iOS UITableViewCell子类滚动出视图

时间:2015-10-07 21:07:15

标签: ios objective-c iphone uitableview cocoa-touch

一些背景知识 我正在使用UITableViewController子类来获取不同类型单元格的长列表。从技术上讲,这通常不适用于UITableViewControllerUITableView。但是,我正在使用LARGE遗留代码库 - 重构这不是一个选项。

其中一个单元格,让我们调用ProductListCell由多个视图组成(实际上每个视图应该是一个单元格,但同样是LARGE遗留代码库),这些视图以编程方式组合在一起。

视图,让我们在nib上绘制调用ProductListView,但是当ProductListCell中提供了单元格数据时,cellForRowAtIndexPath:中的约束会以编程方式对其进行打包。这些ProductListView中的每一个都有一个UITextField。因此,此UITextFields中有多个ProductListCell

问题: 有时候,并非总是如此,当点击文本字段并出现键盘时,文本字段会被推出视图。

我已经尝试将文本字段从ProductListView,超级视图单元格传递到UITableViewController子类,然后观察键盘出现,然后scrollToRectVisible:到文本字段。我已经和[self.tableView convertPoint:fromView:];一起完成了。

我确实认为,因为此UITableViewController中多个单元格的高度未定义,但基于提供给它们的数据是动态的,它与默认键盘外观滚动行为混淆。

有人遇到过类似问题吗?

编辑:我应该提到 - 我的猜测是UITableViewController知道如何在单元格中显示文本字段。但是当一个单元格中有多个文本字段时,我相信它只关注单元格,而不是特别是文本字段。

2 个答案:

答案 0 :(得分:0)

动态内容不应该 问题。作为键盘,它的高度是固定的。你只需要抓住现在显示键盘的区域。注册keyboardNotifications并尝试这可能会有所帮助。

import React from 'react';
import { Router, Link } from 'react-router';

export default class ResourceCard extends React.Component {
    constructor(props, context) {
      super(props, context);
    }

    render() {
        return (
                <div onClick={this.routeHandler.bind(this)}>
                LINK
                </div>                  
        );
    }
    routeHandler(){
        this.context.router.transitionTo('someRoute', {objectId: 'asdf'})
    }
}

ResourceCard.contextTypes = {
  router: function contextType() {
    return React.PropTypes.func.isRequired;
  }
};

答案 1 :(得分:0)

以下代码将您的文本字段保留在视图的顶部。 您可以在UITextField的委托方法textFieldDidBeginEditing

中添加此代码
CGRect frame = CGRectZero;
frame.origin.x = 0;
frame.origin.y = textField.tag*ROW_HEIGHT+textField.frame.origin.y+textField.frame.size.height*2+5;
frame.size.width = self.view.frame.size.width;
frame.size.height = RESULTS_TABLE_HEIGHT;
[self.tableView setContentOffset:CGPointMake(0, frame.origin.y-30)animated:YES]; 

// 30:tableview单元格中的文本字段高度