2012-05-26 26 views
2

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

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

目前,我已创建为每个单独的委托,但我不知道是否有这个更好的模式?可能需要为ToolbarView实施一个代理,并将代理方法DraggableToolbarView列为可选项?或者有没有一种方法来委托一个委托?

什么是最好的/最干净的方式来实现这一目标?

回答

5

如果您为您的委托方法的协议(反正总是一个好主意),你可以有其他协议采用第一种。这建立了一种类似遗产的关系:

@protocol ToolbarViewDelegate 
// some methods 
@end 

@protocol DraggableToolbarViewDelegate <ToolBarViewDelegate> 
// additional methods 
@end 
+0

嗯..复制我的答案很多?? –

+3

@ RichardJ.RossIII实际上并非如此。它不时发生,两个人几乎同时会提供类似的答案,特别是当有一个规范的答案时。坦率地说,我认为我的答案稍微好一些,因为协议的名称更合适。 – Caleb

+1

它使用协议之间的关系正确的术语。 –

4

是的,你可以有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 
+0

他们是否必须在同一个文件?我试过这个DraggableToolbarView,它没有实现ToolbarView方法。 –

+0

@CoDEFRo它不会自动实现这些协议,它只是广播他们在那里。您仍然必须为每个添加实现。 –

+0

+1只是因为我认为你应该至少有@ Caleb的答案相同的点,因为两个答案几乎相同 – abbood

0

我觉得你这样做是正确的。

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