2013-10-20 16 views
23

Occasionalmente la mia vista tabella non sarà connessa ad un servizio da aggiornare, e in tal caso, non voglio che UIRefreshControl sia presente.Come posso "nascondere" un UIRefreshControl?

Dopo averlo aggiunto in viewDidLoad, ho provato a nasconderlo in determinate circostanze con setEnabled: e setHidden: ma nessuno dei due sembra funzionare.

+1

si può trovare questo divertente. Ho provato a classificare sottotitoli sia il controllo che tableview. Ho intercettato messaggi in cerca di qualcosa da sfruttare, senza fortuna. Finalmente con la tableview ho sovrascritto -subviews in modo da nascondere il controllo, senza fortuna. Alla fine, se tutto ciò che fai è aggiungere il controllo usando addSubview, il tableview contiene un forte riferimento ad esso. Nessuna quantità di nascondigli, fissando cornici, funzionerebbe. –

risposta

29

Provare a impostare la proprietà refreshControl del controller di visualizzazione tabella su zero.

+1

Se eseguo un check in viewDidAppear (impostandolo se c'è un servizio a cui connettersi, impostando su zero se non c'è) ottengo il seguente avviso quando ricarico la vista con il controllo di aggiornamento al suo interno dopo che ho rimosso il servizio : "Tentare di cambiare il controllo di aggiornamento mentre non è inattivo è fortemente sconsigliato e probabilmente non funzionerà correttamente." (Sebbene visivamente sembri funzionare.) –

+4

Ok, suggerirei di chiamare endRefreshing sul controllo di aggiornamento prima di rimuoverlo. Si potrebbe anche provare a farlo in 'viewWillAppear' invece di' viewDidAppear'. –

+0

'[self.refreshControl endRefreshing];' attiva ancora quell'avviso se chiamato prima di 'self.refreshControl = nil;'. –

0
[refreshControl setTintColor:[UIColor clearColor]]; 

anche che si può fare qualcosa di simile:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (scrollView.contentOffset.y < 0) 
     scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, 0); 
} 
+2

non impedisce al controllo di attivare l'aggiornamento –

8

Prova questa:

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

causa ancora. –

7

Esistono diversi modi per farlo. Penso che il modo migliore è quello di fare un controllo nel metodo viewDidLoad con:

if (condition){ 
//attach refreshControl 
} 

se ciò non fosse possibile il modo migliore è mettere questo codice in cui si desidera nascondere il refresh (penso in modo viewWillAppear se condizioni)

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

non è possibile rimuovere l'UIRefreshControl utilizzando setEnabled:NO, in modo da questo è necessario per rimuoverlo dal suo superview.I hanno provato un campione utilizzando la classe di raggiungibilità fornito da Apple.

Per aggiungere UIRefreshControl è possibile utilizzare questo:

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

Poi Implementato notifica classe raggiungibilità:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil]; 

è possibile farlo utilizzando bandiera bool per controllare la connettività, Qui sto fornire questo esempio usando la classe di raggiungibilità da parte di apple per verificare la mia connettività.

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; 
    } 
} 

Spero che questo funzioni per voi.

+0

nel caso ReachableViaWiFi verrete aggiunti con n = myView.subviews.count di refreshControls, pensate al suo comportamento non desiderato – slxl

0

ho risolto in questo modo:

-(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]; 
} 
5

C'è una soluzione molto semplice si può provare: [self.refreshControl removeFromSuperview];

0

Il migliore per implementare UIRefreshControl è al di sotto.

-(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; 
} 

Quando non c'è più record da caricare poi rimuovere refreshControl per linea sotto

self.tableView.refreshControl = nil; 

Ho implementato stesso lavorando bene.

0

Per nascondere il controllo di aggiornamento ed evitare avvertimento Basta usare

Objective C

[self.refreshControl removeFromSuperview];

Swift

self.refreshControl.removeFromSuperview() 
Problemi correlati