Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何在UIView/Subview响应链中组织类?_Objective C_Design Patterns_Uiview - Fatal编程技术网

Objective c 如何在UIView/Subview响应链中组织类?

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

我经常听说,以每个班级都知道其他班级的方式组织班级是不好的。 所以我试着让在其他类中作为属性的类不知道它们的父母。但在UIView看来,我做不到

这个问题来自更一般的背景,因为问题不仅发生在UIView上。 如果我有一辆车作为对象,4个车轮作为4个实例变量,当左前轮爆裂时。左后轮应该会收到信息。我应该如何以良好的方式设计系统

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

@interface BackgroundView : UIControllerView {

    CustomViewA *buttonA;
    CustomViewB *buttonB;
}
@end

@interface CustomViewA : UIButton

@interface CustomViewB : UIButton
现在,如果有人按下按钮A,按钮B应该做些什么(例如变红)。 我看到了几个选项:

  • 将按钮A的委托设置为按钮B,这样,A的所有事件都将转到B的实现文件。如果不是所有事件都与按钮B有关,则出现问题
  • 创建一个单一的BackgroundView,让button a获得button B的属性,或者在BackgroundView中调用一个方法,将我的调用转发给button B。如果我需要多个背景,可以创建一个更高的类来拥有这两个背景(听起来不太好)
  • 调用为UIView实现的父级,然后像2。调用方法或直接更改它。不使用UIView时出现问题,是否将功能复制到其他“父”类

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

    可能所有的逻辑都属于一个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)