【问题标题】:Subclass a Delegate?子类化一个代表?
【发布时间】:2012-05-26 13:24:53
【问题描述】:

我有一个名为ToolbarView 的类,它是UIView 的子类,基本上创建了一个UIView,其顶部有一个消失/重新出现的UIToolbar。我还有一个名为DraggableToolbarViewToolbarView 子类,它使用户能够在屏幕上拖动视图。

我需要为ToolbarView 创建一个委托,以便它可以在工具栏重新出现和消失时通知另一个对象/类。我还需要为DraggableToolbarView 创建一个委托,以便在拖动视图时通知另一个对象/类。

目前,我为每个委托创建了一个单独的委托,但我想知道是否有更好的模式?也许为ToolbarView 实现一个委托,并将DraggableToolbarView 的委托方法列为可选?或者有没有办法对委托进行子类化?

实现此目的最好/最干净的方法是什么?

【问题讨论】:

    标签: iphone ios cocoa-touch design-patterns delegates


    【解决方案1】:

    如果您为您的委托方法创建一个协议(无论如何总是一个好主意),您可以让另一个协议采用第一个。这建立了一种类似继承的关系:

    @protocol ToolbarViewDelegate
    // some methods
    @end
    
    @protocol DraggableToolbarViewDelegate <ToolBarViewDelegate>
    // additional methods
    @end
    

    【讨论】:

    • @RichardJ.RossIII 实际上一点也不。确实会时不时地发生两个人会同时提供相似的答案,尤其是当有一个规范的答案时。坦率地说,我认为我的答案稍微好一点,因为协议的名称更合适。
    • 它使用正确的术语来表示协议之间的关系。
    • @Caleb - 我试过以这种方式实现,但我没有让它工作。我在另一个问题 (stackoverflow.com/questions/10768884/…) 中列出了我的大部分代码,你有没有机会看看?
    【解决方案2】:

    是的,您可以使用inheriting 协议:

    @protocol Proto1 
    
    @reqired
    -(void) somethingHappened:(id) sender;
    
    @optional
    -(void) somethingElseHappened:(id) sender;
    
    @end
    
    @protocol Proto2<Proto1>
    
    // this now contains all of the method signatures found in proto1, with the addition of new ones!
    
    -(void) somethingSpecialHappened:(id) sender;
    
    @end
    

    【讨论】:

    • 它们必须在同一个文件中吗?我已经为 DraggableToolbarView 尝试过这个,但它没有实现 ToolbarView 方法。
    • @CoDEFRo 它不会自动实现协议,它只是广播它们在那里。您仍然必须为每个添加实现。
    • +1 只是因为我认为您至少应该与@Caleb 的答案相同,因为两个答案几乎相同
    【解决方案3】:

    我认为你做得对。

    考虑UITextView,它是UIScrollView 的子类。每个都有自己的委托协议,负责对一组特定的消息做出反应。只要您将可见性和拖动视为单独的关注点,允许不同的对象处理它们的委托似乎是合乎逻辑的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多