Pergunta

Estou em uma espécie de situação que preciso começar com um aplicativo baseado em guia e, na medida em que preciso de uma exibição dividida para uma ou mais guias. Mas parece que o objeto Split View Controller não pode ser adicionado ao TabBarController. (Embora o objeto TabBar possa ser adicionado ao SplitViewController).

O problema pode ser visto de outra maneira: tenho uma tela cheia na parte esquerda, tenho uma visualização de tabela quando qualquer linha é selecionada na tabela, uma popover deve sair apontando essa linha. Agora, quando qualquer linha no popover for selecionada, as linhas nesse popover chegar à esquerda sob a linha selecionada (somente essa linha seria visível) e outra popover sai da linha selecionada. (Tipo de navegação de navegação)

Acho que estou claro no que expliquei. Então, caras, alguma idéia ou trabalho por aí?

Por favor, deixe -me saber se não estou claro na minha pergunta.

Obrigado,

Madhup

Foi útil?

Solução 3

Eu fiz um aplicativo de amostra. e descobri que podemos fazer isso programaticamente como:

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

        NSMutableArray *array = [NSMutableArray array];

        NSMutableArray *tabArray = [NSMutableArray array]; 

        UISplitViewController *splitViewConntroller = [[UISplitViewController alloc] init];

        MainViewController *viewCont = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];

        viewCont = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];




        [splitViewConntroller setViewControllers:array];

        [tabArray addObject:splitViewConntroller];

        [splitViewConntroller release];

        array = [NSMutableArray array];

        splitViewConntroller = [[UISplitViewController alloc] init];

        viewCont = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];

        viewCont = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];

        [splitViewConntroller setViewControllers:array];

        [tabArray addObject:splitViewConntroller];

        [splitViewConntroller release];

        // Add the tab bar controller's current view as a subview of the window
        [tabBarController setViewControllers:tabArray];

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

        return YES;
    }

Espero que isto ajude.

Outras dicas

Usando o construtor de interface, crie um controlador de exibição dividida e um controlador de barra de guias e vincule -os às suas saídas:

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

No seu delegado de aplicativo didFinishLaunchingWithOption, atribua seu controlador de visualização dividida ao controlador da barra de guias:

splitViewController.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Title" image:nil tag:0] autorelease];
NSArray *controllers = [NSArray arrayWithObjects:splitViewController,  /* other controllers go here */ nil];
tabBarController.viewControllers = controllers;
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];

Isso criará um controlador de barra de guia (com apenas 1 guia neste caso), que é exibido corretamente em todas as orientações.

Eu escrevi uma subclasse para o UISPlitViewController que ouvirá alterações na orientação do dispositivo e se orientará de acordo. Com esta classe, agora posso colocar vistas divididas em um uitabbarcontroller e cada visualização dividida se comportará corretamente após a rotação, mesmo que não seja a guia frontal. Eu implantei com sucesso isso em Texlege E foi aprovado para uso na App Store, mas sua milhagem pode variar. Por favor, consulte o repositório no Github.

Sinta -se à vontade para bifurcar e modificá -lo, e estou sempre interessado em ouvir comentários (ou reclamações) sobre isso. https://github.com/grgcombs/IntelligentsplitViewController

Para deixar um TabBarController aparecer como uma visualização principal do SplitViewController, você deve reescrever tabbarcontroller para que ele apoie ou orientações (assim, digamos, usando uma categoria para a classe uitabbarcontroller)

Veja minha postagem sobre a adaptação controladores de exibição dividida para uma interface de barra de guias existente: http://markivsblog.blogspot.com/2010/04/retofitting-ipad-uisplitviewcontroller.html

Criei uma subclasse UitabBarController que propaga corretamente as mensagens de rotação para todos os uisplitViewControllers que ele contém. Isso mantém o estado interno correto dos uisplitViewControllers. No entanto, um dos métodos de delegado SplitViewController não é chamado se o SplitViewController não estiver visível; portanto, explico isso no método ViewWillappear do controlador ViewWillappear. Eu confirmei que isso funciona no iOS5.0 - iOS6.1

OSTABBARCONTROLLER.M

#import "OSTabBarController.h"

@implementation OSTabBarController

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    for(UIViewController *targetController in self.viewControllers){
        if(targetController != self.selectedViewController && [targetController isKindOfClass:[UISplitViewController class]]){
            [targetController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
        }
    }
}

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    for(UIViewController *targetController in self.viewControllers){
        if(targetController != self.selectedViewController && [targetController isKindOfClass:[UISplitViewController class]]){
            [targetController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
        }
    }
}

@end

DetalheViewController

@implementation OSDetailViewController

-(void)viewWillAppear:(BOOL)animated{
    //the splitViewController:willHideViewController:withBarButtonItem:forPopoverController: may not have been called
    if(!UIInterfaceOrientationIsPortrait(self.interfaceOrientation)){
        self.navigationItem.leftBarButtonItem = nil;
    }
}

#pragma mark - UISplitViewControllerDelegate Methods

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];

}

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    [self.navigationItem setLeftBarButtonItem:nil animated:YES];
}

@end

Lembre -se de que o OS 3.2 faz não fornecer suporte adequado Para uma View SplitView como uma exibição TabBar.

Você pode fazê -lo "funcionar", mas terá bugs - o maior é que uma mudança de orientação feita na visualização de outra guia geralmente não se propaga para a guia SplitView View corretamente, fazendo a vista ficar maluca quando você voltar para ela (lado esquerdo A visualização assume a tela, ou o item Barbutton está ausente, etc.).

Cheguei à conclusão de que tenho que criar meu próprio SplitView para uso em um TabBarController por causa desse problema.

Eu tinha ouvido rumores de que a Apple estava trabalhando em uma correção, mas já faz meses e nenhuma atualização do IPAD OS ocorreu - talvez o OS 4 para o iPad o abordará.

Você pode usar o IB para criar o TABTAB e modificar as guias para SplitViewController.

-(void) makeSplitViewController {
NSMutableArray *controllers = [NSMutableArray arrayWithArray:tabBarController.viewControllers];
int index = 0;

for (UIViewController *controller in tabBarController.viewControllers) {
    if ([controller.tabBarItem.title isEqualToString:@"Stock"]) {
        stockDetailController = [[StockDetailController alloc] initWithNibName:@"StockDetailController" bundle:nil];

        stockMasterController = [[StockMasterController alloc] initWithStyle:UITableViewStylePlain]; 
        stockMasterController.navigationItem.title = date;
        stockMasterController.stockDetailController = stockDetailController;

        UINavigationController *nav = [[[UINavigationController alloc] initWithRootViewController:stockMasterController] autorelease];

        splitViewController = [[UISplitViewController alloc] init];
        splitViewController.tabBarItem = controller.tabBarItem;
        splitViewController.viewControllers = [NSArray arrayWithObjects:nav, stockDetailController, nil];
        splitViewController.delegate = stockDetailController;

        [controllers replaceObjectAtIndex:index withObject:splitViewController];
    }

    index++;
}

tabBarController.viewControllers = controllers;

}

Conseguimos ter um uisplitviewController dentro de um uitabviewController no iPad com iOS5+.

Para encurtar uma longa história: funciona:

  • fora da caixa se você aceitar uma divisão também em retrato;
  • Com um pouco de trabalho, se você quiser ter a visualização mestre escondida em retrato e, apareça apenas ao tocar em um botão.

O truque no segundo caso é usar o IntelligentsPlitViewController (consulte algumas postagens, Thanx Greg Combs) ou estender -se da mesma forma um UISPLITVC e tenha cuidado para que o delegado da subclasse do controlador SplitView seja sempre um objeto vivo.

Detalhamos o processo em:

https://devforums.apple.com/message/763572#763572

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top