Suche…


Bemerkungen

In iOS 8 und höher können Sie die UISplitViewController Klasse auf allen iOS-Geräten verwenden. In früheren Versionen von iOS ist die Klasse nur auf dem iPad verfügbar. UISplitViewController ist eine Containerklasse wie UITabViewController , UINavigationController . Sie UIViewControllers die Hauptansicht in zwei UIViewControllers masterViewController (PrimaryViewController) und detailViewController (SecondaryViewController). Wir können einen NSArray mit zwei UIViewControllers und Apple empfiehlt UISplitViewController als Rootviewcontroller für Ihre Anwendung. Für die Interaktion zwischen den UIViewControllers ich NSNotificationCenter .

Interaktion zwischen Master- und Detailansicht mithilfe von Delegierten in Ziel C

UISplitViewController muss den Root-View-Controller des App-Fensters verwenden

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;
}

Erstellen Sie UISplitVIewController ein Objekt für Ihren UISplitVIewController und legen Sie es 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 ist ein UIViewController , der auf der linken Seite des Geräts eingestellt wird. Sie können die Breite in UISplitViewController mithilfe von maximumPrimaryColumnWidth und DetailViewController auf der rechten Seite DetailViewController

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;
}

Die Master - und Detail - UIViewController 's werden zu einem NSArray hinzugefügt, der auf self.viewControllers . self.preferredDisplayMode ist der Modus zur Anzeige von MasterViewController und DetailViewController . self.presentsWithGesture die self.presentsWithGesture zur Anzeige von 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 der sendSelectedNavController Methode, um die UIViewControllers an den DetailViewController zu DetailViewController . In MasterViewController eine UITableView erstellt. 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

Erstellt einige UIViewController und fügt sie einem NSMutableArray . Die UITableView initialisiert dann auf didselectrowatindexpath Methode I einen senden UIViewController zum DetailViewController Verwendung detailDelegate Delegierten mit dem entsprechenden UIViewController im 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

Der sendSelectedNavController wird hier deklariert, indem alle UIView im DetailViewController und der übergebene UIViewController aus dem MasterViewController .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow