0

我尝试在我的应用程序中实现自适应 UI。通过UISplitViewController作为 rootview 控制器,我也可以在 iPad 上运行 iPhone 的代码。

我红了苹果的文档UISplitViewController一些示例。所有人都在使用故事板,示例代码仅在 swift 中可用。我找不到代码的工作版本。所以我自己开始了代码。

查看我的 splitview 控制器类 ( BaseSplitViewController)

BaseSplitViewController.h:

#import <UIKit/UIKit.h>

@interface BaseSplitViewController : UISplitViewController <UISplitViewControllerDelegate>

@end

BaseSplitViewController.m:

#import "BaseSplitViewController.h"
#import "TabBarViewController.h"

@interface BaseSplitViewController ()

@property(nonatomic, strong) TabBarViewController *primaryTabBarVC;
@property(nonatomic, strong) UINavigationController *primaryNavigationController;
@property(nonatomic, strong) UINavigationController *secondaryNavigationController;

@end


@implementation BaseSplitViewController

- (instancetype)init
{
    self = [super init];

    if (self)
    {
        [self setViewControllers:@[self.primaryNavigationController, self.secondaryNavigationController]];    
        self.delegate = self;
        self.preferredDisplayMode = UISplitViewControllerDisplayModeAutomatic;
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cellTapped:) name:@"cellTapped" object:nil];
    }

    return self;
}


- (void)viewDidLoad
{
    [super viewDidLoad];
    [self assignPrimaryViewController];
}


- (void)assignPrimaryViewController
{
     // Need to assign tab bar controller as primary view controller here
}


- (void)assignSecondaryViewController:(UIViewController *)vc
{
     // Need to update the secondary controller each time the primary controller was tapped
}


- (UINavigationController *)primaryNavigationController
{
    if (!_primaryNavigationController)
    {
        _primaryNavigationController = [[UINavigationController alloc] init];
    }

    return _primaryNavigationController;
}


- (UINavigationController *)secondaryNavigationController
{
    if (!_secondaryNavigationController)
    {
        _secondaryNavigationController = [[UINavigationController alloc] init];
    }

    return _secondaryNavigationController;
}


- (UITabBarController *)primaryTabBarVC
{
    if (!_primaryTabBarVC)
    {
        _primaryTabBarVC = [[TabBarViewController alloc] init];
    }

    return _primaryTabBarVC;
}

@end

几点:

  • 上面的类“ BaseSplitViewController”是我的应用程序的根视图控制器。

那是,self.window.rootViewController = [[BaseSplitViewController alloc] init];

  • 从Apple的文档中,

“在设计你的拆分视图界面时,最好安装不变的主视图控制器和次视图控制器。一种常见的技术是在两个位置都安装导航控制器,然后根据需要推送和弹出新内容。拥有这些类型的锚视图控制器使您更容易专注于您的内容,并让拆分视图控制器将其默认行为应用于整个界面。”

因此,我创建了两个导航控制器(主要/次要)并将它们设置为拆分视图控制器的主要和次要视图。setViewControllers:可用于此。

  • 我的主要视图是标签栏视图。因此,在assignPrimaryViewController:方法内部,我应该将我的分配TabBarViewController为拆分视图控制器的主视图。

在这里,我找到了两种方法。

1. [self.primaryNavigationController showViewController:self.primaryTabBarVC sender:nil];

2. [self.primaryNavigationController pushViewController:self.primaryTabBarVC animated:YES];

在这里,我尝试过,[self showViewController:self.primaryTabBarVC sender:nil];但从未显示我的标签栏视图。据我了解,这里"self"指的是 UISplitViewController。调用showViewController: 这里会混淆选择导航控制器。因为我们有两个导航控制器。所以我们需要清楚地告诉那个导航控制器需要持有主控制器。

  • 主视图控制器部分已经结束。现在真正的问题开始了。考虑我的主要视图控制器是其中包含 tableview 的选项卡栏。如果我点击单元格,我需要更新辅助视图的内容。在常规模式下就是这种情况。在紧凑模式下,我希望当用户点击单元格时,它应该使用后退按钮推动详细视图(辅助视图)。

我希望将下面的代码放在assignSecondaryViewController: vc:方法中

[self.secondaryNavigationController pushViewController:vc animated:NO];

    [self.primaryNavigationController showDetailViewController:self.secondaryNavigationController sender:nil];

但它不起作用。

问题:

  • 应该在assignPrimaryViewController&assignSecondaryViewController:方法中放置什么来获得我的预期结果?

  • 我真的,是的,真的不知道如何实现 UISplitViewController 的以下委托方法。

  • primaryViewControllerForCollapsingSplitViewController:

  • splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:
  • primaryViewControllerForExpandingSplitViewController:
  • splitViewController:separateSecondaryViewControllerFromPrimaryViewController:

如果有人解释这个新的 UISplitViewController 的行为,那将非常有帮助。

谢谢

4

0 回答 0