iOS
UISplitViewController
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
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
zur Landschaftsorientierung