SVPullToRefresh自定义视图导致layoutIfNeeded进入无限循环

时间:2013-12-31 01:18:11

标签: ios iphone objective-c xcode uitableview

我尝试使用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];

问题在于,当您拉动表视图以触发刷新时,它会在[self layoutIfNeeded]中调用- (void)setState:(SVPullToRefreshState)newState后进入无限循环和全部可用内存状态。就我能够调试而言,它一直在调用- (void)layoutSubviews

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

我做错了什么?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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