使用UIRefreshControl在TableView中移位的标题

时间:2013-03-05 20:09:51

标签: ios objective-c uitableview uirefreshcontrol

我的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吗?

非常感谢!

5 个答案:

答案 0 :(得分:18)

这可能是一个问题,因为您要将_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];

答案 1 :(得分:17)

快速修复此问题就是这样

目标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并将其他内容链接到您不喜欢的故事板中,这会有所帮助。

答案 2 :(得分:1)

UIRefreshControl并不意味着是子视图,它们的意思是(字面上)是表的刷新控件。 UITableViewController有一个专门针对他们的出口(再次,字面上称为refreshControl),你应该使用它。作为表的子视图,您可能会使表假设它是一个单元格,而不仅仅是一个子视图,它会强制重新计算它。有些情况下你会很幸运,控制可以将自己设置在正确的位置,但这又是未定义行为的结果。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

@available(iOS 10.0,*)

tableView.refreshControl = refreshControl