iOS
UISplitViewController
Zoeken…
Opmerkingen
UISplitViewController
is een containerklasse zoals UITabViewController
, UINavigationController
. Het scheidt de hoofdweergave in twee View Controllers masterViewController (PrimaryViewController) en detailViewController (SecondaryViewController). we kunnen een array met twee UISplitViewController
verzenden en Apple beveelt aan naar UISplitViewController
als rootviewcontroller voor uw toepassing. Voor interactie tussen de viewcontrolers gebruik ik NSNotificationCenter
.
Hoofd- en detailweergave-interactie met gebruik van gedelegeerden in doelstelling C
UISplitViewController
moet de rootViewController van uw toepassing zijn.
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;
}
Maak gewoon een object voor de UISplitViewController
en stel die viewcontroller 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
bevindt zich altijd aan de linkerkant van het apparaat. U kunt de breedte instellen in UISplitViewCOntroller
delegatiemethoden en DetailViewController
bevindt zich aan de rechterkant van de toepassing
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;
}
Aangemaakte master en detail ViewControllers worden toegevoegd aan een array die is ingesteld op self.viewControllers
in UISplitViewController
. self.preferredDisplayMode
is de modus die is ingesteld voor het weergeven van master- en DetailViewController
Apple-documentatie voor DisplayMode . self.presentsWithGesture
maakt swipe-bewegingen 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
afgevaardigde met sendSelectedNavController:(UIViewController *)viewController
methode voor het verzenden van de UIViewController
naar de DetailViewcontroller
. Dan is in MasterViewController
de mainTableView de tableview aan de linkerkant. 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
Maak enkele UIViewControllers
en UIViewControllers
deze toe aan een array. De tabelweergave wordt geïnitialiseerd en vervolgens op de methode didSelectRowAtIndexPath
stuur ik een UIViewController
naar de DetailViewController
met detailDelegate
met de overeenkomstige 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
wordt hier gedeclareerd met het verwijderen van alle views in de DetailViewController
en het toevoegen van de doorgegeven UIViewController
uit de MasterViewController
Enkele schermafbeeldingen van de applicatie toevoegen
Bij het starten van de applicatie krijgen we MasterViewController
omdat we de preferredDisplayMode
MasterViewController
als automatisch hebben gegeven bij het vegen van het scherm, krijgen we de MasterViewController
zoals bijgevoegd in de onderstaande afbeelding, maar in de DetailViewController
modus krijgen we zowel de MasterViewController
en DetailViewController
over landschapsoriëntatie