je rencontre le même problème récemment et il a fallu un certain temps pour le faire réparer. Le problème est que lorsque le champ de texte est imbriqué dans ReusableCollectionView, les éléments suivants ne fonctionnent pas. En outre, pour moi cela a bien fonctionné sur le simulateur mais n'a pas fonctionné sur l'appareil.
Réglage contrôleur de vue en tant que délégué du champ de texte et la mise en œuvre
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
return NO;
}
ne fonctionne pas parce que la vue de la collecte des résultats n'a pas actualisé. Ma conjecture est - avant de recharger ses collections de vues essaye de retirer le foyer de tous les contrôles imbriqués mais il ne peut pas - nous renvoyons NON de la méthode de délégué de champ de texte. Donc, la solution pour moi était de laisser le système retirer le focus du champ de texte, mais le récupérer après le rechargement. La question était de savoir quand le faire.
D'abord, je l'ai essayé de le faire dans le
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
mais quand il n'y avait pas d'articles dans la collection (qui est le cas normal pendant le filtrage), cette méthode n'a pas s'appeler.
Finalement, j'ai résolu ceci de la façon suivante. J'ai créé la sous-classe UICollectionReusableView en implémentant deux méthodes: -prepareForReuse et -drawRect :. Le premier contient l'appel -setNeedsDesplay qui planifie l'appel drawRect au cycle de dessin suivant. Le second restaure le focus en appelant [self.textField becomeFirstResponder] si l'indicateur correspondant est défini sur YES. Donc, l'idée était d'appeler "getFirstResponder" plus tard, mais pas trop tard, sinon le "saut" bizarre du clavier se produit.
Ma coutume vue de collection réutilisable ressemble à ceci:
@interface MyCollectionReusableView : UICollectionReusableView
@property (nonatomic, assign) BOOL restoreFocus;
@property (nonatomic, strong) UITextField *textField;
@end
@implementation MyCollectionReusableView
@synthesize restoreFocus;
@synthesize textField;
- (void)setTextField:(UITextField *)value {
textField = value;
[self addSubview:textField];
}
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
if (self.restoreFocus) {
[self.textField becomeFirstResponder];
}
}
- (void)prepareForReuse {
[self setNeedsDisplay];
}
Puis dans mon View Controller:
- (void)viewDidLoad {
[super viewDidLoad];
[self.collectionView registerClass:[MyCollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:HeaderReuseIdentifier];
[self.textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
if (UICollectionElementKindSectionHeader == kind) {
MyCollectionReusableView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:HeaderReuseIdentifier forIndexPath:indexPath];
//add textField to the reusable view
if (nil == view.textField) {
view.textField = self.textField;
}
//set restore focus flag to the reusable view
view.restoreFocus = self.restoreFocus;
self.restoreFocus = NO;
return view;
}
return nil;
}
- (void)textFieldDidChange:(UITextField *)textField {
self.restoreFocus = YES;
[self.collectionView reloadData];
}
Probablement pas la solution la plus élégante, mais il fonctionne. :)
Merci d'avoir posé cette question. – GeneCode