2011-10-27 16 views
9

He intentado aprender la nueva función Storyboard en Xcode y me he encontrado con un problema al tratar de configurar una UITableView para editar el modo.iPhone Storyboard Edición de una vista de tabla

Hasta ahora mi guión gráfico se ve así:

NavigationController -> UIViewController (subclase con la propiedad tableview)

que añade un elemento de navegación y un elemento de la barra del botón de la escena controlador de vista, por lo que veo un botón de edición. No hizo nada automágicamente, así que intenté vincular su selector al método setEditing del delegado de tableview. Esto lo puso en modo de edición. Sin embargo, el botón de edición no cambió a un botón "Listo" y entonces no hay forma de salir del modo de edición.

¿Tengo que crear otro elemento de navegación para el botón Hecho? ¿Cómo lo conecto para que aparezca en el momento correcto y funciona correctamente?

Respuesta

13

simplemente empecé a usar guiones gráficos, así que también quería usar el Storyboard para agregar mi botón Editar. Es molesto haberse tomado el tiempo para aprender cómo usar una nueva herramienta, pero creo que necesita un rollo de cinta adhesiva para reparar los agujeros.

Puede hacer que funcione, pero debe agregar un botón Personalizado. En el inspector de atributos, asegúrese de que el identificador sea personalizado y el título sea Editar.

A continuación, añadir algo como esto en su .m

- (IBAction)setEditMode:(UIBarButtonItem *)sender { 
    if (self.editing) { 
     sender.title = @"Edit"; 
     [super setEditing:NO animated:YES]; 
    } else { 
     sender.title = @"Done"; 
     [super setEditing:YES animated:YES]; 
    } 
} 

Tenga su botón Editar personal llamar al método setEditMode.

Solo espero que en el futuro puedan arreglar la implementación del botón Editar en el editor Storyboard.

5

Si está utilizando el controlador de navegación para presionar al controlador de vista, simplemente configure self.navigationItem.rightBarButtonItem = self.editButtonItem;, que colocará el botón Editar predeterminado a la derecha. Si la barra de navegación no está visible, llame al self.navigationController.navigationBarHidden = NO;. Esos serían llamados en el método viewDidLoad, o algo similar. A continuación, con el fin de obtener la tableView para responder a la llamada de edición, utilice el siguiente método:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { 
    [super setEditing:editing animated:animated]; 
    [tableView setEditing:editing animated:animated]; 
} 

Eso debería hacer lo que quieres que haga. Si tiene algún problema, simplemente dígalo y podemos reducir los detalles

+1

Sí, sé cómo hacerlo programáticamente, pero he estado tratando de lograrlo a través del Storyboar d UI. – markplee

+0

Debería ser más o menos lo mismo. He estado usando la interfaz de usuario de Storyboard también (que tengo que decir que hace la vida mucho más fácil) y he tenido que hacer cosas similares y así fue como lo hice. Me he dado cuenta de que a veces tienes que pasar por 'self.parentViewController.navigationItem.rightBarButtonItem = yourButton;' a veces para obtener la vista deseada en tu jerarquía. Pero el resto debería permanecer igual que antes, siempre y cuando su tableView esté vinculado al viewController como IBOutlet – justin

+0

¿Hay alguna noticia al respecto? He estado tratando de encontrar la manera de reemplazar un LOC por la nueva función Storyboard. Simplemente poner un botón en la barra de navegación y nombrarlo como "Editar" no funciona, por supuesto. ;) –

27

Creo que también con Storyboard, la única forma (por supuesto, la más fácil) de implementar un botón de edición/hecho, es utilizar el siguiente código:

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
... 
//set the edit button 
self.navigationItem.leftBarButtonItem = self.editButtonItem; 
... 

Esta es la solución que la propia Apple implementa si se selecciona una plantilla "Maestro-Detalle de aplicación" para su proyecto.

Probablemente Storyboard todavía no es perfecto, y es de esperar que se mejorará de Apple en próximas versiones ...

6

En resumen:

El botón, devuelto por UIViewController.editButtonItem es un botón especial alternar con un comportamiento especial que llama - (void)setEditing:(BOOL)editing animated:(BOOL)animated si se presiona.

El botón, devuelto por UINavigationController.editButtonItem es un botón simple, simplemente etiquetado con "Editar".

El Storyboard permite seleccionar el último.

1

uno puede usar el botón de edición tonto, no funciona desde el editor Storyboard y luego reemplazarlo programáticamente con el UIViewController.editButtonItem.

en viewDidLoad:

NSMutableArray *toolbarItems = [NSMutableArray arrayWithArray:self.toolbarItems]; 

[toolbarItems replaceObjectAtIndex:0 withObject:self.editButtonItem]; 

[self setToolbarItems:toolbarItems];  

este código se supone que uno ha añadido el botón Editar tonto como el elemento más a la izquierda en la barra de herramientas en el guión gráfico.

+0

Esto es un poco raro, pero es preferible volver a implementar el botón Editar. – SeanR

+0

¿Qué tiene de hacky? gracias – kitschmaster

+0

Usar código para reemplazar el botón que ha agregado en Interface Builder con el botón debería parecer un truco ... pero es una falla de parte de Apple que nos obliga a hacerlo de esta manera. No me malinterpreten, creo que esta es la mejor solución, salvo que Apple soporte el botón Editar real en Interface Builder. – SeanR

2

Para agregar a @Graham respuesta, es posible que también desee cambiar el estilo para que pueda tener el estilo del botón "Hecho" (el color azul). Algo como esto:

- (IBAction)setEditMode:(UIBarButtonItem *)sender { 
    if (self.editing) { 
     sender.title = @"Edit"; 
     sender.style = UIBarButtonItemStylePlain; 
     [super setEditing:NO animated:YES]; 
    } else { 
     sender.title = @"Done"; 
     sender.style = UIBarButtonItemStyleDone; 
     [super setEditing:YES animated:YES]; 
    } 
} 
1

En caso de que usted tiene UIViewController y dentro de ésta ha agregado un UITableView. Si desea agregar una edición UIBarButton con el fin de interactuar con UITableView, intente:

añadir esta línea ...

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    ... 

    self.navigationItem.leftBarButtonItem = self.editButtonItem; 

    ... 
} 

y este método

- (void)setEditing:(BOOL)editing animated:(BOOL)animated { 

    [super setEditing:editing animated:animated]; 
    [self.myListTableView setEditing:editing animated:animated]; 

    if(self.myListTableView.editing) { 
     NSLog(@"editMode on"); 
    } else { 
     NSLog(@"editMode off"); 
    } 
} 

donde

@property (weak, nonatomic) IBOutlet UITableView *myListTableView; 
Cuestiones relacionadas