Esiste un modo semplice per sottoclassi di UITableViewCell di mostrare il popup UIMenuController 'Copia' come nell'app Rubrica (vedi screenshot), dopo la selezione si tiene per un po '?Un modo semplice per mostrare il popup 'Copia' su UITableViewCells come la rubrica App
risposta
Il metodo prima di iOS 5 è quello di ottenere un'istanza condivisa del UIMenuController, impostare il rettangolo di destinazione e di visualizzare e chiamare -setMenuVisible:animated:
. Ricordare di implementare -canPerformAction:withSender:
nel proprio risponditore.
Il metodo dopo iOS 5 (precedentemente disponibile come funzionalità non documentata) è quello di implementare questi 3 metodi nell'origine dati (vedere https://developer.apple.com/reference/uikit/uitableviewdelegate#1653389).
-(void)tableView:(UITableView*)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath*)indexPath withSender:(id)sender;
-(BOOL)tableView:(UITableView*)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath*)indexPath withSender:(id)sender;
-(BOOL)tableView:(UITableView*)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath*)indexPath;
La sottoclasse UITableViewCell potrebbe assomigliare a questo
@interface MenuTableViewCell : UITableViewCell {
}
- (IBAction)copy:(id)sender;
- (void)showMenu;
@end
@implementation MenuTableViewCell
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(copy:)) {
return YES;
}
return NO;
}
- (IBAction)copy:(id)sender {
}
- (void)showMenu {
[[UIMenuController sharedMenuController] setMenuVisible:NO animated:YES];
[self becomeFirstResponder];
[[UIMenuController sharedMenuController] update];
[[UIMenuController sharedMenuController] setTargetRect:CGRectZero inView:self];
[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
}
@end
E i metodi UITableView delegato sono come
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
MenuTableViewCell *cell = (MenuTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[MenuTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell.
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
MenuTableViewCell *cell = (MenuTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
[cell showMenu];
}
Grazie per la risposta. Questo è un buon modo per farlo "ufficialmente", immagino, ma ciò che non mi piace è che mostra la vista Copia quando selezionata, dove l'app Rubrica mostra la vista di copia quando è trattenuta per X secondi. Questo non è un problema con la tua soluzione, ma piuttosto con l'API. Grazie mille per il tuo aiuto. –
Quando provo questa soluzione sembra funzionare, ma dopo che il menu è mostrato, ulteriori chiamate a [self.tableView reloadData] non chiamano i callback UITableViewDataSource: numberOfSections, ecc.Sembra che la chiamata a diventare FirstResponder sia il metodo che whacks il TableView dal ricaricare, ma la chiamata a diventareFirstResponder è necessaria per mostrare il menu. È difficile credere che qualcos'altro non stia succedendo. Molto confuso. Forse inizierò un nuovo progetto per vedere se riesco a riprodurlo da solo. – Daniel
Ho riprodotto il problema in un progetto nuovo e pulito. Nella mia UITableViewCell personalizzata avevo implementato: - (BOOL) resignFirstResponder perché pensavo che sarebbe stato un buon posto per cancellare le voci del menu personalizzato da sharedMenuController. Se non si eliminano le voci di menu personalizzate, vengono associate ad altri campi UIText nella stessa vista, dove non hanno senso. In ogni caso, anche se il mio resignFirstResponder non fa altro che restituire YES, causa comunque il fallimento delle chiamate [tableView reloadData] successive. Questo è molto strano per me. Immagino che cercherò un altro posto per cancellare il menu. – Daniel
V'è ora l'interfaccia ufficiale per la visualizzazione dei menu cellulari UITableView in iOS 5. Esempio (dal delegato del tavolo):
- (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{
return (action == @selector(copy:));
}
- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{
if (action == @selector(copy:)){
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[[UIPasteboard generalPasteboard] setString:cell.textLabel.text];
}
}
Ho provato a modificare il controller condiviso di UIMenuController per aggiungere la mia voce di menu, e sono stato in grado di aggiungerlo e ottenere il messaggio canPerformAction
, ma restituire SÌ non ha aiutato; Non ero in grado di far apparire la mia voce di menu personalizzata. Dai miei esperimenti, sembra che solo Copia, Taglia e Incolla siano supportati. [EDIT Poiché è stato pubblicato, ho imparato come aggiungere voci di menu personalizzate.]
Si noti che questo funziona solo se tutti e tre i metodi delegati sono implementati.
Disponibile da iOS 5.0. –
Aggiungilo sotto NSLog per copiare su pasteboard UITableViewCell * cell = [self tableView: tableView cellForRowAtIndexPath: indexPath]; [[UIPasteboard generalPasteboard] setString: cell.detailTextLabel.text]; – malaki1974
Sì, era essenziale quindi ho modificato la sua risposta con :-) – malhal
#pragma mark - COPY/PASTE Cell Text via Menu
- (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{
return (action == @selector(copy:));
}
- (void)tableView:(UITableView *)tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{
if (action == @selector(copy:))
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
[pasteBoard setString:cell.textLabel.text];
}
}
Ecco la sintassi Swift per la copia detailTextLabel
.
override func tableView(_ tableView: UITableView, shouldShowMenuForRowAt indexPath: IndexPath) -> Bool {
return (tableView.cellForRow(at: indexPath)?.detailTextLabel?.text) != nil
}
override func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool {
return action == #selector(copy(_:))
}
override func tableView(_ tableView: UITableView, performAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) {
if action == #selector(copy(_:)) {
let cell = tableView.cellForRow(at: indexPath)
let pasteboard = UIPasteboard.general
pasteboard.string = cell?.detailTextLabel?.text
}
}
- 1. Come mostrare popup su Emacs?
- 2. Mostrare un progressoBar in un popup
- 3. Creare un popup modale semplice
- 4. Come mostrare un messaggio popup come in Stack Overflow
- 5. Come verificare se il blocco è presente in un file sparse (per semplice copia-su-scrittura)?
- 6. Aggiungere UITableViewCells tra 2 UITableViewCells in un UITableView con un'animazione
- 7. Come mostrare il messaggio popup dal lato server
- 8. Rubrica Rubrica in Core Data
- 9. C'è un modo per ottenere la carta "Me" dall'API della Rubrica Indirizzi iPhone?
- 10. App: usa la rubrica per trovare amici ::: Come trattare i codici paese
- 11. Il modo più semplice per pubblicare su Zeroconf/Bonjour?
- 12. C'è un modo semplice per ottenere il ServerName in Symfony?
- 13. Un modo semplice per disabilitare un UITextField?
- 14. C'è un modo semplice per iterare su un NSArray all'indietro?
- 15. Il modo più semplice per realizzare un iteratore ciclico (circolatore)?
- 16. Qual è il modo più semplice per configurare la spaziatura dell'indentazione su un ObjectMapper Jackson?
- 17. Un modo semplice per unire i plists?
- 18. Come si accede alla registrazione dell'utente corrente nella Rubrica?
- 19. Popup WPF: come inserire un bordo attorno al popup?
- 20. Lazy load images per UITableViewCells da NSDocumentDirectory?
- 21. Il modo più semplice per nascondere/mostrare i div con JQuery
- 22. Libgdx: C'è un modo semplice per centrare il testo su ciascun asse su un pulsante?
- 23. Un modo semplice per nascondere la barra di sistema su Android ICS
- 24. Il modo più semplice per eseguire IIS su Mac?
- 25. C'è un modo semplice per creare sottodomini su codeigniter?
- 26. Impossibile visualizzare il popup popup
- 27. Un modo semplice per eseguire test su una gemma?
- 28. Il modo più semplice per disegnare un'immagine?
- 29. Il modo più semplice per avere un sito django multilingue?
- 30. Un semplice framework per Google App Engine (come Sinatra)?
Grazie! Il metodo non documentato è esattamente quello che stavo cercando. Il metodo "ufficiale" è piuttosto goffo. Si spera che venga presto documentato. Non è ideale che non sia documentato, ma in questo caso è solo implementando il protocollo, non chiamando un metodo, quindi si spera che sia sicuro (er). –
Perché questi metodi non sono ancora documentati? Sono una specie di metodi privati? Se lo sono, la tua app potrebbe non essere accettata dall'app store. – dombesz
Questi sono documentati come iOS 5.0 come parte del protocollo UITableViewDelegate: http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UITableViewDelegate_Protocol/Reference/Reference.html. –