【问题标题】:Header Displaced in TableView with UIRefreshControl使用 UIRefreshControl 在 TableView 中替换标题
【发布时间】:2013-02-20 09:44:18
【问题描述】:

我的 UIRefreshController 正在做一些奇怪的事情。 当我下拉刷新时,tableView 标头被移位。

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

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

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

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

非常感谢!

【问题讨论】:

  • 将图片发布到some third party image uploading sites 并在此处分享链接。我们可以帮助您在此处发布图片。
  • UIRefreshControl without UITableViewController 的可能副本。与其专注于不使用 UITableViewController,不如专注于创建一个抽象超类,您可以轻松扩展以向每个表添加特定功能。控制器很便宜,我很惊讶你不喜欢它们。
  • 好主意,谢谢!当我第一次刷新它看起来像:tinypic.com/view.php?pic=2a8hqti&s=6 然后当我向下滚动它看起来像:tinypic.com/view.php?pic=acssrb&s=6
  • 我不相信它是该帖子的副本,他的代码实际上与您链接到的帖子中问题的答案相同。
  • @JonathanC 他在问 为什么 它不起作用(在另一个问题的答案中得到了回答(这是一个实现细节和一个在另一篇文章中起作用的 hack) ) 这怎么不是骗子?

标签: ios objective-c uitableview uirefreshcontrol


【解决方案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];

【讨论】:

  • 如果我不使用UITableViewController 而是使用UITableView 会怎样。
  • 我的控制器的视图层次结构是这样的:view -> scrollview -> - TableView_1 & TableView_2
  • 在将刷新控件添加到表视图后,我实际上设法通过调用:[self.tableView setContentOffset:CGPointMake(0, -1) animated:YES]; 使其工作。
  • @Pontus 我有 uitablview 比我怎么处理?
  • @rameshbhuja 没有区别。在视图控制器中,只需添加上面连接到您的表视图出口的行。
【解决方案2】:

快速解决这个问题的方法是这样

目标-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 并且将其他内容链接到故事板中,这将很有帮助。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      @available(iOS 10.0, *)

      tableView.refreshControl = refreshControl

      【讨论】:

        【解决方案5】:

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

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

        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];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-04
          相关资源
          最近更新 更多