Domanda

Sono in una situazione del genere che ho bisogno di iniziare con un'applicazione basata su scheda e che ho bisogno di una vista suddivisa per una o più schede. Ma sembra che scissione oggetto view controller non può essere aggiunto al tabbarController. (Anche se oggetto TabBar può essere aggiunto al splitviewcontroller).

Il problema può essere consultato otherways: Ho un intero schermo nella parte sinistra Ho una vista tabella quando viene selezionato qualsiasi riga della tabella popover dovrebbe uscire indica quella riga. Ora, quando ogni riga della popover è selezionato le righe in questo popover viene a sinistra sotto la riga selezionata (solo questa riga sarebbe visibile) e un altro popover esce dalla riga selezionata. (Breadcrumb tipo di navigazione)

Credo di essere chiaro in ciò che ho spiegato. Quindi ragazzi qualche idea o arounds di lavoro?

Per favore fatemi sapere se non mi è chiaro nella mia interrogazione.

Grazie,

Madhup

È stato utile?

Soluzione 3

Ho fatto un'applicazione di esempio. e ha scoperto che possiamo fare come a livello di codice:

- (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;
    }

Spero che questo aiuti.

Altri suggerimenti

Utilizzando l'Interface Builder, creare un controller della vista divisa e un controller barra delle schede e collegarli alle prese del:

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

Nella vostra applicazione delegato didFinishLaunchingWithOption, assegnare il controller della vista divisa al controller barra delle schede:

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];

Questo creerà un controller scheda bar (con solo 1 scheda in questo caso), che viene visualizzato correttamente in tutti gli orientamenti.

Ho scritto una sottoclasse per l'UISplitViewController che ascolterà per le modifiche orientamento del dispositivo e orientare di conseguenza. Con questa classe, ora posso posizionare le viste spaccatura all'interno di un UITabBarController e ogni vista suddivisa comporterò in modo corretto in seguito a rotazione, anche se non è la scheda in primo piano. Ho implementato con successo questo TexLege ed è stato approvato per l'uso in App Store, ma la vostra situazione potrebbe essere diversa. Si prega di consultare il repository a Github.

Sentitevi liberi di forcella e modificarlo, e io sono sempre interessato a sentire commenti (o reclami) su di esso. https://github.com/grgcombs/IntelligentSplitViewController

Per consentire un tabbarcontroller apparire come una vista master per splitviewcontroller si dovrebbe riscrivere tabbarcontroller in modo che possa sostenere o orientamenti (così dicono, usando una categoria per l'UITabBarController classe)

Si veda il mio post su retrofitting controllori vista suddivisa a un'interfaccia scheda bar esistente: http://markivsblog.blogspot.com/2010/04/retrofitting-ipad-uisplitviewcontroller.html

Ho creato una sottoclasse UITabBarController che si propaga correttamente i messaggi di rotazione a tutti i UISplitViewControllers in esso contenuti. Questo mantiene lo stato interno corretta dei UISplitViewControllers. Tuttavia, uno dei metodi delegato SplitViewController non viene chiamato se lo SplitViewController non è visibile, in modo da tenere conto di questo nel controllore visione dettagliata viewWillAppear metodo. Ho confermato questo funziona in 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

DetailViewController

@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

Tieni presente che OS 3.2 fa non fornire un adeguato supporto per uno SplitView come vista TabBar.

Si può fare "lavoro" ma avrà bug - il più grande è che un cambiamento di orientamento fatta sul punto di vista di un'altra scheda spesso non propaga alla vista scheda SplitView correttamente, rendendo la vista andare strambo quando si torna ad esso (vista laterale sinistra assume lo schermo, o l'articolo barbutton è mancante, ecc).

Ho raggiunto la conclusione che devo creare il mio SplitView per l'uso in un tabBarController causa di questo problema.

Avevo sentito voci che Apple stava lavorando su una correzione ma è stato mesi e non si sono verificati gli aggiornamenti iPad OS -. Forse OS 4 per iPad affronterà lo

È possibile utilizzare IB per costruire Tabtab e modificare schede per 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;

}

Siamo riusciti ad avere un UISplitViewController all'interno di un UITabViewController su iPad con iOS5 +.

per fare una lunga storia breve: funziona:

  • fuori dalla scatola se si accetta una spaccatura anche in verticale;
  • con un po 'di lavorare, se si vuole avere la vista maestro nascosto in verticale, e farlo apparire solo su toccando un pulsante.

Il trucco nel secondo caso è quello di utilizzare l'IntelligentSplitViewController (vedi qualche post up, thanx Greg Combs), né parimenti estendere un'UISplitVC, e fare attenzione che il delegato della sottoclasse del controller SplitView è sempre un oggetto dal vivo.

Abbiamo dettagliato il processo su:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top