Pregunta

En mi aplicación tengo una interfaz de tipo desglosada de la siguiente manera:
Mi vista de raíz, que tiene una lista de elementos y un " Agregar " botón.
Al seleccionar un elemento, se presiona " Detalle " vista en el navigationController.
Seleccionando la opción " Añadir " el botón presiona un " Agregar " vista.

¿Cómo realizaría la transición entre la vista Agregar a la vista Detalle?

Estoy pensando en hacer un " pop " en la vista Agregar y presione el controlador de Detalles, pero ¿cómo puedo hacer que la segunda parte esté animada, de modo que la vista de detalles se deslice verticalmente o se difumine desde la vista Agregar?

Gracias,
Kelso

¿Fue útil?

Solución

Basado en la respuesta de Ramin, puedes intentarlo de esta manera, que es usado por Apple en varias muestras:

MyListViewController.h

#import "MyAddViewController.h"

@interface MyListViewController : UITableViewController <MyAddViewControllerDelegate> {
}

- (IBAction)add:(id)sender;
@end

MyListViewController.m

// Action for bring up add view controller
- (IBAction)add:(id)sender {
    MyAddViewController *addViewController = [[MyAddViewController alloc] initWithStyle:UITableViewStyleGrouped];
    addViewController.delegate = self;

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:addViewController];
    [self presentModalViewController:navigationController animated:YES];

    [navigationController release];
    [addViewController release];     
}

// MyAddViewController's delegate method, dismiss the add view controller in here
- (void)addViewController:(MyAddViewController *)addViewController didAddData:(MyData *)data{
if (data) {
   MyDetailViewController *detailViewController = [[MyDetailViewController alloc] initWithStyle:UITableViewStylePlain];
   detailViewController.data = data;
   [self.navigationController pushViewController:detailViewController animated:YES];
   [detailViewController release]; 
}
[self dismissModalViewControllerAnimated:YES];
}

MyAddViewController.h

@protocol MyAddViewControllerDelegate;
@class MyData;

@interface MCCourseAddTableViewController : UITableViewController {
@private
    MyData *data;
    id <MCCourseAddDelegate> delegate;
}

// MyData could be NSManagedObject if you want to use Core Data
@property(nonatomic, retain) MyData *data;
@property(nonatomic, assign) id <MyAddViewControllerDelegate> delegate;

- (void)save;
- (void)cancel;
@end

@protocol MyAddViewControllerDelegate <NSObject>
@optional
- (void)addViewController:(MyAddViewController *)addViewController didAddData:(MyData *)data;;
@end

MyAddViewController.m

- (void)save {
    if (self.delegate != nil) {
        if ([self.delegate conformsToProtocol:@protocol(MyAddViewControllerDelegate)]){
            if ([self.delegate respondsToSelector:@selector(addViewController:didAddData:)]){
                // Send data back to List View, to bring up detail view controller and dismiss add view controller
                [self.delegate addViewController:self didAddData:self.data];
            }
        }
    }
}

- (void)cancel {
    if (self.delegate != nil) {
        if ([self.delegate conformsToProtocol:@protocol(MyAddViewControllerDelegate)]){
            if ([self.delegate respondsToSelector:@selector(addViewController:didAddData:)]){
                // Send nil back to ListView, to dismiss the add view controller only
                [self.delegate addViewController:self didAddData:nil];
            }
        }
    }
}

Otros consejos

Puede empujar Agregar vista en la vista Detalles y configurar una variable para recordar eso. Cuando el usuario intenta abrir la vista Agregar, verifica la variable anterior y, si está configurada, aparece directamente en el controlador raíz (que debería abrir la vista de Detalles automáticamente).

Marco

Convierta la vista de adición en un modo modal y en allí proporcione un " Listo " (o " Guardar ") y " Cancelar " botón. Si el usuario pulsa cancelar, simplemente cierra el modal. Si presionan Listo, guardas el nuevo registro en el modelo de tabla, luego vuelve a cargar la tabla en la vista raíz antes de regresar. Para ser agradable, puedes flashear el nuevo elemento agregado.

Una forma limpia de configurar esto es hacer que el controlador modal implemente un delegado que espera un método de protocolo 'Hecho' y que el controlador raíz lo implemente y se establezca como el delegado.

De esta manera, se notifica al controlador raíz cuando el usuario pulsa "Listo" para que pueda encapsular todo lo que debe suceder. Si desea pasar directamente de la vista de agregar a detalle, el método de delegado puede hacer un 'empuje' para el registro recién agregado y obtendrá una transición agradable desde el deslizamiento modal hasta la vista de detalle.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top