我尝试在我的应用程序中实现自适应 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 的行为,那将非常有帮助。
谢谢