头流离失所的TableView与UIRefreshControl(Header Displaced

2019-07-21 01:42发布

我UIRefreshController是做一些奇怪的。 当我下拉刷新,该头的tableView流离失所。

如果我下拉它看起来不错,但如果我向下滚动表时,复习仍在工作,头被刷新控制的高度,而UITableCells是罚款和滚动头之后偏移。

我想避免创建tableViewController,所以我做在viewDidLoad中的情况如下:

_refreshControl = [[UIRefreshControl alloc] init];
[_refreshControl addTarget:self action:@selector(refresh) forControlEvents:UIControlEventValueChanged];
[_tableView addSubview:_refreshControl];

我有很多需要此功能不同的视图控制器表。 有没有什么办法可以避免一个UITableViewController为每一个?

万分感谢!

Answer 1:

这可能是一个问题,因为您要添加的事实_refreshControl因为这是不应该做一个子视图。 但是你可以创建一个UITableViewController对象添加它作为当前的ViewController类的子视图控制器。

对于如: -

UITableViewController *tableViewController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
[self addChildViewController:tableViewController];

tableViewController.refreshControl = [[UIRefreshControl alloc] init];
[tableViewController.refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
tableViewController.tableView.frame = CGRectMake(...);//set the frame here
[self.view addSubview:tableViewController.tableView];


Answer 2:

速战速决,这是去这样

Objective-C的

//header
@property UITableViewController *tableController;

//.m (right at the beginning of viewDidLoad for example)
self.tableController = [[UITableViewController alloc] init];
[self addChildViewController:self.tableController];
self.tableController.tableView = self.tableView;

...

//then create the refresh control and assign it to the UITableViewController
self.tableController.refreshControl = refreshControl;

雨燕2.1

//Create an instance of a UITableViewController. This will host your UITableView.
private let tableController = UITableViewController()

//Add tableController as a childViewController and set its tableView property to your UITableView.
self.addChildViewController(self.tableController)
self.tableController.tableView = self.tableView
self.refreshControl.addTarget(self, action: "refreshData:", forControlEvents: .ValueChanged)
self.tableController.refreshControl = self.refreshControl

这个帮助,如果你有你的表迷上了一个IBOutlet,并有链接到你不觉得自己搞乱故事板其他的事情。



Answer 3:

UIRefreshControl的不意味着是子视图,他们打算(字面意思)是表的刷新控制。 UITableViewController有一个专门为他们的出口(再次,从字面上叫refreshControl ,你应该使用)。 如表中的子视图,您可能会导致表假设它是一个细胞,而不仅仅是一个子视图,这迫使它周围的重新计算。 这里将是你做得到幸运和控制可能会为自己设定在正确的地方的情况,但这是再次的未定义行为的结果。

的UITableViewController并不意味着是一个限制类,它当然不应该阻止你实现“多表意见”(这听起来不够,他们会保证好歹提出了新的视图控制器上下文特定的)。 如果你担心自己编写样板为每个类,写要落实每一个表视图的抽象超类控制器,并在必要时继承。



Answer 4:

试试这个方式来增加推视图控制器。

创建一个表视图控制器和其添加为现有的视图控制器的子图。 然后分配您的表视图,并刷新控制器的tableview控制器的属性。

UITableViewController *newTableViewController = [[UITableViewController alloc] init];
newTableViewControler.tableView = <yourTableView>;

<yourRefreshController> = [[UIRefreshControl alloc] init];
[<yourRefreshController> addTarget:self
                            action:@selector(refreshTableView:)
                  forControlEvents:UIControlEventValueChanged];

newTableViewController.refreshControl = _chatListRefreshControl;
[self addChildViewController:newTableViewController];


文章来源: Header Displaced in TableView with UIRefreshControl