在一个窗口中嵌入多个视图控制器

时间:2013-12-21 20:02:06

标签: ios objective-c uiviewcontroller cohesion

我想要一个包含多个视图的视图。见下图: enter image description here

如您所见,pageController控制页面导航并在viewController(页面)之前和之后提供。

pageContentController显示文本并处理它们。

soundPlayer管理播放相关声音

我可以将它们全部放在一个控制器中,但是我的控制器必须完成很多任务并且管理它将是一项艰巨的任务。因为它违反了光视图控制器。并降低其凝聚力。 所以我想知道如何实现这一目标 请详细解释。

5 个答案:

答案 0 :(得分:5)

感谢您的详细解答。你的答案澄清了我。我做了什么:

我添加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 :(得分:1)

我要做的是:

1)为每个视图创建自定义类 2)然后我将View Classes设置为我创建的类。

Setting the Class of the View to the custom created class

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)然后在View Controller Class中为每个视图创建插座。

//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])方法时,它将调用特定视图的方法,这样您就不会有非常长的不可重用的视图控制器

我刚刚展示了一个视图示例,我希望你能看到我在这里做的事情,并为你需要的一切实现这一点。

答案 2 :(得分:1)

在pageController视图中,将pageContentController的视图和soundPlayer的视图添加为子视图。

在pageController.m文件中写下以下代码

soundPlayer = [[SoundPlayer alloc] init];
[self.view addSubview:soundPlayer.view];
souldPlayer.frame = //set it value as desired.

与pageContentController类似。

答案 3 :(得分:1)

从iOS 5开始,Apple为操作系统添加了父/子视图控制器支持。 UIViewController类中有新的调用来支持设置父/子视图控制器关系,其中一个视图控制器(父级)设置或更多其他视图控制器,以便将其内容视图插入到父级的视图层次结构中。这是一项重大改进,但是要正确设置并使一切正常工作,需要做大量的工作。

从iOS 6开始,Apple添加了容器视图(这只是一个特殊类型的UIView)并嵌入了segues。你所做的是打开视图控制器的场景,它将成为IB中的父节点,选择接口对象列表,然后键入“container”。您应该看到容器视图。将容器视图拖到父视图控制器上,并将其放在所需的位置。

然后从容器视图控制拖动到定义要放置在该容器中的子视图控制器的界面的场景。它应默认为创建嵌入segue。接受默认值。这就是它。现在,当您加载父视图控制器时,系统还将实例化您已设置的所有子视图控制器,并连接所有使其正常工作的“管道”。

如果你需要父母和孩子进行交流,你可以在你的embed segue上设置一个标识符,然后写下配置孩子的prepareForSegue代码,就像任何其他的segue一样。

容器视图和嵌入segues非常棒,并且设置这类东西非常简单。

我在github上有一个示例项目,它使用嵌入segues效果很好。这是链接:

Demo project using embed segues to manage 2 static table views in a parent VC.

答案 4 :(得分:0)

我会通过界面构建​​器实现容器视图对象。来自描述: “容器视图定义了视图控制器的视图子图中可以包含子视图控制器的区域。在容器视图中创建嵌入segue到故事板中的子视图控制器。”

这样你就可以在父视图控制器中准确定义你想要作为子视图控制器的两个区域,你可以在你的pageContent中加载一个UIPageViewController,并在你的播放器中加载你的播放器控制器。