Objective c 如何在UIView/Subview响应链中组织类?
我经常听说,以每个班级都知道其他班级的方式组织班级是不好的。 所以我试着让在其他类中作为属性的类不知道它们的父母。但在UIView看来,我做不到 这个问题来自更一般的背景,因为问题不仅发生在UIView上。 如果我有一辆车作为对象,4个车轮作为4个实例变量,当左前轮爆裂时。左后轮应该会收到信息。我应该如何以良好的方式设计系统 Objective-C中的UIView示例: 我有一个自定义UIView填充整个屏幕。管理所有布局。假设只有2个子视图保持简单Objective c 如何在UIView/Subview响应链中组织类?,objective-c,design-patterns,uiview,Objective C,Design Patterns,Uiview,我经常听说,以每个班级都知道其他班级的方式组织班级是不好的。 所以我试着让在其他类中作为属性的类不知道它们的父母。但在UIView看来,我做不到 这个问题来自更一般的背景,因为问题不仅发生在UIView上。 如果我有一辆车作为对象,4个车轮作为4个实例变量,当左前轮爆裂时。左后轮应该会收到信息。我应该如何以良好的方式设计系统 Objective-C中的UIView示例: 我有一个自定义UIView填充整个屏幕。管理所有布局。假设只有2个子视图保持简单 @interface BackgroundV
@interface BackgroundView : UIControllerView {
CustomViewA *buttonA;
CustomViewB *buttonB;
}
@end
@interface CustomViewA : UIButton
@interface CustomViewB : UIButton
现在,如果有人按下按钮A,按钮B应该做些什么(例如变红)。
我看到了几个选项:
有没有更好的办法解决这样的问题?或者我可以极大地优化一种方法吗?可能所有的逻辑都属于一个ViewController,他知道他所控制的视图的一切,但视图不知道有关视图控制器或彼此的任何信息 视图应该通过委托(或目标操作)与视图控制器通信,并且视图控制器应该做出决策,并且可能将消息转发给其他视图
顺便说一下,看看iTunes大学的斯坦福课程。我认为这是他们谈论MVC(模型-视图-控制器)的第一节课或第二节课。这将有很大帮助:可能所有的逻辑都属于一个ViewController,他知道他所控制的视图的一切,但视图不知道任何关于视图控制器或彼此的信息 视图应该通过委托(或目标操作)与视图控制器通信,并且视图控制器应该做出决策,并且可能将消息转发给其他视图
顺便说一下,看看iTunes大学的斯坦福课程。我认为这是他们谈论MVC(模型-视图-控制器)的第一节课或第二节课。这将有很大帮助:@Odrakir在这里提到模型视图控制器,他们是对的——这应该是您的第一站。如果有帮助,以下是您如何将该模式应用于示例: 您有一个属性为
颜色的模型类。在基于文档的应用程序中,文档通常是模型。在非基于文档的应用程序中,通常会将模型挂起到应用程序委托实例上。为了简单起见,假设我们处于后一种情况。您可能有以下类:
// "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
/“模型”
@接口MyModel:NSObject
@属性(非原子、读写、复制)UIColor*color;
@结束
//AppDelegate
@接口MyAppDelegate:UIResponder
@属性(非原子、只读、保留)MyModel*模型;
@结束
//“视图”
@界面自定义视图a:ui按钮
@结束
@界面自定义视图b:ui按钮
@结束
//“控制器”
@接口MyViewController:UIViewController
@属性(非原子、读写、赋值)IBOUTLE UIView*按钮;
@属性(非原子、读写、赋值)IBOUTLE UIView*buttonB;
-(iAction)doActionA:(id)发送方;
-(iAction)doActionB:(id)发送方;
@结束
基本模式是这样的:来自视图的动作触发模型修改控制器的动作(目标/动作模式)。为了实现这一点,您可以通过将按钮A的操作连接到控制器上的-doActionA:
(IB中的“文件所有者”)和(B也是如此)来连接它们。然后,控制器上的操作方法在触发时应修改模型,并使因模型更改而需要重新绘制的任何视图无效。您可以通过将视图插入控制器上的IBOutlets并让控制器调用[self.buttonA setNeedsDisplay]
来完成此操作。然后,当视图绘制时,它应该从模型中读取需要正确绘制的任何状态
值得一提的是,在MacOS上,可以通过使用绑定将视图链接到模型来消除手动失效步骤。在这种情况下,对模型的更改将自动使视图无效。iOS/UIKit没有绑定,所以您必须手动执行此失效操作。@Odrakir在这里提到模型视图控制器,他们是对的——这应该是您的第一站。如果有帮助,以下是您如何将该模式应用于示例:
您有一个属性为颜色的模型类。在基于文档的应用程序中,文档通常是模型。在非基于文档的应用程序中,通常会将模型挂起到应用程序委托实例上。为了简单起见,假设我们处于后一种情况。您可能有以下类:
// "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
/“模型”
@接口MyModel:NSObject
@属性(非原子、读写、复制)UIColor*color;
@结束
//AppDelegate
@接口MyAppDelegate:UIResponder
@属性(非原子、只读、保留)MyModel*模型;
@结束
//“视图”
@界面自定义视图a:ui按钮
@结束
@界面自定义视图b:ui按钮
@结束
//“控制器”
@接口MyViewController:UIViewController
@属性(非原子、读写、赋值)IBOUTLE UIView*按钮;
@属性(非原子、读写、赋值)IBOUTLE UIView*buttonB;
-(iAction)doActionA:(id)发送方;
-(IBAc)