使用UIRefreshControl在TableView中移动标题
我的UIRefreshController做了一些奇怪的事情。 当我下拉刷新,tableView标题被移动。
如果我拉下来看起来不错,但是如果我在刷新工作的同时向下滚动表格,那么在UITableCells正常的情况下,标题将被刷新控件的高度所偏移,并在标题后面滚动。
我想避免创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];