如何“隐藏”UIRefreshControl?

35

有时我的表视图不能连接到服务进行刷新,在这种情况下,我不希望UIRefreshControl出现。

在viewDidLoad中添加它后,我尝试使用setEnabled:和setHidden:隐藏它,但两者似乎都无效。


1
你可能觉得这很有趣。我尝试对控件和表格视图进行子类化。我拦截消息寻找可以利用的东西,但没有成功。最后,我重写了表格视图的-subviews方法来隐藏控件,但也没有成功。最终,如果你只是使用addSubview方法添加控件,表格视图会对它保持强引用。无论隐藏、修复框架多少次都不起作用。 - David H
13个回答

41

尝试将您的表视图控制器的refreshControl属性设置为nil。


1
如果我在viewDidAppear中进行检查(如果有要连接的服务,则设置它,如果没有则设置为nil),然后在删除服务后使用刷新控件重新加载视图时,会收到以下警告:“强烈不建议在刷新控件处于非空闲状态时更改其状态,可能无法正常工作。”(尽管它在视觉上似乎可以工作。) - Doug Smith
4
在移除刷新控件之前,建议先调用 endRefreshing 方法。你也可以尝试在 viewWillAppear 而非 viewDidAppear 中执行此操作,以此使内容更加易懂。 - Jonathan Arbogast
如果在调用self.refreshControl = nil;之前调用[self.refreshControl endRefreshing];,仍然会触发警告。 - Doug Smith
我刚刚尝试了一下,只要在UIControlEventValueChanged触发的方法外部并且调用了endRefreshing方法, self.refreshControl = nil;对我来说完美地起作用了。我的唯一建议是插入日志记录你的刷新调用的开始/结束时间和空值赋值调用,以确保在刷新事件发生时不会进行赋值。 - DBD
这也是我的第一次尝试;我来到SO寻找答案,因为在将控件设置为“nil”之前首先调用endRefreshing仍然会给我警告(是的,我已经记录了调用并确保在将控件设置为“nil”之前调用了endRefreshing)。还有其他想法吗?
  • 编辑:作为额外的措施,我还在endRefreshing后添加了一个dispatch_after,所以控件将在10秒后设置为“nil”。不幸的是,我仍然收到警告。
  • 另一个编辑:在dispatch_after中记录了控件的isRefreshing,返回了“NO”,但仍然收到了消息。
- Gerald Eersteling
@DougSmith 只需使用 [self.refreshControl removeFromSuperview]; - priwiljay

10

你有几种方法可以做到这一点。 我认为最好的方法是在viewDidLoad方法中进行检查,如下:

if (condition){
 //attach refreshControl
}

如果不可能的话,最好的方法是将这段代码放在您想要隐藏刷新的位置(我认为在viewWillAppear方法中的if条件中)。

//End refresh control
[self.refreshControl endRefreshing];
//Remove refresh control to superview
[self.refreshControl removeFromSuperview];

// 结束刷新控件 [self.refreshControl endRefreshing]; - Umit Kaya

9

试试这个:

[self.refreshControl removeFromSuperview];
self.refreshControl = nil;

8

当我设置tableView.refreshControl = nil时,遇到了不好的体验,因为当我将其设置回旧的refreshControl时,它需要一秒钟才开始动画,所以看起来不太好。所以当我需要禁用refreshControl时,我使用以下方法:

tableView.refreshControl?.endRefreshing()
tableView.refreshControl?.alpha = 0

当我需要它时,我使用:

tableView.refreshControl?.alpha = 1
// and if I need to show refreshing indicator immediately I write:
tableView.refreshControl?.beginRefreshing()

附注:设置 isHidden、isEnabled、isUserInteractionEnabled 没有起到作用。


5

你可以尝试一个非常简单的解决方案:[self.refreshControl removeFromSuperview];


2

虽然这是一个老问题,但我一直在寻找答案,没有一个完全符合我的要求。

这是对我有效的解决方案:

Swift 4

func createRefreshControl() {
    refreshControl = UIRefreshControl()
    refreshControl?.addTarget(self, action: #selector(self.myTableRefreshFunction), for: UIControlEvents.valueChanged)
    refreshControl?.tintColor = UIColor.white
    refreshControl?.endRefreshing()
}

func removeRefreshControl() {
    refreshControl?.removeTarget(self, action: #selector(self.myTableRefreshFunction), for: UIControlEvents.valueChanged)
    refreshControl = nil
}

当我想要创建控件时,我调用createRefreshControl()函数;当我想要移除它时,则调用removeRefreshControl函数。

在移除刷新控件之前,我必须先删除最初添加到刷新控件的相同目标,否则它会在实际移除之前进行一次刷新。


1
为了隐藏刷新控件并避免警告,请使用以下方法:
Objective C: [self.refreshControl removeFromSuperview]; Swift:
self.refreshControl.removeFromSuperview()

1
您无法使用setEnabled:NO来移除UIRefreshControl,因此您需要将其从其父视图中移除。我已经尝试过使用苹果提供的Reachability类的示例。

要添加UIRefreshControl,您可以使用以下内容:
UIRefreshControl *refContr=[[UIRefreshControl alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
        [refContr setTintColor:[UIColor blueColor]];
        [refContr setBackgroundColor:[UIColor greenColor]];

    [self.view addSubview:refContr];
    [refContr setAutoresizingMask:(UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleLeftMargin)];        
    [refContr addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];

然后实现了可达性类通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];

你可以使用bool标志来检查连接性,这里我提供了一个使用苹果的reachability类检查连接性的示例。
switch (netStatus)
{
    case NotReachable:        {

         for (UIRefreshControl *subView in [myView subviews]) {
             if ([subview isKindOfClass:[UIRefreshControl class]]) {
                 [subView removeFromSuperview];
             }
         }
          //or you could use [UIRefreshControl setHidden:YES];

          connectionRequired = YES;
          break;
    }

    case ReachableViaWiFi:        {
         for (UIRefreshControl *subView in [myView subviews]) {
             if ([subview isKindOfClass:[UIRefreshControl class]]) {
                 [subview removeFromSuperview];
             }else{
               [self.view addSubview:refContr];
         }
         //or you could use [UIRefreshControl setHidden:NO];
        break;
    }
} 

希望这对您有用。

如果ReachableViaWiFi,您将与refreshControls的n = myView.subviews.count一起添加,我认为这不是期望的行为。 - slxl

1

我通过在刷新函数中调用"yourRefreshControl".endEditing()来解决了这个问题。


0
我是这样解决的:
-(void)updateUIWithAuthState:(BOOL)isAuthenticated {
    self.loginButton.enabled = !isAuthenticated;
    self.loginButton.tintColor = isAuthenticated ? [UIColor clearColor] : nil;

    self.logoutButton.enabled = isAuthenticated;
    self.logoutButton.tintColor = isAuthenticated ? nil : [UIColor clearColor];

    self.tableView.userInteractionEnabled = isAuthenticated;
    self.data = nil;
    [self.tableView reloadData];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接