有时我的表视图不能连接到服务进行刷新,在这种情况下,我不希望UIRefreshControl出现。
在viewDidLoad中添加它后,我尝试使用setEnabled:和setHidden:隐藏它,但两者似乎都无效。
有时我的表视图不能连接到服务进行刷新,在这种情况下,我不希望UIRefreshControl出现。
在viewDidLoad中添加它后,我尝试使用setEnabled:和setHidden:隐藏它,但两者似乎都无效。
尝试将您的表视图控制器的refreshControl
属性设置为nil。
endRefreshing
方法。你也可以尝试在 viewWillAppear
而非 viewDidAppear
中执行此操作,以此使内容更加易懂。 - Jonathan Arbogastself.refreshControl = nil;
之前调用[self.refreshControl endRefreshing];
,仍然会触发警告。 - Doug SmithUIControlEventValueChanged
触发的方法外部并且调用了endRefreshing
方法, self.refreshControl = nil;
对我来说完美地起作用了。我的唯一建议是插入日志记录你的刷新调用的开始/结束时间和空值赋值调用,以确保在刷新事件发生时不会进行赋值。 - DBDendRefreshing
仍然会给我警告(是的,我已经记录了调用并确保在将控件设置为“nil”之前调用了endRefreshing
)。还有其他想法吗?endRefreshing
后添加了一个dispatch_after
,所以控件将在10秒后设置为“nil”。不幸的是,我仍然收到警告。dispatch_after
中记录了控件的isRefreshing
,返回了“NO”,但仍然收到了消息。你有几种方法可以做到这一点。 我认为最好的方法是在viewDidLoad方法中进行检查,如下:
if (condition){
//attach refreshControl
}
如果不可能的话,最好的方法是将这段代码放在您想要隐藏刷新的位置(我认为在viewWillAppear方法中的if条件中)。
//End refresh control
[self.refreshControl endRefreshing];
//Remove refresh control to superview
[self.refreshControl removeFromSuperview];
试试这个:
[self.refreshControl removeFromSuperview];
self.refreshControl = nil;
当我设置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
没有起到作用。
你可以尝试一个非常简单的解决方案:[self.refreshControl removeFromSuperview];
虽然这是一个老问题,但我一直在寻找答案,没有一个完全符合我的要求。
这是对我有效的解决方案:
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函数。
在移除刷新控件之前,我必须先删除最初添加到刷新控件的相同目标,否则它会在实际移除之前进行一次刷新。
[self.refreshControl removeFromSuperview];
Swift:self.refreshControl.removeFromSuperview()
setEnabled:NO
来移除UIRefreshControl,因此您需要将其从其父视图中移除。我已经尝试过使用苹果提供的Reachability类的示例。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];
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;
}
}
我通过在刷新函数中调用"yourRefreshControl".endEditing()
来解决了这个问题。
-(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];
}