使用UIRefreshControl在TableView中移动标题

我的UIRefreshController做了一些奇怪的事情。 当我下拉刷新,tableView标题被移动。

如果我拉下来看起来不错,但是如果我在刷新工作的同时向下滚动表格,那么在UITableCells正常的情况下,标题将被刷新控件的高度所偏移,并在标题后面滚动。

http://oi49.tinypic.com/2a8hqti.jpg

http://oi46.tinypic.com/acssrb.jpg

我想避免创build一个tableViewController,所以我在viewDidLoad中执行以下操作:

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

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

万分感谢!

这可能是一个问题,因为你添加_refreshControl作为一个子视图是不应该做的。 不过,您可以创build一个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]; 

快速解决这个问题就是这样

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; 

Swift 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,并有其他东西链接到故事板,你不想搞乱。

UIRefreshControl并不意味着是子视图,它们意味着(从字面上)是表的刷新控制。 UITableViewController有专门为他们(也是,字面上称为refreshControl ),你应该使用的sockets。 作为表的一个子视图,你可能会导致表假设它是一个单元格,而不仅仅是一个子视图,这迫使重新计算。 有些情况下,你确实感到幸运,控制权可能会在正确的地方,但这又是未定义行为的结果。

UITableViewController并不意味着是一个限制类,它肯定不应该阻止你实现“多表视图”(这听起来足够上下文足够,他们会保证一个新的视图控制器无论如何)。 如果您担心必须为每个类编写样板文件,请为要实现的每个表视图编写一个抽象超类控制器,并根据需要对其进行子类化。

试试这种方式来添加推视图控制器。

创build一个表视图控制器,并将其添加为现有视图控制器的子视图。 然后将表格视图和刷新控制器分配给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];