2012-09-04 30 views
14

Estoy volviendo a formular por completo esta pregunta después de haber aprendido que originalmente estaba fuera de la pista pero que no tenía más cerca de resolver el problema. Con referencia a esta imagen ... storyboard illustrationCómo compartir una escena del storyboard entre varios UIViewControllers

Estoy queriendo crear o manipular el segue (resaltado en amarillo) en el código de tal manera que la vista Patrón es uno cualquiera de un cierto número de subclases de MFMasterViewController (resaltado en rojo)

Al hacer esto usando Semillas que podría crear una plumilla, SharedNib.xib & establezca la clase como MFMasterViewController, a continuación, crear mis subclases, por ejemplo MFMasterViewControllerSubclassA, etc. MFMasterViewControllerSubclassB & continuación, crear una instancia de la subclase I lo que quería utilizar ...

MFMasterViewControllerSubclassA *controller = [[MFMasterViewControllerSubclassA alloc] initWithNibName:@"SharedNib" bundle:nil]; 

o ...

MFMasterViewControllerSubclassB *controller = [[MFMasterViewControllerSubclassB alloc] initWithNibName:@"SharedNib" bundle:nil]; 

etc.

¿Alguna pista sobre cómo puedo hacer esto bien usando storyboards?

En mi caso, el motivo para querer hacer esto es que todos mis subclases son los mismos datos tableview & pero ordenados de manera diferente & tener alguna diferencia en lo que está escrito en el texto detalle de los cels. Sospecho que es un patrón no raro.

Saludos & TIA, Pedro :)

+0

Soy consciente de que podría hacer esto al hacer en mi guión gráfico una copia de la escena para cada subclase, pero parece una manera bastante derrochadora de hacerlo cuando la escena es exactamente igual y todas las versiones siguen igual. escena. – Pedro

+0

Así es el controlador en el guión gráfico asignado a la clase 'MyViewController' y es 'MyViewControllerSubclass' una subclase de' MyViewController' –

+0

Sí a ambas preguntas :) – Pedro

Respuesta

5

No es una respuesta directa, pero esta es la manera en que lograría lo que desea en función de su explicación del motivo.

Básicamente necesita separar el UITableViewDataSource (y tal vez también el delegado) del MFMasterViewController para que cuando se ejecute el segue pueda establecer el dataSource correcto y delegar en el controlador de vista.

Por lo tanto, en el Controlador de navegación debe implementar el método prepareForSegue:sender:. Aquí es donde puede personalizar la segue antes de ser ejecutado:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    // you can set the segue identifier using Interface Builder 
    // also it is a good thing to make sure which segue you're using 
    if (([segue identifier] isEqualToString:@"TheId"]) { 
     id<UITableViewDataSource> dataSource = [[TableViewDataSourceImplementationA alloc] init]; 
     [[[segue destinationViewController] tableView] setDataSource:dataSource]; 
    } 
} 

De esta manera se puede obtener la personalización que desee sin la necesidad de crear subclases de su controlador de vista.

Y si tiene acceso a videos WWDC, verifique la sesión # 407 Adoptando guiones gráficos en su aplicación.

1

Si el archivo .m no está asociado con ningún guión, ¿no self.storyboard ser nulo?

UIStoryboard *storyboard = [UIStoryboard storyboardWithName: 
            @"MainStoryboard" bundle:[NSBundle mainBundle]]; 
    ViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HauptMenu"]; 

Asegúrate de cambiar el guión gráfico: por lo que sea que se llame tu guión gráfico.

NSString * storyBoardName; 
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    storyBoardName = @"MainStoryboard_iPad"; 
} else { 
    storyBoardName = @"MainStoryboard_iPhone"; 
} 
UIStoryboard *storyboard = [UIStoryboard storyboardWithName: 
            storyBoardName bundle:[NSBundle mainBundle]]; 
ViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HauptMenu"]; 
+0

La clase que he llamado MyViewController en mi ejemplo pertenece a la escena en mi guión gráfico y los primeros 2 ejemplos de código en mi trabajo de preguntas. MyViewControllerSubclass es una subclase de MyViewController pero el código que invoca es el que falla. – Pedro

+0

- (id) initWithIdentifier: (NSString *) origen del identificador: (UIViewController *) origen destino: (UIViewController *) destino { UIStoryboard * storyBoard = [UIStoryboard storyboardWithName: @ "MainStoryboard_iPhone" paquete: nil]; UIViewController * viewController = [storyBoard instantiateViewControllerWithIdentifier: @ "testIdentifier"]; // MyViewController * viewController = [[MyViewController alloc] initWithNibName: @ "MyViewController" paquete: nil]; return [super initWithIdentifier: identifier source: source destination: viewController]; } – prashant

3

Para cualquier persona que se tropiece con esta pregunta, también debe considerar más generalmente el uso de un patrón de "Estrategia" como alternativa a la subclasificación de su controlador. La respuesta aceptada es una forma de eso, donde la estrategia implementada proviene de lo que sea la fuente de datos/delegado, y se puede cambiar en el tiempo de ejecución.Otro ejemplo de esto es https://stackoverflow.com/a/17381927/954643

1

Creo que finalmente encontré la respuesta. Queremos usar el guión gráfico ViewController con otro nombre de clase. Hay muchas soluciones alternativas como el uso de delegados, pero creo que este es el mejor. Ya lo respondí en otro tema. ¡Espero eso ayude! https://stackoverflow.com/a/32103618/1943053

Cuestiones relacionadas