Parfois, ma vue de table ne sera pas connectée à un service à actualiser et, dans ce cas, je ne souhaite pas que UIRefreshControl soit présent.
Après l'avoir ajouté dans viewDidLoad, j'ai essayé de le masquer dans certaines circonstances avec setEnabled:
et setHidden:
, mais ni l'un ni l'autre ne semble fonctionner.
Essayez de définir la propriété refreshControl
de votre contrôleur de vue table sur nil.
Essaye ça:
[self.refreshControl removeFromSuperview];
self.refreshControl = nil;
Vous avez plusieurs façons de le faire ... Je pense que le meilleur moyen est de vérifier la méthode viewDidLoad avec:
if (condition){
//attach refreshControl
}
si ce n'est pas possible, le meilleur moyen est de placer ce code à l'endroit où vous souhaitez masquer l'actualisation (je pense que la méthode viewWillAppear est dans la condition if)
//End refresh control
[self.refreshControl endRefreshing];
//Remove refresh control to superview
[self.refreshControl removeFromSuperview];
Il existe une solution très simple que vous pouvez essayer: [self.refreshControl removeFromSuperview];
Pour masquer le contrôle d'actualisation et éviter les avertissements, utilisez simplement
Objectif c
[self.refreshControl removeFromSuperview];
Rapide
self.refreshControl.removeFromSuperview()
Vous ne pouvez pas supprimer UIRefreshControl en utilisant setEnabled:NO
, vous devez donc le supprimer de son aperçu. J'ai essayé un exemple en utilisant la classe Reachability fournie par Apple.
Pour ajouter UIRefreshControl, vous pouvez utiliser ceci:
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];
Puis mise en œuvre de la notification de la classe d'accessibilité:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
Vous pouvez le faire en utilisant le drapeau bool pour vérifier la connectivité. Ici, je fournis cet exemple en utilisant la classe d'accessibilité par Apple pour vérifier ma connectivité.
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;
}
}
J'espère que cela fonctionnera pour vous.
[refreshControl setTintColor:[UIColor clearColor]];
aussi vous pouvez faire quelque chose comme ça:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.y < 0)
scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, 0);
}
J'ai eu une mauvaise expérience lorsque j'ai défini tableView.refreshConrol = nil
, car lorsque je l'ai redéfini sur l'ancien refreshControl
, l'animation n'a démarré que dans une seconde. Cela ne semblait donc pas très bien. Par conséquent, lorsque je dois désactiver refreshControl
, j'utilise:
tableView.refreshControl?.endRefreshing()
tableView.refreshControl?.alpha = 0
quand j'en ai besoin, j'utilise:
tableView.refreshControl?.alpha = 1
// and if I need to show refreshing indicator immediately I write:
tableView.refreshControl?.beginRefreshing()
P.S. La définition de isHidden, isEnabled, isUserInteractionEnabled
n'a pas aidé
Une vieille question, mais je cherchais une réponse et rien ne fonctionnait exactement comme je le voulais.
C'est ce qui a fonctionné pour moi:
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
}
J'appelle createRefreshControl () lorsque je veux que le contrôle soit créé, et removeRefreshControl lorsque je souhaite le supprimer.
Je devais retirer la même cible que j'avais initialement ajoutée à la commande d'actualisation, sinon elle serait rafraîchie une fois avant d'être réellement retirée (comme une arme à feu avec une balle dans la chambre ou des toilettes lorsque l'eau est coupée)
La meilleure solution pour implémenter UIRefreshControl est la suivante.
-(void)addRefreshControll{
self.refreshControl=[[UIRefreshControl alloc] init];
self.refreshControl.tintColor=[UIColor colorWithRed:0 green:183.0/255.0 blue:213/255.0 alpha:1.0];
self.refreshControl.attributedTitle = [[NSAttributedString alloc]initWithString:@"Loading history..."];
[self.refreshControl addTarget:self action:@selector(loadMoreChatFromCoreData) forControlEvents:UIControlEventValueChanged];
self.tableView.refreshControl = self.refreshControl;
}
Lorsqu'il n'y a plus d'enregistrement à charger, supprimez refreshControl en dessous de la ligne.
self.tableView.refreshControl = nil;
J'ai mis en œuvre même fonctionne bien.
J'ai résolu ce problème en appelant "yourRefreshControl".endEditing()
dans la fonction d'actualisation.
Je l'ai résolu de cette façon:
-(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];
}