【问题标题】:Managing subviews in Cocoa Touch在 Cocoa Touch 中管理子视图
【发布时间】:2009-08-13 21:21:18
【问题描述】:

我正在开发一个 iPhone 应用程序。我需要创建一个嵌入了不同问题视图的测验应用程序(请参阅我的similar question)。

不同类型的问题会有不同的行为,所以我计划为每种类型的问题创建一个控制器类。 MultipleChoiceQuestionController 会设置一个问题和 3-4 个按钮供用户选择答案。同样,IdentifyPictureQuestionController 会加载一张图片并向用户显示一个文本框。

然而,docs 说 UIViewController 应该只用于占据整个应用程序窗口的视图。我还能如何创建一个类来管理我的子视图中的事件?

谢谢,

【问题讨论】:

    标签: iphone objective-c cocoa-touch uiview uiviewcontroller


    【解决方案1】:

    子类化 UIViewController 将提供此功能。例如,MultipleChoiceQuestionController 将是 UIViewController 的子类。 MultipleChoiceQuestionController 将包含问题文本(UILabel 或 UITextView)和几个按钮(UIButton)。您可以在 MultipleChoiceQuestionController 中创建一个自定义构造函数,用相关的问题字符串和其他相关信息填充视图。

    当您想将 MultipleChoiceQuestionController 的视图添加到主视图的子视图时,只需执行以下操作:

    [myMainView addSubview:instanceOfMultipleChoiceQuestionController.view];
    

    【讨论】:

    • Apple 说不要:“注意:您不应该使用视图控制器来管理仅填充其窗口的一部分的视图 - 即仅由应用程序内容矩形定义的区域的一部分。如果您希望拥有一个由多个较小视图组成的界面,将它们全部嵌入到一个根视图中并使用您的视图控制器管理该视图。(developer.apple.com/iphone/library/documentation/UIKit/…)
    【解决方案2】:

    我有同样的问题,根据 Apple 的文档,你应该这样做:

    注意:如果要分单 筛选多个区域并进行管理 每个单独,使用通用 控制器对象(自定义对象 从 NSObject 下降)而不是 查看控制器对象来管理每个 屏幕的子部分。然后使用一个 单视图控制器对象 管理通用控制器对象。 视图控制器协调 整体屏幕交互,但 根据需要将消息转发给 它管理的通用控制器对象。

    http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/AboutViewControllers/AboutViewControllers.html#//apple_ref/doc/uid/TP40007457-CH112-SW12

    【讨论】:

      【解决方案3】:

      您可以处理视图本身的事件,或者您的视图控制器可以有一个委托类,该类会针对不同类型的问题进行更改。该委托将处理不同的输入,并以不同的方式对用户触摸做出反应。

      这里有一些代码。

      // In QuestionViewControllerDelegateProtocol.h
      @protocol QuestionViewControllerDelegateProtocol
      
      // Define the methods you want here
      - (void)touchesBegan;
      - (void)touchesEnded;
      - (void)questionLoaded;
      
      @end
      
      // In QuestionViewController.h
      @interface QuestionViewController {
          id<QuestionViewControllerDelegateProtocol> delegate;
      }
      
      @end
      
      // In QuestionViewController.m
      @implementation QuestionViewController
      
      - (void)viewDidLoad:(BOOL)animated {
           [delegate questionLoaded];
      }
      
      - (void)touchesBegan {
           // Some processing logic.
           [delegate touchesBegan];
      }
      
      @end
      

      【讨论】:

      • 让委托类扩展 UIViewController 是有意义的,但 Apple 文档告诉我不要这样做。那我该如何制作 viewDidLoad: fire 之类的方法呢?
      • 这里我不是在谈论 App Delegate。我说的是一个自定义委托类,它完成了你的UIViewController 没有完成的部分工作。这样您就可以根据所选视图(问题类型)交换该委托
      • 谢谢。所以我正在考虑使用 loadNibNamed:@"MySubview" owner:myCustomDelgate 。加载子视图时会通知 myCustomDelegate 吗?
      • 由您通知。
      【解决方案4】:

      这是一个非常好的小解决方案,在不违反苹果规则的情况下为您提供视图控制器的所有优点。

      从页面:

      这是一个通用控制器类 可用于处理子区域。 它以 UIViewController 为蓝本, 但符合苹果的 推荐。

      您的视图控制器创建 实例并负责 管理子视图控制器。 或者,您可以进一步 细分您的视图层次结构和 在里面创建子视图控制器 其他子视图控制器。同时 实例化控制器的情况 对象负责管理 子视图控制器。负责人 控制器被称为“父 控制器。'子类可以使用 例如,当他们查看控制器时 需要显示一个模态对话框。

      https://github.com/Koolistov/Subview-Controller

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多