iOS
UISplitViewController
Zoeken…
Opmerkingen
In iOS 8 en hoger kunt u de klasse UISplitViewController
op alle iOS-apparaten gebruiken. In eerdere versies van iOS is de klasse alleen beschikbaar op iPad. UISplitViewController
is een containerklasse zoals UITabViewController
, UINavigationController
. Het scheidt de hoofdweergave in twee UIViewControllers
masterViewController
(PrimaryViewController) en detailViewController
(SecondaryViewController). we kunnen een NSArray
verzenden met twee UIViewControllers
en Apple beveelt UISplitViewController
als rootviewcontroller voor uw toepassing. Voor interactie tussen de UIViewControllers
gebruik ik NSNotificationCenter
.
Interactie tussen hoofd- en detailweergave met behulp van gedelegeerden in doelstelling C
UISplitViewController
moet de UISplitViewController
van het venster van uw app gebruiken
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
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;
}
Maak gewoon een object voor uw UISplitVIewController
en stel dit in als rootViewController voor uw toepassing.
SplitViewController.h
#import <UIKit/UIKit.h>
#import "MasterViewController.h"
#import "DetailViewController.h"
@interface ViewController : UISplitViewController
{
DetailViewController *detailVC;
MasterViewController *masterVC;
NSMutableArray *array;
}
@end
MasterViewController
is een UIViewController
die aan de linkerkant van het apparaat is ingesteld. U kunt de breedte in UISplitViewController
met behulp van maximumPrimaryColumnWidth
en DetailViewController
bevindt zich aan de rechterkant
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;
}
De master en detail UIViewController
's zijn toegevoegd aan een NSArray
die is ingesteld op self.viewControllers
. self.preferredDisplayMode
is de modus die is ingesteld voor het weergeven van MasterViewController
en DetailViewController
. self.presentsWithGesture
maakt een veegbeweging mogelijk voor weergave van 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
Maak een DetailViewDelegate
Delegate Delegate met de methode sendSelectedNavController
voor het verzenden van de UIViewControllers
naar de DetailViewController
. Vervolgens wordt in MasterViewController
een UITableView
gemaakt. De ViewControllerArray
bevat alle UIViewControllers
die moeten worden weergegeven in 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
Enkele UIViewController
en toegevoegd aan een NSMutableArray
. De UITableView
wordt geïnitialiseerd en vervolgens op de methode didselectrowatindexpath
stuur ik een UIViewController
naar de DetailViewController
met behulp van detailDelegate
delegate met de overeenkomstige UIViewController
in de NSMutableArray
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
De sendSelectedNavController
wordt hier gedeclareerd met het verwijderen van alle UIView
's in de DetailViewController
en het toevoegen van de doorgegeven UIViewController
uit de MasterViewController
.