我有UITableView
静态自定义UITableViewCell
,我需要将文本字段滚动到视图中,因为当按下返回键后它们被隐藏在键盘后面,下一个响应者是组。我知道我需要使用scrollToRowAtIndexPath:atScrollPosition:animated:
。如何滚动到其中一个文本框?
我知道这应该滚动自己,但是如果你的UIViewController
派生自UITableViewController
(正如Apple所说的那样)那么UITableViewController
类通过实现{{1}为你处理这种行为当我更改为从UITextFieldDelegate
派生并在视图控制器的UIScrollViewDelegate
顶部添加表视图时,我的应用程序停止这样做了。},UIViewController
等。所以基本上我错过了UIView
的功能,因为我(出于其他原因)选择从UITableViewController
派生。
答案 0 :(得分:1)
我一直这样做。我这样做的方法是我有一个在文本字段的UIControlEventEditingDidBegin中调用的方法,在那个方法中,我这样做:
-(void)startEdit:(UITextField *)textField {
self.prevOffset = self.tableView.contentOffset.y; //I like storing the current offset so I can restore it when the text stops editing, you don't have to do this.
int offSet = [textField superview].frame.origin.y; //this gets the y coordinate of the cell the textField is in. If the table is not at 0,0, you also need to add [[textField superview] superview].frame.origin.y;
offSet-=(self.view.frame.size.height-KEYBOARD_HEIGHT)/2; //where KEYBOARD_HEIGHT is 216 in portrait and 160 in landscape;
if (offSet<0) offSet = 0;
[UIView animateWithDuration:0.3 animations:^{
[self.tableView setContentOffset:CGPointMake(0,offSet)];}];
}
我还做了很多其他事情,但我相信它们是针对我的应用程序的。
首先,如果偏移量大于0,我将teIn contentInset设置为UIEdgeInsetsMake(0,0,KEYBOARD_HEIGHT,0),因为在我这样做之前我有一些跳跃的scrollViews。
另外,如果原始偏移量(self.prevOffset)加上帧的高度大于内容大小(这也会导致跳跃,因为它设置的偏移量太低然后跳回),我将prevOffset设置为MAX(0 ,contentSize.height-frame.size.height)。
这些东西不是必需的,但是你得到的是滚动的Scroll / TableViews,试试看。
答案 1 :(得分:0)
UITableViewController已在头字段中具有委托协议。由于您的类不再是UITableViewController,因此您需要手动将UITableView的委托协议头添加到.h文件中。
当我创建一个具有UITableView的自定义视图控制器时,我也开始使用UITableViewController,只是为了获取委托方法,但是我将UITableViewController更改为UIViewController,并手动将Delegate协议添加到报头中。
如果需要,可以查看UITableViewController.h并复制代理协议。
供您参考:
<UITableViewDelegate, UITableViewDataSource>
所以你的.h文件看起来应该类似于:
@interface MyTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
另外,不要忘记在“界面”构建器中将控制器的委托设置为文件的所有者,或者在代码中设置为self
。
答案 2 :(得分:0)
您可能还发现使用诸如免费提供的Sensible TableView框架之类的框架要容易得多。这些框架通常提供开箱即用的所有数据输入单元格,并代表您处理所有滚动/调整大小的工作。