7

Tengo una tabBarController que agrego colocando el código siguiente en:iPhone - presentModalViewController través UITabBarItem y dismissModalViewController limpiamente

AppDelegate.h:

... 
    UITabBarController IBOutlet *tabBarController; 
} 

@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController; 

AppDelegate.m:

... 
    [self.window addSubview:tabBarController.view]; 
    [self.window makeKeyAndVisible]; 
    [tabBarController setDelegate:self]; 

Luego uso el siguiente código para presentar un código de barras de exploración modal Vista Controlador:

- (void)tabBarController:(UITabBarController *)tbc didSelectViewController:(UIViewController *)vc { 
     // Middle tab bar item in question. 
     if (vc == [tabBarController.viewControllers objectAtIndex:2]) { 
      ScanVC *scanView = [[ScanVC alloc] initWithNibName:@"ScanViewController" bundle:nil]; 

      // set properties of scanView's ivars, etc 

      UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:scanView]; 

      [tabBarController presentModalViewController:navigationController animated:YES]; 
      [navigationController release]; 
      [scanView release]; 
     } 
    } 

cuando en realidad se vuelve a presentar Creo que este método no es atractivo a la vista, porque cuando me despido de la vista modal soy llevado volver a una vista vacía

Muchas aplicaciones de escaneo de códigos de barras o aplicaciones que simplemente muestran un selector de imágenes, por ejemplo; haz esto con bastante éxito Me pregunto qué tipo de implementación usarían para lograr tal efecto.

Esta es una captura de pantalla de una aplicación llamada Path , que tiene la misma funcionalidad exacta que busco:

alt text

también me di cuenta de que en estas aplicaciones, si usted está en cualquier otra elemento de la barra de pestañas que no sea el del medio, digamos, y haga clic en el elemento de la barra de pestañas que presenta la vista modal, una vez que se descarta, no los devuelve a una vista vacía, se descarta como normal, sin embargo, la pestaña actual el elemento de barra que presenta la vista modal nunca se selecciona. Estaría satisfecho con este tipo de funcionalidad si esa es la única forma de implementar este tipo de efecto.

Cualquier ayuda sería muy apreciada ya que he estado atrapado en esto por bastante tiempo. Además, ni siquiera estoy seguro de si es la manera correcta de poner todo este código en mi AppDelegate para que View Controller se presente como un modal. Todo parece, simplemente, mal.

+1

Creo que encontrará que la aplicación Path está utilizando su propia implementación de controlador de la barra de pestañas. es decir, no el 'UITabBarController' de Cocoa Touch – ohhorob

Respuesta

1

No debe presentar una vista modal cuando el usuario hace clic en un elemento de la barra de pestañas.

En su lugar, podría presentar una vista modal desde una vista presentada por una de las pestañas.

O, si solo tiene una vista principal única y la vista de escaneo que desea presentar de forma modal, debe simplemente usar un botón para presentar la vista escaneada desde su vista principal. Por ejemplo, podría usar una barra de herramientas con un solo botón.

+0

Eche un vistazo a aplicaciones como Path y Stickybits para la funcionalidad que estoy buscando. – fuzz

+0

Ver la captura de pantalla anterior en mi pregunta original. – fuzz

2

Cuando se cierra el controlador de vista modal, decir la barra de pestañas para seleccionar cualquier pestaña fue originalmente seleccionado .

- (void)dismissModalViewControllerAnimated:(BOOL)animated 
    { 
     // do whatever you need to do when dismissing 

     // savedTabIndex is an int ivar 
     // tabBarController is a reference, set when showing the modal view 
     [[self tabBarController] setSelectedIndex:savedTabIndex]; 
    } 

Usted tendría que salvar a la selección original barra de pestañas en una variable al inicio del tabBarController:didSelectViewController:.

- (void)tabBarController:(UITabBarController *)tbc 
didSelectViewController:(UIViewController *)vc 
{ 
    // Save the tab bar index (if it's not the photo tab) 
    if ([tabBarController selectedIndex] != 3]) { 
     savedTabIndex = [tabBarController selectedIndex]; 
    } 
} 

Puede haber errores en este código, simplemente lo escribí sin probar.

+0

Nota: no olvide incluir el UITabBarControllerDelegate :) – rckehoe

1

Encontré una solución realmente fácil jugando alrededor de UITabBarControllerDelegate --Sin embargo, probé esto en iOS 7.

Primero, la subclase UITabBarController, hágalo suyo UITabBarControllerDelegate y cree una propiedad que contenga una referencia a la pestaña con la que desea iniciar un modal. En mi aplicación, se llama pestaña "Vender".

@property (strong, nonatomic) UIViewController *sellTab; 

Luego, en el método de init, simplemente cree que controlador de vista y añadirlo a las pestañas.

_sellTab = [[UIViewController alloc] init]; 
_sellTab.title = @"Sell"; 
self.viewControllers = @[homeTab, historyTab, _sellTab, bookmarksTab, profileTab]; 

Ahora aquí está donde está la magia: anule los siguientes métodos de delegado del controlador de la barra de pestañas. El código es bastante autoexplicativo.

#pragma mark - Tab bar controller delegate 

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 
{ 
    return viewController != self.sellTab; 
} 

- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item 
{ 
    if (item == self.sellTab.tabBarItem) { 
     [self presentViewController:[[UINavigationController alloc] initWithRootViewController:[[PostAdViewController alloc] init]] animated:YES completion:nil]; 
    } 
} 

Esto pondrá en marcha un modal, en caso de despido, muestra la misma pestaña que estaba antes de su lanzamiento.

Cuestiones relacionadas