【问题标题】:Conceptually, how should this be structured in OOP?从概念上讲,这应该如何在 OOP 中构建?
【发布时间】:2011-12-14 23:37:08
【问题描述】:

所以我有一个 UIImageView 可以通过 touchesMoved 围绕其中心旋转。

目前所有代码都在我的 ViewController 中,检测触摸、计算和跟踪当前旋转、图像本身以及图像的实际旋转。

但现在我想整理一下并正确执行。我创建的这个“微调器”应该是一个不同的对象,可以多次实例化并放在我需要的任何地方。

所以我创建了新的 Spinner 类,它会跟踪自己的图像和角度属性...

但这应该是具有 UIImageView 属性的 NSObject,还是实际的 UIImageView 本身? 以及应该如何处理触摸,ViewController 是否需要发挥作用或者对象可以以某种方式跟踪自己的触摸?

-

已编辑:仍然希望对我的这个老问题有一个明确的答案。

当我的微调器只是一个旋转并响应触摸的抽象图像时,我认为 UIControl 子类是有意义的。

但是当位置、速度更复杂时,需要与其他对象交互,在多次启动中持续存在(NSManagedObject 子类?)等。触摸和图像只是整体的一小部分。这就是为什么我认为 UIImage 只是对象的另一个属性。

作为一个简单的例子,想象一堆球在一个盒子里弹跳。它们需要从侧面反弹、相互反弹、旋转、对重力做出反应、在触摸时做出反应 - 并在两次发射之间持续存在。

那么从概念上讲,这应该如何在 OOP 中构建?

【问题讨论】:

  • 听起来 UIControl 将是最合适的父类,但您需要详细说明您希望它如何使用(由程序员和最终用户)以及图像来自哪里如果您需要合理的建议。
  • 微调器是我的“模型”的一部分,不是吗? MVC 不是意味着我的模型不应该是 UIView 子类吗?

标签: objective-c ios oop object


【解决方案1】:

您应该使用 UIControl 作为父类,并将 UIImageView 属性添加为子视图。 UIControl 具有您可以覆盖以跟踪触摸的方法。

【讨论】:

  • 我也会这样。您可以通过一个类设置易于使用的事件和配置。
【解决方案2】:

您要求的是“正确的方式”,好像在 OOP 中只有一个正确答案。

实际上没有一种正确的设计。这完全取决于您期望代码在未来如何扩展和重新利用。

如果您真的想为每一个可以想象的扩展做好准备,那么您最终会得到一个复杂得离谱的设计,但仍然无法涵盖所有​​内容。

在您的示例中:从触摸控制的微调器变为 2D 物理模拟的一部分……这是一个相当长的跳跃。为什么我什至想用一个通用的基类来实现它?

  • 如果您只是想要一个“屏幕上可以旋转的东西”的基类...我会说这太笼统了。没有足够的附加值来证明一个新类的合理性:UIView 已经可以做到这一点。

  • 如果您的原始对象旨在获取用户输入,请坚持使用 iOS 和子类 UIControl 的设计模式。

  • 如果您设想一个物理模拟。那么你可能有一个完整的类结构,它独立于它在屏幕上的显示方式:

描述每个对象的机械属性(形状,重量,...)的刚性类(可能是类树。您可以使用单独的代理进行碰撞检测。) 刚体状态,描述刚体的位置和速度。 一个 RigidSimulator,拥有一组 Rigids 和每个刚体的 RigidState。 一个 RigidViewController 可以为给定的 Rigid 创建一个 UIView(可能是一个 UIImageView),并且可以调整它的大小和位置(给定一个 RigidState)。 ... 类似的东西。

【讨论】:

  • 不要太担心我的第一个例子,因为那是在我开始更详细地思考之前。物理模拟类型的场景听起来更像我现在所处的位置。
  • 好的,在这种情况下,这不是一个很好的问题:-/。无论如何,我稍微编辑了我的答案。
  • 我不完全明白,哈哈 - 但你的回答是我认为最好的
  • 很高兴详细说明,在哪一部分?
【解决方案3】:

我有一个与此非常相似的对象。对于 MediaBlob,我将其称为 MBlob。它知道如何做各种事情,例如如何将自己拆分 2、与另一个 MBlob 组合(根据形状适当调整大小)等。它还知道如何将自己生成到 WebView 中(加载 URL),获取调整大小(例如旋转、手势)等。非常方便的类,用于制作小应用程序,我认为许多开发人员都有类似的东西。我的应用商店应用中使用了类似的类,QCount(免费)和 QPlus。

构造诸如对象之类的一种方法是作为 NSObject 的子对象,然后为要使用的内置项目挂钩一些协议。比如我的界面是这样的:

@interface MBlob : NSObject <UIWebViewDelegate, UIPopoverControllerDelegate> {
    id _delegate;
}

所有属性都在 .m 文件中实现为 @synthesize varName = _varName。

然后你可以从这个项目中连接各种视图。这可能有点矫枉过正,但我​​的 MBlob 甚至知道如何启动首选项编辑器来编辑它自己的首选项,而不会打扰拥有的 VC。这里有一些值得深思的地方:

@property (nonatomic, strong) UIView* preview;
@property (nonatomic, strong) UIView* displayView;
@property (nonatomic, strong) UIWebView* webView;
@property (nonatomic, strong) UIToolbar* toolbar;
@property (nonatomic, strong) UIActivityIndicatorView* activityIndicator;
@property (nonatomic, strong) NSTimer* timer;
@property (nonatomic, strong) NSString* mediaType;
@property (nonatomic, strong) NSString* mediaValue;
@property (nonatomic) CGFloat   aspectRatio; // width:height
@property (nonatomic) BOOL      aspectRatioLocked; 
@property (nonatomic) CGSize    nativeSize;
@property (nonatomic) CGPoint   nativeLocation;
@property (nonatomic, strong) NSString* title;
@property (nonatomic, strong) UITextField* titleTextField;
@property (nonatomic, strong) UIFont* font;
@property (nonatomic) BOOL fullScreen;
@property (nonatomic, strong) WebviewButtonPreferences* webviewButtonPreferences;
@property (nonatomic, strong) PreferencesEditorViewController* preferencesEditorVC;

我的一个警告是,Apple 通过内置类让很多事情变得简单,所以不要过度使用。例如在我上面的代码中,我真的需要字体吗?我不知道,这不再是我的活动代码,但它是您所描述的对象类型的一个示例。如果您要添加更多功能,请使用 NSObject 的伞形子类并创建您想要使用属性的任何其他类。

祝你好运,

达米安

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2013-11-26
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    相关资源
    最近更新 更多