Suche…


Bemerkungen

UISplitViewController ist eine Containerklasse wie UITabViewController , UINavigationController . Es teilt die Hauptansicht in zwei View Controller (MasterViewController) und DetailViewController (SecondaryViewController) auf. Wir können ein Array mit zwei View-Controllern senden, das Apple als Rootview-Controller für Ihre Anwendung an UISplitViewController empfiehlt. Für die Interaktion zwischen den Viewcontrollern verwende ich NSNotificationCenter .

Master- und Detailansicht-Interaktion mit Delegaten in Ziel C

UISplitViewController muss der rootViewController Ihrer Anwendung sein.

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]
self.window.backgroundColor = [UIColor blackColor];
[self.window makeKeyAndVisible];
self.window.clipsToBounds = YES;
SplitViewController *spView = [[SplitViewController alloc]init];
self.window.rootViewController = spView;
[self.window makeKeyAndVisible];
return YES;
}

Erstellen Sie einfach ein Objekt für den UISplitViewController und legen Sie diesen Viewcontroller als Rootviewcontroller für Ihre Anwendung fest.

SplitViewController.h

#import <UIKit/UIKit.h>
#import "MasterViewController.h"
#import "DetailViewController.h"
@interface ViewController : UISplitViewController
{
DetailViewController *detailVC;
MasterViewController *masterVC;
NSMutableArray *array;
}
@end

MasterViewController befindet sich immer auf der linken Seite des Geräts. Sie können die Breite in UISplitViewCOntroller Delegierungsmethoden von DetailViewController UISplitViewCOntroller DetailViewController befindet sich auf der rechten Seite der Anwendung

SplitViewController.m

#import "ViewController.h"
#define ANIMATION_LENGTH 0.3
@interface ViewController ()
@end

@implementation ViewController
- (void)viewDidLoad 
{
[super viewDidLoad];
masterVC = [[MasterViewController alloc]init];
detailVC = [[DetailViewController alloc]init];
[masterVC setDetailDelegate:(id)detailVC];
NSArray *vcArray = [NSArray arrayWithObjects:masterVC, detailVC, nil];
self.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic;
self.viewControllers = vcArray;
self.delegate = (id)self;
self.presentsWithGesture = YES;
}

Erstellte Master- und Detail-ViewControllers werden zu einem Array hinzugefügt, das in self.viewControllers auf UISplitViewController . self.preferredDisplayMode ist der Modus, der für die Anzeige der Master- und DetailViewController Apple-Dokumentation für DisplayMode eingestellt ist . self.presentsWithGesture die self.presentsWithGesture zur Anzeige des MasterViewcontroller

MasterViewController.h

#import <UIKit/UIKit.h>

@protocol DetailViewDelegate <NSObject>
@required
- (void)sendSelectedNavController:(UIViewController *)viewController;
@end

@interface MasterViewController : UIViewController
{
    UITableView *mainTableView;
    NSMutableArray *viewControllerArray;
}
@property (nonatomic, retain) id<DetailViewDelegate> detailDelegate; 
@end

Erstellen Sie einen DetailViewDelegate Delegaten mit sendSelectedNavController:(UIViewController *)viewController Methode zum Senden des UIViewController an den DetailViewcontroller . In MasterViewController die mainTableView die MasterViewController der linken Seite. Der viewControllerArray enthält alle UIViewControllers , die in DetailViewController angezeigt werden DetailViewController

MasterViewController.m

#import "MasterViewController.h"

@implementation MasterViewController
@synthesize detailDelegate;

-(void)viewDidLoad
{
[super viewDidLoad];

UIViewController *dashBoardVC = [[UIViewController alloc]init];
[dashBoardVC.view setBackgroundColor:[UIColor redColor]];
UIViewController *inventVC = [[UIViewController alloc]init];
[inventVC.view setBackgroundColor:[UIColor whiteColor]];
UIViewController *alarmVC = [[UIViewController alloc]init];
[alarmVC.view setBackgroundColor: [UIColor purpleColor]];
UIViewController *scanDeviceVC = [[UIViewController alloc]init];
[scanDeviceVC.view setBackgroundColor:[UIColor cyanColor]];
UIViewController *serverDetailVC = [[UIViewController alloc]init];
[serverDetailVC.view setBackgroundColor: [UIColor whiteColor]];
viewControllerArray = [[NSMutableArray alloc]initWithObjects:dashBoardVC,inventVC,alarmVC,scanDeviceVC,serverDetailVC,nil];
mainTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 50,self.view.frame.size.width, self.view.frame.size.height-50) style:UITableViewStylePlain];
[mainTableView setDelegate:(id)self];
[mainTableView setDataSource:(id)self];
[mainTableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
[mainTableView setScrollsToTop:NO];
[self.view addSubview:mainTableView];
}

- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 100;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:    (NSInteger)section
{
    return [viewControllerArray count];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;    //count of section
}

- (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellId = [NSString stringWithFormat:@"Cell%li%ld",(long)indexPath.section,(long)indexPath.row];
UITableViewCell *cell =[tableView   dequeueReusableCellWithIdentifier:cellId];

if (cell == nil)
{
   cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
}
[cell.contentView setBackgroundColor:[UIColor redColor]];
cell.textLabel.text =[NSString stringWithFormat:@"My VC at index %ld",(long)indexPath.row];
return cell;
}

- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [detailDelegate sendSelectedNavController:[viewControllerArray objectAtIndex:indexPath.row]];
}

@end

Erstellen Sie einige UIViewControllers und UIViewControllers Sie sie einem Array hinzu. Die Tabellenansicht wird dann auf initialisierten didSelectRowAtIndexPath Methode I einen senden UIViewController zum DetailViewController Verwendung detailDelegate mit dem entsprechenden UIViewController in Array als Parameter

DetailViewController.h

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController<UICollectionViewDelegate>
{
    UIViewController *tempNav;
}
@end

DetailViewController.m

#import "DetailViewController.h"

@implementation DetailViewController
-(void)viewDidLoad
{
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor whiteColor]];
}
-(void)sendSelectedNavController:(UIViewController *)navController
{
    NSArray *viewsToRemove = [self.view subviews];
    for (UIView *v in viewsToRemove) {
        [v removeFromSuperview];
    }
    tempNav = navController;
    [self.view addSubview:tempNav.view];
}
@end

sendSelectedNavController wird hier deklariert, indem alle Ansichten im DetailViewController und der übergebene UIViewController aus dem MasterViewController

Einige Screenshots der Anwendung hinzufügen Geben Sie hier die Bildbeschreibung ein

Beim Starten der Anwendung erhalten Sie keinen MasterViewController da wir den preferredDisplayMode als automatisch festgelegt haben. Beim Wischen des Bildschirms erhalten Sie den MasterViewController wie in der folgenden Abbildung angehängt. Im Landscape-Modus erhalten Sie jedoch den MasterViewController und den DetailViewController

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

zur Landschaftsorientierung

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow