2013-03-04 5 views
2

A peine commencé à utiliser "UIRefreshControl" aujourd'hui, et a remarqué des choses étranges.Bizarrerie UIRefreshControl

Si je crée UIRefreshControl dans InterfaceBuilder et que je câble tout, mon sélecteur ne sera jamais appelé. IB dit que le contrôle devrait se déclencher sur le message "valeur changée", et devrait appeler mon code, mais ne le fait jamais.

J'ai donc abandonné cela dans Interface Builder, et j'ai décidé de le faire dans le code. Pas trop de lignes. Donc, je mets ce code à l'intérieur de ma routine « viewDidLoad »:

self.refreshControl = [UIRefreshControl new]; 
[self.refreshControl addTarget:self action:@selector(doStuff:) forControlEvents:UIControlEventValueChanged]; 
NSMutableParagraphStyle* paragraphStyle = [NSMutableParagraphStyle new]; 
paragraphStyle.alignment = NSTextAlignmentCenter; 
self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to refresh" attributes:@{NSParagraphStyleAttributeName : paragraphStyle}]; 

Il tire très bien, mais l'actualisation de contrôle est visible lorsque la vue apparaît en premier. Je préférerais que ce ne soit pas visible avant que l'utilisateur ne tire sur la table. Je fais un appel à un service web, et j'attends que les résultats reviennent, puis je remplis la table. Donc, vous ne voyez le contrôle que pour une seconde ou deux. Mais ça a l'air bizarre. Donc, les questions sont:
1. Est-ce un bug connu que vous ne pouvez pas câbler le contrôle uniquement à partir d'Interface Builder?
2. Existe-t-il un moyen d'ajouter ce contrôle au contrôleur de table-vue, sans qu'il apparaisse jusqu'à ce que l'utilisateur veuille réellement le voir?

Répondre

1

Vous n'avez pas besoin d'ajouter un contrôle d'actualisation ou en déclarer un dans votre viewController. L'ajout de pull-to-refresh est un processus en deux étapes.
Étape 1: Dans votre storyboard, allez dans votre tableViewController et, s'il est indiqué "Actualiser", sélectionnez "Activé".
Étape 2: Ajoutez le code suivant à votre fichier tableViewController.m, dans viewDidLoad:

[self.refreshControl addTarget:self 
          action:@selector(refresh) 
        forControlEvents:UIControlEventValueChanged]; 

C'est l'ensemble du processus, autre que faire des choses dans votre méthode -refresh. Il n'y a plus rien à faire.

0

Oui, il y a un bug avec le UIRefreshControl que l'action n'est jamais appelée. Keith Harrison parle à ce sujet dans son blog UIRefreshControl Fun and Games:

enquête avec le débogueur, il semble que la méthode de rafraîchissement est jamais appelé. Je peux seulement supposer que pour quelque raison le storyboard est ne reliant pas correctement le UIRefreshControl à notre action ou est ayant une autre interaction étrange avec l'événement UIControlEventValueChanged. J'ai déposé un rapport de bug avec Apple (rdar://14178445) mais il existe aussi une solution de contournement simple que vous pouvez utiliser.

La solution de contournement est décrite par @AMayes.

+1

J'ai eu ce bug quand mon contrôleur de vue avait "taille libre" = 1000px. Lorsque je l'ai modifié à fixed, l'actualisation a commencé à fonctionner correctement. – oyatek

+0

en supprimant la "taille de forme libre" dans le storyboard est ce qui a finalement fixé! Merci! –