【问题标题】:SVPullToRefresh custom view causes layoutIfNeeded go into infinite loopSVPullToRefresh 自定义视图导致 layoutIfNeeded 进入无限循环
【发布时间】:2013-12-31 01:18:10
【问题描述】:

我尝试为 SVPullToRefresh 使用自定义视图,但我偶然发现了奇怪的问题。我制作了演示项目来说明问题:https://github.com/gaks/SVRefreshProblem

该项目只是一个带有 TableView 的 UITableViewController 和带有自定义刷新栏视图的 xib 文件。 SVPullToRefresh通过viewDidLoad中的IBOutlet添加到tableView中:https://github.com/gaks/SVRefreshProblem/blob/master/SVRefreshProblem/DemoViewController.m

还有一段代码从 xib 文件加载 RefreshBarView 并将其设置为 SVPullToRefresh 的自定义视图(“加载”状态仅用于说明):

RefreshBarView* refreshBarView = [[[NSBundle mainBundle] loadNibNamed:@"RefreshBarView" owner:self options:nil] objectAtIndex:0];
refreshBarView.bounds = CGRectMake(0, 0, 320, 60);

[[tableView pullToRefreshView] setCustomView:refreshBarView forState:SVPullToRefreshStateLoading];

问题在于,当您拉动表视图以触发刷新时,在调用 - (void)setState:(SVPullToRefreshState)newState 中的 [self layoutIfNeeded] 后,它会进入无限循环并吃掉所有可用内存状态。就我能够调试的情况而言,它一遍又一遍地调用- (void)layoutSubviews

奇怪的是,当你打开xib文件时:https://github.com/gaks/SVRefreshProblem/blob/master/SVRefreshProblem/SVPullToRefresh/RefreshBarView.xib ...并从视图中删除标签 - 它工作得很好(除非您有一个空视图)。

我做错了什么?

【问题讨论】:

  • 您找到解决方案了吗?我也有同样的问题。

标签: ios iphone objective-c xcode uitableview


【解决方案1】:

从 nibs 加载适用于 ViewControllers,而不是视图。您可以尝试以编程方式执行此操作:

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 60)];
    [v setBackgroundColor:[UIColor grayColor]];
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 60)];
    [label setText:@"asdf"];
    [v addSubview:label];
    [[tableView pullToRefreshView] setCustomView:v forState:SVPullToRefreshStateLoading];

【讨论】:

  • 是的,它工作得很好,但它需要从代码中设计视图。我尝试使用 xib 的唯一原因是我可以在 Interface Builder 中设计视图。
【解决方案2】:

尝试在您的笔尖中关闭“使用自动布局”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    相关资源
    最近更新 更多