阻止UITableView滚动到包含textField的单元格

时间:2013-04-21 13:53:38

标签: objective-c

UITableView似乎有一些自动行为,如果单元格包含textField或textView,并且该字段或视图成为第一响应者,则tableView会自动滚动,以便键盘不会遮挡单元格。我确信,在大多数情况下,这非常方便。

就我而言,这并不好。 tableView位于较小的containerView中,默认行为使字段仍然模糊不清。我想处理自己移动整个容器,并且默认的滚动行为正在阻碍。

有谁知道如何“关闭”UITableView的这个功能?

2 个答案:

答案 0 :(得分:1)

我有同样的问题,我在一个较小的容器视图中有一个UITableView,当我在tableView中选择一个UITextField时,它会自动滚动到一个不合需要的位置。这是UITableView的默认行为,似乎没有任何方法可以将其关闭。

相反,我将此subView控制器更改为UIViewController的子类,而不是UITableViewController。即我的TransportViewController.h控制tableView:

@interface TransportViewController : UITableViewController <UITextFieldDelegate>

成为:

@interface TransportViewController : UIViewController <UITextFieldDelegate, UITableViewDataSource, UITableViewDelegate>

通过将类设置为UIViewController类,将不会自动滚动表格单元格。

现在您不是UITableViewController的子类,现在必须手动设置'tableView'属性以指向相应的表视图。你可以在IB中连接它,它会给你类似的东西:

@property (strong, nonatomic) IBOutlet UITableView *tableView;

最后,您还必须将此新分配的tableView属性设置为表的委托和数据源。你可以在'viewDidLoad'方法中这样做:

- (void)viewDidLoad
{
    [super viewDidLoad];

    _tableView.dataSource = self;
    _tableView.delegate = self;

}

当选择UITextField时,这将停止UITableViewController中固有的自动滚动。然后由您来实现任何必要的UITableViewDataSource方法,并处理您自己的自动滚动方法。

答案 1 :(得分:0)

我通过实施scrollViewDidScroll:方法(来自UIScrollViewDelegate协议)解决了这个问题。当键盘进行UITableView滚动时,会调用此方法。

这是我做的:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    [tableViewController.tableView setContentOffset:CGPointMake(0., 0.)];
}