我想要一个包含多个视图的视图。见下图:
如您所见,pageController 控制页面导航并在 viewController(页面)之前和之后提供。
pageContentController 显示文本并处理它们。
soundPlayer 管理播放相关声音
我可以将所有这些都放在一个控制器中,但是我的控制器必须完成很多任务并且管理它是一项艰巨的任务。因为它不服从灯光视图控制器。并降低其凝聚力。所以我想知道我怎样才能做到这一点,请详细解释。
我想要一个包含多个视图的视图。见下图:
如您所见,pageController 控制页面导航并在 viewController(页面)之前和之后提供。
pageContentController 显示文本并处理它们。
soundPlayer 管理播放相关声音
我可以将所有这些都放在一个控制器中,但是我的控制器必须完成很多任务并且管理它是一项艰巨的任务。因为它不服从灯光视图控制器。并降低其凝聚力。所以我想知道我怎样才能做到这一点,请详细解释。
感谢您的详细回答。你的回答澄清了我。我做了什么:
我添加SoundPalyerVC
为PageContentVC
SoundPlayerVC *soundPlayer = [[StoryViewController alloc] initWithStory:self.storyManagedObject];
[self addChildViewController:soundPlayer];
[self.view addSubview:soundPlayer.view];
[soundPlayer didMoveToParentViewController:self];
soundPlayer.view.frame = CGRectMake(0, self.view.frame.size.height-soundPlayer.view.frame.size.height, 320, soundPlayer.view.frame.size.height);
那太容易了。现在我的代码是分开的。
我会做的是:
1)为每个视图创建自定义类。
2)然后我会将视图类设置为我创建的类。
3)然后我会编写代码来处理这些视图类中需要的任何功能。
@interface PageContent : UIView
- (void) showTest : (NSString *) textToShow;
@end
@implementation PageContent
- (void) showTest : (NSString *) textToShow
{
//Then here you would do whatever you need to do with this text, and display it
}
@end
@interface SoundPlayer : UIView
- (void) playSound;
@end
@implementation SoundPlayer
-(void) playSound
{
//Do whatever you need to do with the sound here.
}
@end
4) 然后在您的视图控制器类中为这些视图中的每一个创建出口。
//So your View Controller Class would look something like this.
@interface YourViewController : UIViewController
@property (strong, nonatomic) IBOutlet Page *page;
@property (strong, nonatomic) IBOutlet PageContent *pageContent;
@property (strong, nonatomic) IBOutlet SoundPlayer *soundPlayer;
@end
5)然后在你的 View Controller @implementation 你可以做类似的事情
@implementation YourViewController
-(void) showContent
{
[self.pageContent showText:@"Text To Show"];
}
-(void) playSound
{
[self.soundPlayer playSound];
}
@end
现在,当您在视图控制器中调用这些 ([self showContent] 或 [self playSound]) 方法时,它将调用特定视图的方法,这样您就没有一个非常长的不可重用视图控制器。
我只是展示了一个视图示例,我希望你能看到我在这里做什么,并为你需要的一切实现它。
在您的 pageController 视图中,添加 pageContentController 的视图和 soundPlayer 的视图作为子视图。
在 pageController.m 文件中编写以下代码
soundPlayer = [[SoundPlayer alloc] init];
[self.view addSubview:soundPlayer.view];
souldPlayer.frame = //set it value as desired.
与 pageContentController 类似。
从 iOS 5 开始,Apple 向操作系统添加了父/子视图控制器支持。UIViewController 类中有新的调用来支持设置父/子视图控制器关系,其中一个视图控制器(父)设置或多个其他视图控制器,以便将它们的内容视图插入到父视图层次结构中。这是一项重大改进,但需要大量工作才能正确设置并使一切正常运行。
从 iOS 6 开始,Apple 添加了容器视图(它只是一个具有特殊类型的 UIView)并嵌入了 segue。您要做的是打开将成为 IB 中的父级的视图控制器的场景,选择界面对象列表,然后键入“容器”。您应该看到一个容器视图。将容器视图拖到您的父视图控制器上并将其放置在您想要的位置。
然后从你的容器视图控制拖拽到定义你想放置在那个容器中的子视图控制器接口的场景。它应该默认创建一个嵌入转场。接受默认值。差不多就是这样。现在,当您加载父视图控制器时,系统还将实例化您已设置的所有子视图控制器,并连接所有使其正常工作的“管道”。
如果您需要父母和孩子进行交流,您可以在嵌入 segue 上设置一个标识符,然后像任何其他 segue 一样编写配置孩子的 prepareForSegue 代码。
容器视图和嵌入 segues 非常棒,让设置这种东西变得非常容易。
我在 github 上有一个示例项目,它使用嵌入 segues 效果很好。这是链接:
我会通过界面构建器使用容器视图对象来实现这一点。来自描述:“容器视图在视图控制器的视图子图中定义了一个区域,该区域可以包含一个子视图控制器。创建从容器视图到情节提要中的子视图控制器的嵌入序列。”
这样,您将在父视图控制器中准确定义您想要作为子视图控制器的两个区域,并且您可以在 pageContent 中加载 UIPageViewController 并在声音播放器中加载播放器控制器。