Поиск…


замечания

UISplitViewController - это контейнерный класс, например UITabViewController , UINavigationController . Он разделяет основной вид на два контроллера просмотра MasterViewController (PrimaryViewController) и detailViewController (SecondaryViewController). мы можем отправить массив с двумя контроллерами представлений, и Apple рекомендует использовать UISplitViewController в качестве rootviewcontroller для вашего приложения. Чтобы взаимодействовать между диспетчерами view, я использую NSNotificationCenter .

Мастер и деталь Просмотр взаимодействия с использованием делегатов в Objective C

UISplitViewController должен быть rootViewController вашего приложения.

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

Просто создайте объект для UISplitViewController и настройте этот диспетчер представлений как rootviewcontroller для вашего приложения.

SplitViewController.h

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

MasterViewController всегда находится на левой стороне устройства, где вы можете установить ширину в UISplitViewCOntroller делегатов DetailViewController а 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;
}

Созданный мастер и деталь ViewControllers добавляются в массив, который настроен на self.viewControllers в UISplitViewController . self.preferredDisplayMode - это режим, установленный для отображения основной и DetailViewController Apple Documentation для DisplayMode . self.presentsWithGesture позволяет жестом салфетки для отображения 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

Создайте делегат DetailViewDelegate с помощью sendSelectedNavController:(UIViewController *)viewController для отправки UIViewController в DetailViewcontroller . Затем в MasterViewController mainTableView является табличным представлением в левой части. ViewControllerArray содержит все UIViewControllers которые должны отображаться в 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

Создайте UIViewControllers и UIViewControllers его в массив. Представление таблицы инициализируется, затем в методе didSelectRowAtIndexPath я отправляю UIViewController в DetailViewController с помощью detailDelegate с соответствующим UIViewController в массиве в качестве параметра

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 объявляется здесь с удалением всех просмотров в DetailViewController и добавлением прошедшего UIViewController из MasterViewController

Добавление некоторых снимков экрана приложения введите описание изображения здесь

При запуске приложения мы не получаем MasterViewController так как мы предоставили preferredDisplayMode как автоматический при прокрутке экрана, мы получаем MasterViewController как MasterViewController на MasterViewController ниже, но в ландшафтном режиме мы получаем как MasterViewController и DetailViewController

введите описание изображения здесь

введите описание изображения здесь

по ориентации на ландшафт

введите описание изображения здесь введите описание изображения здесь



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow