0

我经常听说,以每个班级都知道其他班级的方式来组织班级是不好的。所以我试着让作为其他类属性的类不知道他们的父母。但是使用 UIView 我无法实现它。

这个问题来自更通用的背景,因为问题不仅发生在 UIViews 上。如果我有一辆汽车作为对象,有 4 个轮子作为 4 个实例变量,并且当左前轮爆裂时。左后轮应该会收到一条消息。我应该如何以一种好的方式设计系统?

Objective-C 中的 UIView 示例:我有一个自定义 UIView 填充整个屏幕。管理所有布局。假设只有 2 个子视图保持简单。

@interface BackgroundView : UIControllerView {

    CustomViewA *buttonA;
    CustomViewB *buttonB;
}
@end

@interface CustomViewA : UIButton

@interface CustomViewB : UIButton

现在如果有人按下按钮 A,按钮 B 应该做某事(例如变红)。我看到有几个选项:

  1. 将按钮 A 的委托设置为按钮 B,因此 A 的所有事件都转到 B 的实现文件。如果不是所有事件都与按钮 B 有关,则问题。
  2. 创建一个单例 BackgroundView 并让按钮 A 获取按钮 B 的属性或调用 BackgroundView 中的方法,该方法确实将我的调用转发到按钮 B。如果我想要多个背景,可以创建一个更高的类来拥有两个 BackgroundView (听起来不太好)。
  3. 调用为 UIViews 实现的父对象,然后像 2. 调用方法或直接更改它。不使用 UIView 时出现问题,将功能复制到其他“父”类?

有没有更好的方法来解决这样的问题?或者我可以大大优化一种方法吗?

4

2 回答 2

2

可能所有逻辑都属于 ViewController,他知道关于他所控制的视图的一切,但视图对视图控制器或彼此一无所知。

视图应该通过委托(或目标操作)与视图控制器进行通信,并且视图控制器应该做出决策并可能将消息转发给其他视图。

顺便说一下,看看 iTunes 大学的斯坦福课程。我认为这是他们谈论 MVC(模型视图控制器)的第一类或第二类。这会有很大帮助:https ://itunes.apple.com/us/course/coding-together-developing/id593208016

于 2013-02-24T13:25:28.137 回答
2

@Odrakir 在这里提到了模型-视图-控制器,他们是对的——那应该是你的第一站。如果它有帮助,您可以通过以下方式将该模式应用于您的示例:

您有一个带有属性的模型类color。在基于文档的应用程序中,文档通常模型。在非基于文档的应用程序中,将模型从应用程序委托实例中挂起是很常见的。为简单起见,假设我们处于后一种情况。您可能有以下课程:

// "Model"
@interface MyModel : NSObject
@property (nonatomic, readwrite, copy) UIColor* color;
@end

// AppDelegate
@interface MyAppDelegate : UIResponder <UIApplicationDelegate>
@property (nonatomic, readonly, retain) MyModel* model;
@end

// "View"
@interface CustomViewA : UIButton
@end

@interface CustomViewB : UIButton
@end

// "Controller"
@interface MyViewController : UIViewController

@property (nonatomic, readwrite, assign) IBOutlet UIView* buttonA;
@property (nonatomic, readwrite, assign) IBOutlet UIView* buttonB;

- (IBAction)doActionA: (id)sender;
- (IBAction)doActionB: (id)sender;

@end

基本模式是这样的:视图中的动作触发控制器的模型修改动作(目标/动作模式)。为此,您可以通过将按钮 A 的操作连接到-doActionA:控制器(IB 中的“文件所有者”)和(对于 B 也是如此)上的操作来连接它们。然后,控制器上的操作方法在触发时应该修改模型,并使由于模型更改而需要重绘的任何视图无效。您可以通过将视图插入控制器上的 IBOutlets 并让控制器调用来做到这一点[self.buttonA setNeedsDisplay]。然后,当您的视图绘制时,它应该从模型中读取它需要正确绘制的任何状态。

值得一提的是,在 MacOS 上,您可以通过使用绑定将视图链接到模型来消除手动失效步骤。在这种情况下,对模型的更改将自动使视图无效。iOS/UIKit 没有绑定,因此您必须手动执行此失效操作。

于 2013-02-24T15:03:21.980 回答