我是 Xcode 的新手,正在启动一个通用应用程序。在 iPad 版本中,我想将主要部分重新用于不同的搜索表单。
我希望用户在左侧菜单上的每个按钮的右侧部分(见图)中看到完全不同的表单。
我正在以编程方式工作。
在这种情况下更改内容的最佳方法是什么?(牢记性能和编码复杂性)
编辑:这是一个标准的选项卡式应用程序,而不是拆分视图。我是否可以为每个表单创建一个新的视图控制器和 .xib,然后通过将它们嵌入到此屏幕上的 UIView 或 UIWindow 中来更改显示哪个?
我是 Xcode 的新手,正在启动一个通用应用程序。在 iPad 版本中,我想将主要部分重新用于不同的搜索表单。
我希望用户在左侧菜单上的每个按钮的右侧部分(见图)中看到完全不同的表单。
我正在以编程方式工作。
在这种情况下更改内容的最佳方法是什么?(牢记性能和编码复杂性)
编辑:这是一个标准的选项卡式应用程序,而不是拆分视图。我是否可以为每个表单创建一个新的视图控制器和 .xib,然后通过将它们嵌入到此屏幕上的 UIView 或 UIWindow 中来更改显示哪个?
您在编辑中找到了正确的答案。据我了解,侧面的按钮类似于另一个标签栏控制器,但嵌套在您的主标签栏控制器中?
您不妨遵循相同的模式,因为它是一种熟悉的模式。你的搜索视图控制器应该作为一个容器视图控制器,它有一个代表每个表单选项的视图控制器数组。
在选项之间切换时,从视图层次结构(使用addSubview
)和视图控制器层次结构(使用链接中“添加和删除子项”中的代码)添加/删除适当的视图控制器视图。视图控制器层次结构对于确保在您的子控制器上调用 viewDidAppear 等非常重要。
作为说明,我创建了一个简单的演示项目,其中主视图控制器有一组按钮,每个按钮都链接到相同的操作,以及包含的视图控制器数组。包含的视图控制器将保存container
在本例中调用的子视图中。这将是上面屏幕截图中右侧区域的大小。
viewDidLoad
子控制器在容器视图控制器中设置如下:
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *buttons;
@property (weak, nonatomic) IBOutlet UIView *container;
@property (nonatomic,strong) NSArray *viewControllers;
@property (nonatomic, strong) UIViewController *currentChild;
@end
@implementation JRTViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
for (UIButton *button in self.buttons)
[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
NSMutableArray *children = [NSMutableArray new];
for (int i = 0; i < 4; i++)
{
ContainedViewController *child = [ContainedViewController new];
child.name = [NSString stringWithFormat:@"Form %d",i + 1];
[children addObject:child];
}
self.viewControllers = [children copy];
[self buttonTapped:self.buttons[0]];
}
在这里,我使用了同一个视图控制器类的四个实例——它只有一个标签,它指示您正在选择哪种形式。真的,每个人都有不同的课程。我还通过发送第一个按钮的操作方法“选择”了初始视图控制器。动作方法这样做:
- (IBAction)buttonTapped:(UIButton *)sender
{
NSUInteger index = [self.buttons indexOfObject:sender];
if (index != NSNotFound)
self.currentChild = self.viewControllers[index];
}
它从视图控制器数组中选择适当的 VC。setter 方法执行此操作:
-(void)setCurrentChild:(UIViewController *)currentChild
{
if (currentChild == _currentChild) return;
// Remove the old child
[_currentChild willMoveToParentViewController:nil];
[_currentChild.view removeFromSuperview];
[_currentChild removeFromParentViewController];
[_currentChild didMoveToParentViewController:nil];
// Add the new one
[currentChild willMoveToParentViewController:self];
[self.container addSubview:currentChild.view];
NSDictionary *views = @{@"view":currentChild.view};
[self.container addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[view]|" options:0 metrics:nil views:views]];
[self.container addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:views]];
[self addChildViewController:currentChild];
[currentChild didMoveToParentViewController:self];
_currentChild = currentChild;
}
它设置视图控制器层次结构,添加视图并使用约束使其填充容器。
在此示例中,我在演示子视图控制器的添加和切换时硬编码了四个按钮和四个子视图控制器。实际上,您会使其更像一个标签栏控制器,您可以在其中分配一组视图控制器,并且容器将创建自己的按钮数组。