Szukaj…


Uwagi

UISplitViewController to klasa kontenerów takich jak UITabViewController , UINavigationController . Dzieli widok główny na dwa kontrolery widoku masterViewController (PrimaryViewController) i detailViewController (SecondaryViewController). możemy wysłać tablicę z dwoma kontrolerami widoku, a Apple zaleca UISplitViewController jako kontroler rootview dla twojej aplikacji. Do interakcji między NSNotificationCenter widoku używam NSNotificationCenter .

Interakcja Master i Detail View przy użyciu Delegatów w Celu C

UISplitViewController musi być UISplitViewController twojej aplikacji.

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

Wystarczy utworzyć obiekt dla UISplitViewController i ustawić ten kontroler widoku jako kontroler rootview dla aplikacji.

SplitViewController.h

#import <UIKit/UIKit.h>
#import "MasterViewController.h"
#import "DetailViewController.h"
@interface ViewController : UISplitViewController
{
DetailViewController *detailVC;
MasterViewController *masterVC;
NSMutableArray *array;
}
@end

MasterViewController jest zawsze po lewej stronie urządzenia, możesz ustawić szerokość w UISplitViewCOntroller delegowania UISplitViewCOntroller , a DetailViewController znajduje się po prawej stronie aplikacji

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

Utworzony wzorzec i szczegóły ViewControllers są dodawane do tablicy ustawionej na self.viewControllers w UISplitViewController . self.preferredDisplayMode to zestaw trybów wyświetlania dokumentacji głównej i DetailViewController Apple dla DisplayMode . self.presentsWithGesture umożliwia gest machnięcia w celu wyświetlenia 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

Utwórz delegata DetailViewDelegate pomocą sendSelectedNavController:(UIViewController *)viewController metoda UIViewController do wysyłania UIViewController do DetailViewcontroller . Następnie w MasterViewController mainTableView jest widokiem tabeli po lewej stronie. UIViewControllers zawiera wszystkie UIViewControllers które muszą być wyświetlane w 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

Utwórz niektóre UIViewControllers i UIViewControllers go do tablicy. Widok tabeli jest inicjowany, a następnie metodą didSelectRowAtIndexPath wysyłam UIViewController do DetailViewController za pomocą detailDelegate z odpowiednim UIViewController w tablicy jako parametr

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 jest zadeklarowany tutaj poprzez usunięcie wszystkich widoków w DetailViewController i dodanie przekazanego UIViewController z MasterViewController

Dodanie zrzutów ekranu aplikacji wprowadź opis zdjęcia tutaj

Po uruchomieniu aplikacji nie otrzymujemy MasterViewController ponieważ MasterViewController preferredDisplayMode MasterViewController wyświetlania jako automatyczny po przesunięciu ekranu, otrzymujemy MasterViewController jak załączony na poniższym obrazku, ale w trybie MasterViewController otrzymujemy zarówno MasterViewController i DetailViewController

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

w sprawie orientacji poziomej

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow