【问题标题】:embed multiple view controller in one window在一个窗口中嵌入多个视图控制器
【发布时间】:2013-12-21 20:02:06
【问题描述】:

我想要一个包含多个视图的视图。见下图:

如你所见 pageController 控制页面导航并提供前后 viewController(页面)。

pageContentController 显示文本并处理它们。

soundPlayer 管理播放相关声音

我可以将所有这些都放在一个控制器中,但是我的控制器必须完成很多任务,并且管理它是一项艰巨的任务。因为它不服从灯光视图控制器。并降低其凝聚力。 所以我想知道我怎样才能做到这一点 请详细说明。

【问题讨论】:

    标签: ios objective-c uiviewcontroller cohesion


    【解决方案1】:

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

    我将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);
    

    这太容易了。现在我的代码是分开的。

    【讨论】:

      【解决方案2】:

      我会做的是:

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

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

      我只是展示了一个视图示例,我希望你能看到我在这里做什么,并为你需要的一切实现它。

      【讨论】:

        【解决方案3】:

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

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

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

        类似于 pageContentController。

        【讨论】:

        • 不,你不应该那样做。您应该混合来自不同视图控制器的视图的唯一方法是使用在 iOS 5 中添加并在 iOS 6 中扩展的父/子视图控制器方法(请参阅下面的帖子)。我已经尝试过您所描述的内容,但它会导致各种问题,尤其是在自动旋转和转发系统通知(如内存不足通知、震动事件等)时。这是可能的,但 Apple 表示不要这样做,并且你有责任让一切正常工作。为什么要打呢?嵌入 segues 让它变得如此简单!
        【解决方案4】:

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

        从 iOS 6 开始,Apple 添加了容器视图(它只是一个具有特殊类型的 UIView)并嵌入了 segue。您要做的是打开将成为 IB 中的父级的视图控制器的场景,选择界面对象列表,然后键入“容器”。您应该看到一个容器视图。将容器视图拖到您的父视图控制器上并将其放置在您想要的位置。

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

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

        容器视图和嵌入转场非常棒,让设置这类事情变得非常容易。

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

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

        【讨论】:

          【解决方案5】:

          我会通过界面构建​​器实现容器视图对象。从描述: “容器视图在视图控制器的视图子图中定义了一个区域,该区域可以包含子视图控制器。创建从容器视图到情节提要中的子视图控制器的嵌入 segue。”

          这样,您可以在父视图控制器中准确定义两个区域作为子视图控制器,并且可以在 pageContent 中加载 UIPageViewController,在声音播放器中加载播放器控制器。

          【讨论】:

            猜你喜欢
            • 2017-12-13
            • 1970-01-01
            • 2018-08-13
            • 1970-01-01
            • 1970-01-01
            • 2018-07-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多