web-dev-qa-db-fra.com

Comment "cacher" un UIRefreshControl?

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.

28
Doug Smith

Essayez de définir la propriété refreshControl de votre contrôleur de vue table sur nil.

35
Jonathan Arbogast

Essaye ça:

[self.refreshControl removeFromSuperview];
self.refreshControl = nil;
9
Sviatoslav Yakymiv

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];
9
Serluca

Il existe une solution très simple que vous pouvez essayer: [self.refreshControl removeFromSuperview];

5
jenish

Pour masquer le contrôle d'actualisation et éviter les avertissements, utilisez simplement 

Objectif c 

[self.refreshControl removeFromSuperview]; 

Rapide 

self.refreshControl.removeFromSuperview()
1
Prince Jayakumar

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.

1
Arun_
[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);
}
0
ChikabuZ

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é

0
Paul T.

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)

0
iOS_Mouse

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.

0
Pandey_Laxman

J'ai résolu ce problème en appelant "yourRefreshControl".endEditing() dans la fonction d'actualisation.

0
Eskil Olsen

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];
}
0
Ilya Stroganov