Pregunta

Estoy haciendo una aplicación para iPad basada en UISplitViewController.Tengo un pequeño problema con el botón de la barra de herramientas cuando mi aplicación se inició en retrato.El botón para mostrar la ventana emergente no se muestra.Sin embargo, cuando giro mi iPad a horizontal y luego vuelvo a vertical, ¡se muestra el botón!

Parece que el siguiente método no se llama al iniciar (aquí es donde tengo el código que muestra el botón):

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController: (UIPopoverController *)pc

Este método no se llama cuando se inicia la aplicación, sino solo cuando hay una rotación.Lo que es aún más extraño es que hice una aplicación de prueba usando la plantilla Xcode UISplitViewController + datos centrales (que es similar a la aplicación en la que estoy trabajando y es la plantilla que usé para crear esta aplicación).En la aplicación de prueba en la que no he creado una sola línea de código, el botón se muestra cuando inicio mi aplicación en modo vertical y el método anterior también se activa al iniciar, a diferencia de mi otra aplicación.¿Alguien tuvo un problema similar?

Finalmente, no queda muy claro en la documentación de Apple si se supone que se debe llamar a este método cuando se muestra por primera vez un UISplitViewController:http://developer.apple.com/library/ios/#documentation/uikit/reference/UISplitViewControllerDelegate_protocol/Reference/Reference.html%23//apple_ref/doc/uid/TP40009454

¿Fue útil?

Solución

"Kshitiz" tiene el concepto correcto. Primero configuré el self.splitViewController.delegate = self en el método ViewDidload, que es un poco tarde para establecer esta delegación. Entonces, intenté establecer la delegación en una etapa anterior, que es un método despierto de AWAKEFROMNIB. Entonces funciona bien.

Por lo tanto, el problema es después de la vista ya cargada por ViewDidload, entonces la delegación no funcionará, funcionará algún tiempo después de algunas actividades (como rotar el iPad). Entonces, la etapa anterior que ViewDidload está despierto deMnib.

Aquí está el código que funciona:

- (void) awakeFromNib{
    [super awakeFromNib];
    self.splitViewController.delegate = self;
}

Otros consejos

¿Ha establecido un delegado SplitViewController? En general, el problema surge cuando el delegado no se establece.

Yo estaba teniendo exactamente el mismo problema y la respuesta de Martin Gunnarsson me llevó a la solución.

Antes, estaba configurando la propiedad delegada de UISplitViewController después de que la vista delegada (la vista detallada) ya se había cargado, en viewDidLoad:.En ese momento, UISplitViewController ya había enviado el mensaje inicial. splitViewController:willHideViewController:withBarButtonItem:forPopoverController: mensaje.Simplemente no había configurado al delegado lo suficientemente pronto.

La solución fue asignar el delegado en el delegado de la aplicación principal, en application:DidFinishLaunchingWithOptions:.En este caso, mi delegado estaba contenido dentro de un controlador de navegación, por lo que tuve que profundizar una capa más para obtenerlo.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
    UINavigationController *mainNavigationController = (UINavigationController *)[splitViewController.viewControllers objectAtIndex:1];
    HPMainViewController *mainViewController = [mainNavigationController.viewControllers objectAtIndex:0]; 

    splitViewController.delegate = mainViewController;
    return YES;
}

Esto también me llevó de repuesto, cuanto más ya sea que estoy trabajando en dos proyectos de iPad con SplitViewController listos para usar y el primero siempre muestra el botón 'maestro', mientras que el segundo nunca lo hizo. Comparé los puntos de venta, las relaciones y los delegados hasta que tuve los ojos cruzados, pero finalmente encontré la respuesta en el AppDelegate. Resultó que había comentado demasiado en la aplicación: DidfinishlaunchingwithOptions:, específicamente donde se establece SplitViewController.Delegate.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        splitViewController.delegate = (id)navigationController.topViewController;
    }

Agregar esto al AppDelegate le ahorra tener que subclase el SplitViewController. También intenté conectar al delegado en IB, pero por alguna razón no tendría nada de eso. Flaw de diseño del guión gráfico, en mi humilde opinión.

Estaba atrapado en esto durante bastante tiempo. Finalmente lo conseguí para funcionar. El AwakeFromnib no funcionó para mí. Las didfinishlaunchingwithoptions hicieron. Podría ser porque estoy ejecutando una consulta que poca los elementos en el controlador Popover.

Tengo el mismo problema. Mi opinión está configurada en IB, y parece que este es un problema de tiempo. El delegado de vista dividida se establece después de que la vista dividida ha notificado sobre el "cambio" de orientación inicial. Agregar la vista dividida a una salida en el delegado de la aplicación hizo que el botón apareciera en el inicio de retrato para mí, pero cuando abro la ventana emergente está vacía. Esto probablemente se puede trabajar de alguna manera, pero creo que es extraño que la vista dividida no notifique a su delegado sobre la orientación actual cuando está configurado.

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