Forse un po 'tardi, ma ho forse trovato una soluzione migliore per coloro che sono ancora in cerca di questo:
In viewDidLoad del vostro UICollectionViewController Aggiungi la tua voce:
UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Title" action:@selector(action:)];
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:menuItem]];
Aggiungere i seguenti metodi delegato:
//This method is called instead of canPerformAction for each action (copy, cut and paste too)
- (BOOL)collectionView:(UICollectionView *)collectionView canPerformAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
if (action == @selector(action:)) {
return YES;
}
return NO;
}
//Yes for showing menu in general
- (BOOL)collectionView:(UICollectionView *)collectionView shouldShowMenuForItemAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
Sottoclasse UICollectionViewCell se non l'hai già fatto. Aggiungere il metodo specificato per il vostro articolo:
- (void)action:(UIMenuController*)menuController {
}
In questo modo non è necessario alcun becomeFirstResponder o altri metodi. Hai tutte le azioni in un posto e puoi gestire facilmente celle diverse se chiami un metodo generale con la cella stessa come parametro.
Edit: In qualche modo l'uicollectionview ha bisogno l'esistenza di questo metodo (questo metodo non viene chiamato per l'azione personalizzata, penso che l'uicollectionview solo verifica la presenza di esistenza)
- (void)collectionView:(UICollectionView *)collectionView performAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {
}
Sì è solo bisogno di questi 3 metodi. Qualsiasi altra cosa non è necessaria. –
Grazie, ho provato la soluzione, mentre scrivevo UIMenuItem * menuItem = [[UIMenuItem alloc] initWithTitle: @ "Modifica" azione: @selector (editPlate :)]; tuttavia, mi richiede di avere un metodo editPlate ma mi piacerebbe usare performAction, così posso conoscere l'id della cella. Come trovi la voce del menu? – Dejell