【问题标题】:UIView Decorator Pattern Example [closed]UIView 装饰器模式示例 [关闭]
【发布时间】:2014-05-21 23:18:45
【问题描述】:

有人可以分享一个客观的 c UIView 装饰器模式示例。你可以参考下面的结构。

带背景的父视图

->顶栏视图,背景为子视图

->以背景为子的内容视图

我试图创建类似于 Pro Objective C Design Patterns decorator 一书中的示例。我想使用 UIView 而不是 UIImage 视图,并且示例很复杂。如果装饰器不适用,请告诉我。

我自己尝试过,但似乎顶部栏覆盖了父视图。

【问题讨论】:

  • 什么是反对票?
  • 我猜是因为没有阅读help center。 StackOverflow 不是教程或资源站点。问题必须代表其他人可以重现的具体编程问题 - 包括相关的源代码、jsfiddle 或任何问题的上下文。这个问题太笼统或缺乏足够的信息来正确回答。提示 - 您可以通过添加您已经尝试过的内容来改写它并询问如何改进它。
  • 我认为这个问题是有效且足够清楚的。我不希望初学者理解这个问题。无论如何,我自己想出了答案。人家不看说明书。我们本可以一开始就弄清楚这一点,并在发布帖子之前设置严格的验证。
  • 您实际上可以从书中发布原始代码并询问如何将 UIImage 视图替换为 UIView。不要指望每个人都拥有这本书,并且可以背诵这个例子。使问题具有自我描述性,从而对更多人有用。 SO 的成员将不胜感激一些代码来提供提示。您的问题确实可以成为话题,但就目前而言,它看起来更像是要求资源或代码。其他有同样问题的人可能不会认为这与他们的问题有关。不过,我很高兴您找到了解决方案并分享了它。
  • (...继续,达到最大评论长度)在您的情况下,问题不在于您问的是什么,而是 如何。我希望您不要冒犯,因为我只是想帮助您遵守规则并避免提出被标记的问题。该网站拥有庞大的用户群,每分钟都会提出低质量的问题,并且版主确实在努力保持其整洁。

标签: ios objective-c design-patterns uiview decorator


【解决方案1】:

我必须解决这个问题。

首先我创建了协议所在的头文件。

@interface Window : NSObject
@end
@protocol Window <NSObject>
@optional
-(void)draw;
-(NSString*)getDescription;
-(UIView*)addView;
@end

创建了一个具体的窗口:

@implementation SimpleWindow
-(void)draw{
}

-(NSString*)getDescription{
    return @"simple window";
}

-(UIView*)addView{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 450)];
    [view setBackgroundColor:[UIColor orangeColor]];
     return view;
}

创建装饰器/视图功能/插件:

@implementation VerticalScrollBarDecorator
- (instancetype)initWithDecoratedWindow:(id<Window>)win
{
    self = [super init];
    if (self) {
        decoratedWindow = win;
    }
    return self;
}

-(void)draw{  
}

-(void)drawVerticalScrollBar{   
}

-(NSString *)getDescription{
    return  [NSString stringWithFormat:@"%@, %@",[super getDescription], @"including vertical scrollbars" ];
}

-(UIView*)addView{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 450)];
    [view setBackgroundColor:[UIColor greenColor]];
    UIView *superView = [super addView];
    [superView addSubview:view];
    return superView;
}

例如在 viewDidLoad 中实现它:

- (void)viewDidLoad
{
    [super viewDidLoad];
    id<Window> decoratedWindow = [[VerticalScrollBarDecorator alloc] initWithWindow:[[SimpleWindow alloc] init]];
    decoratedWindow = [[HorizontalScrollBarDecorator alloc] initWithWindow:decoratedWindow];
    NSLog(@"%@", [decoratedWindow getDescription]);
    [self.view addSubview:[decoratedWindow addView]];
}

这将导致一个主视图,其中一些视图添加为子视图。有很多方法可以实现相同的结果,但我想在 Objective C 上保持相同的模式,因为我也在为 Android 编写 Java。顺便说一句,这是基于 Wikipedia 中的 Java 示例。

【讨论】:

    猜你喜欢
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2017-10-24
    相关资源
    最近更新 更多