2010-07-16 9 views
17

Estoy tratando de agregar un elemento de menú al lado de los elementos "copiar", "pegar" en una UITextView. He creado una subclase de UITextView y copié el ejemplo de la documentación de Apple aquí:¿Cómo agrego un UIMenuItem personalizado al UIMenuController en un UITextView?

http://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/Text/Text.html#//apple_ref/doc/uid/TP40009370-CH8-SW28

simplemente creó un UITextView en IB y establecer su clase para mi clase CustomTextView. Lamentablemente, esto no funcionó. Aunque, si configuro CustomTextView en una subclase de UIView, funciona muy bien. ¿Alguna ayuda aquí?

También he hecho un proyecto ejemplo muy sencillo de mi situación aquí:

apps.popsweet.com/TextViewTrial.zip

Respuesta

35

así que terminé utilizando la siguiente con resultados que quería, coloqué el siguiente bloque en el método viewDidLoad de mi controlador de vista como Alex dio a entender que:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Change Color" action:@selector(changeColor:)]; 
    [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObject:menuItem]]; 
    [menuItem release]; 
} 

Luego añade lo siguiente a la vista controlador para mostrar el elemento condicional cuando se selecciona texto dentro del UITextView que llamé "Textview":

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { 
    if (action == @selector(changeColor:)) { 
     if (textView.selectedRange.length > 0) { 
      return YES; 
     } 
    } 
    return NO; 
} 

he elegido para colocar el canPerformAction: withSender: método en el controlador de vista en lugar de una clase UITextView encargo porque de esta manera el o otras opciones (p. copiar, cortar, pegar, etc.) se comportan como lo harían normalmente ya que se llama al método en cada objeto en la cadena de respuesta.

+0

+1 sin embargo, cuando hago esto, el método changeColor apunta a mi clase TableViewCell personalizada y se bloquea porque no existe. ¿Puedo señalar esto al controlador de vista? –

+1

Es posible que deba asegurarse de que la ventana UI sea la ventana clave y de implementar este método: - (BOOL) canBecomeFirstResponder { return YES; } –

1

yo sólo era capaz de crear un elemento de menú personalizado que siempre está presente en el menú emergente, haciendo lo siguiente:

- (void) setUpCustomMenu { 
Class cls1 = NSClassFromString(@"UIMenuController"); 
Class cls2 = NSClassFromString(@"UIMenuItem"); 
if (cls1 && cls2) 
    if ([UIMenuController instancesRespondToSelector:@selector(setMenuItems:)]) { 
      UIMenuItem* item1 = [[UIMenuItem alloc] initWithTitle:@"My Menu Item" action:@selector(myMenuAction:)]; 
      [UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObjects:item1, nil];; 
      [item1 release]; 
    } 
} 

Esto se llama en el viewDidLoad del controlador de vista.

Todavía estoy luchando por hacer que esto solo muestre mi elemento de menú condicionalmente (si, por ejemplo, hay algo seleccionado), al interceptar el evento que convoca el controlador de menú. Hasta ahora no he podido hacer esto.

Cuestiones relacionadas