iOS
UISplitViewController
Sök…
Anmärkningar
I iOS 8 och senare kan du använda klassen UISplitViewController på alla iOS-enheter, i tidigare versioner av iOS är klassen endast tillgänglig på iPad. UISplitViewController är en behållarklass som UITabViewController , UINavigationController . Den separerar UIViewControllers i två UIViewControllers masterViewController (PrimaryViewController) och detailViewController (SecondaryViewController). vi kan skicka en NSArray med två UIViewControllers och Apple rekommenderar UISplitViewController som rootviewcontroller för din applikation. För att interagera mellan UIViewControllers använder jag NSNotificationCenter .
Interagera mellan master och detaljvy med delegater i mål C
UISplitViewController måste UISplitViewController kontrollera i din app fönster
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;
}
UISplitVIewController bara ett objekt för din UISplitVIewController och ange det som rootViewController för din applikation.
SplitViewController.h
#import <UIKit/UIKit.h>
#import "MasterViewController.h"
#import "DetailViewController.h"
@interface ViewController : UISplitViewController
{
DetailViewController *detailVC;
MasterViewController *masterVC;
NSMutableArray *array;
}
@end
MasterViewController är en UIViewController som är inställd på vänster sida av enheten. Du kan ställa in bredden i UISplitViewController med maximumPrimaryColumnWidth och DetailViewController är på höger sida
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;
}
Master och detalj UIViewController läggs till i en NSArray som är inställd på self.viewControllers . self.preferredDisplayMode är det läge som är inställt för visning av MasterViewController och DetailViewController . self.presentsWithGesture möjliggör svepgest för att visa 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
Skapa en DetailViewDelegate delegat med sendSelectedNavController metoden för att skicka UIViewControllers till DetailViewController . Sedan MasterViewController en UITableView i UITableView . ViewControllerArray innehåller alla UIViewControllers som måste visas i 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
Skapade en del UIViewController och lade till den i en NSMutableArray . UITableView initieras sedan på didselectrowatindexpath metoden skickar jag en UIViewController till DetailViewController hjälp av detailDelegate delegat med motsvarande UIViewController i NSMutableArray som en 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 deklareras här med att ta bort alla UIView i DetailViewController och lägga till den godkända UIViewController från MasterViewController .