2010-05-03 21 views
43

Normalmente creo mis proyectos sin material IB. Lo primero que hago es quitar todas las referencias a xibs, enchufes actualizados plist, etc. y así sucesivamente. Sin problemas, funciona muy bien (en mi mundo)!UISplitViewController programáticamente sin nib/xib

Ahora, acabo de instalar 3.2 y traté de desarrollar mi primera aplicación para iPad. Siguiendo el mismo procedimiento que antes, creé un proyecto de aplicación basado en UISplitView y quité todas las cosas de IB. Además, seguí la sección en documentos de referencia de Apple: Creating a Split View Controller Programmatically, pero, sin embargo, nunca se muestra la vista maestra, solo la vista de detalles es (sin importar cuál es la orientación). Realmente he tratado de analizarlo cuidadosamente, pero no puedo entender lo que me he perdido.

¿Hay algún ejemplo funcional de UISplitViewController sin las puntas flotando por ahí? Busqué en Google pero no pude encontrar ninguno. ¿O sabes lo que probablemente me he perdido?

+8

"Normalmente creo mis proyectos sin IB-cosas". <- +1 por eso. Esa es la forma en que funciona la programación, yo también lo hago. ¡Rock! –

Respuesta

55

Declare su splitviewcontroller en su cabecera delegado, usar algo como esto en su didfinishlaunching

asegurar agrega el UISplitViewControllerDelegate en el fichero de cabecera detailedViewController y que dispone de los métodos de delegado también. recuerde que debe importar archivos de cabecera relevantes

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  

    splitViewController = [[UISplitViewController alloc] init]; 

    rootViewController *root = [[rootViewController alloc] init]; 
    detailedViewController *detail = [[detailedViewController alloc] init]; 

    UINavigationController *rootNav = [[UINavigationController alloc] initWithRootViewController:root]; 

    UINavigationController *detailNav = [[UINavigationController alloc] initWithRootViewController:detail]; 

    splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, detailNav, nil]; 
    splitViewController.delegate = detail; 

    [window addSubview:splitViewController.view]; 

EDITAR - según excelente sugerencia de Scott a continuación, no añada a la subvista ventanas, en lugar

[self.window setRootViewController:(UIViewController*)splitViewController]; // that's the ticket 
    [window makeKeyAndVisible]; 
    return YES; 
} 


//detailedView delegate methods 
- (void)splitViewController:(UISplitViewController*)svc 
    willHideViewController:(UIViewController *)aViewController 
      withBarButtonItem:(UIBarButtonItem*)barButtonItem 
     forPopoverController:(UIPopoverController*)pc 
{ 
    [barButtonItem setTitle:@"your title"]; 



    self.navigationItem.leftBarButtonItem = barButtonItem; 
} 


- (void)splitViewController:(UISplitViewController*)svc 
    willShowViewController:(UIViewController *)aViewController 
    invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem 
{ 
    self.navigationItem.leftBarButtonItem = nil; 
} 

Yo también prefiero código para IB ;-)

+5

Esta respuesta es exactamente lo que he estado buscando. Una pregunta: en el código de ejemplo de referencia de Apple (http://developer.apple.com/library/ios/ipad/#samplecode/MultipleDetailViews/Listings/Classes_RootViewController_m.html), manejan el delegado UiSplitviewcontroller en el controlador de la vista raíz. Usted lo maneja en el controlador detallado en su lugar. ¿Hay alguna razón para una forma u otra? –

+0

El controlador que se convierte en delegado depende de usted. Si sientes que el 'detailViewController' va a * mandar * al' rootViewController' que está completamente bien :). Aunque en ese caso es probable que desee cambiar el nombre de las variables a algo que se adapte a su diseño (por ejemplo, 'listViewController' y' mainViewController' para 'rootViewController' y' detailedViewController' respectivamente) – nacho4d

22

Hilo antiguo, pero pensé que ahorraría tiempo de lector + dolor cuando la técnica anterior no produce un UISplitViewController que responda correctamente a los eventos de cambio de orientación del dispositivo. Tendrá que:

  1. asegurar que todos los puntos de vista subordinados responden adecuadamente en shouldAutorotateToInterfaceOrientation. Nada nuevo aquí.
  2. En lugar de añadir la opinión de la UISplitViewController a la ventana principal,

    [window addSubview:splitViewController.view]; // don't do this 
    

    en lugar de referencia del controlador de la raíz de la ventana principal para la UISplitViewController:

    [self.window setRootViewController:(UIViewController*)splitViewController]; // that's the ticket 
    

Adición de vista de la splitviewcontroller como subvista de la ventana principal (apenas) le permite co-presentar con vistas de hermanos, pero no vuela con el caso de uso previsto de UISplitViewController. Un UISplitViewController es una vista de highlander; solo puede haber un.

3

Acabo de encontrarme con el mismo problema. asegúrese de que su hijo ViewController of splitview pueda Autorrotar a la orientación de la interfaz.

puede cambiar la función en su childViewController así:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

continuación, se mostrará la vista principal.

+1

¡Te amo! Mi problema resuelto! – mineschan

Cuestiones relacionadas