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



