在DetailView中使用多个ViewControllers的UISplitView(故事板)

时间:2014-03-17 18:55:26

标签: ios uisplitviewcontroller xcode-storyboard detailview uisplitview

我正在寻找一个解决方案,在DetailView(UISplitView的右视图)中有一个带有多个ViewControllers的UISplitView。

苹果的例子工作正常,但使用nib文件而不是故事板。 (https://developer.apple.com/library/ios/samplecode/multipledetailviews/Listings/ReadMe_txt.html

我找到了另一个例子但是当我实现UITableView时有空格 http://www.dharmaworks.net/Consulting/switching-detail-views-in-uisplitviewcontroller-with-ios7

1 个答案:

答案 0 :(得分:0)

在寻找答案的过程中,我发现很多人都有同样的问题。我自己想出来,所以这是我的解决方案。我希望它对其他人有用。

第1步。创建一个SplitViewController项目。如果你有一个项目已经跳过这一步;) enter image description here

第2步。 添加两个不同的viewControllers。在这种情况下,我称他们为AbcViewController和XyzViewController。 enter image description here enter image description here

第3步。 转到ipad故事板,从故事板中删除DetailViewController。然后添加两个新的viewControllers。

enter image description here

第4步。 为viewControllers设置类和Storyboard ID。 enter image description here

第5步。 转到MasterViewController.h并用下面的代码替换代码。

#import <UIKit/UIKit.h>

@class AbcViewController;
@class XyzViewController;

@interface MasterViewController : UITableViewController

@property (strong, nonatomic) AbcViewController *abcViewController;
@property (strong, nonatomic) XyzViewController *xyzViewController;

@end

第6步。 现在转到MasterViewController.m文件并替换为以下代码:

注意:如果您有现有项目且不想替换,请使用步骤7中的代码。

#import "MasterViewController.h"
#import "DetailViewController.h"

@interface MasterViewController () {
    NSMutableArray *_objects;
}
@end

@implementation MasterViewController

- (void)awakeFromNib
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        self.clearsSelectionOnViewWillAppear = NO;
        self.preferredContentSize = CGSizeMake(320.0, 600.0);
    }
    [super awakeFromNib];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.detailViewController = (DetailViewController*)[[self.splitViewController.viewControllers lastObject] topViewController];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table View

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 2;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    if (indexPath.row == 0) {
        cell.textLabel.text = @"ABC";
    }
    if (indexPath.row == 1) {
        cell.textLabel.text = @"XYZ";
    }

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.abcViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"ABC"];
    self.xyzViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"XYZ"];
    if (indexPath.row == 0) {
        NSArray *newVCs = [NSArray arrayWithObjects:[[[self splitViewController ] viewControllers ] firstObject ] , self.abcViewController, nil];
        self.splitViewController.viewControllers = newVCs;
    }
    if (indexPath.row == 1) {
        NSArray *newVCs = [NSArray arrayWithObjects:[[[self splitViewController ] viewControllers ] firstObject ] , self.xyzViewController, nil];
        self.splitViewController.viewControllers = newVCs;
    }
}

@end

第7步。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        self.abcViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"ABC"];
        self.xyzViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"XYZ"];

        if (indexPath.row == 0) {
            NSArray *newVCs = [NSArray arrayWithObjects:[[[self splitViewController ] viewControllers ] firstObject ] , self.abcViewController, nil];
            self.splitViewController.viewControllers = newVCs;
        }
        if (indexPath.row == 1) {
            NSArray *newVCs = [NSArray arrayWithObjects:[[[self splitViewController ] viewControllers ] firstObject ] , self.xyzViewController, nil];
            self.splitViewController.viewControllers = newVCs;
        }
    }

多数民众赞成,运行您的项目并享受:)