29

我的 UIRefreshController 正在做一些奇怪的事情。当我下拉刷新时,tableView 标题被替换。

如果我下拉它看起来不错,但如果我在刷新器仍在工作时向下滚动表格,则标题会被刷新控件的高度偏移,而 UITableCells 很好并滚动到标题后面。

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

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

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

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

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

万分感谢!

4

5 回答 5

18

这可能是一个问题,因为您添加_refreshControl的是不应该完成的子视图。但是,您可以创建一个UITableViewController对象,将其添加为当前视图控制器类的子视图控制器。

例如:-

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];
于 2013-03-05T21:40:22.763 回答
17

一个快速的解决方法是像这样

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 并且将其他内容链接到您不想弄乱的情节提要中,这将有所帮助。

于 2014-09-25T08:24:12.507 回答
1

UIRefreshControl's 并不意味着是子视图,它们意味着(字面上)是表的刷新控件。 UITableViewController有一个专门为他们提供的插座(同样,字面意思是refreshControl),您应该使用它。作为表格的子视图,您可能会导致表格假定它是一个单元格,而不仅仅是一个子视图,这会强制围绕它重新计算。在某些情况下,您确实很幸运,并且控件可能会将自己设置在正确的位置,但这又是未定义行为的结果。

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

于 2013-03-05T20:53:44.587 回答
1

@available(iOS 10.0, *)

tableView.refreshControl = refreshControl

于 2019-11-05T12:57:29.993 回答
0

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

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

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];
于 2016-02-25T05:14:02.350 回答