Sir*_*III 5 protocols objective-c nsarray ios
我想允许不同观点之间的沟通.
我有两个较小的视图,位于更大的视图之上,类似于iOS的视频播放器,但有一些差异.当我点击较大的视图时,我想要切换视图外观,隐藏或取消隐藏.我有一个所有视图都符合的协议.我想将视图添加到我将调用的另一个类中,该类HideViewsService
具有NSArray
属性.我可以强制使用此类的HideViewsService
类,并添加视图,以仅添加符合此协议的视图吗?甚至只是UIViews
?
另外,我想在我知道所有的视图上调用一个方法,但我不知道如何通过编译器获取.这是我的-hideAllViews
方法:
-(void)hideAllViews
{
for(int i=0; i<self.viewArray.count; i++)
{
id obj = [self.viewArray objectAtIndex:i];
if([obj isKindOfClass:[UIView class]] == false)
{
return;
}
UIView *view = (UIView *)obj;
if([view respondsToSelector:@selector(hide)])
{
[view hide]; // the compiler obviously doesn't like this
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!!我还在学习,所以请告诉我是否有更好的方法(不仅更容易,而且更好).
ObjC没有泛型.如果有的话,有时会很好,但事实并非如此.但是上面的设计有几个问题.
首先,如果viewArray
应该只包含UIView
对象,那么它包含其他任何内容都是一个编程错误.这是不正常,只是return
如果你发现事实并非如此.如果你要在这里检查一下,它应该是NSAssert()
.同样,如果所有内容都viewArray
应该响应hide
,那么你不应该跳过它,如果没有的话.这是许多微妙错误的根源.
更好的解决方案是在添加对象时控制对象的添加HideViewsService
(尽管有更好的方法可以做到这一点;我们将会这样做).
@protocol XYZHideableView <NSObject>
- (void)hide;
@end
@interface XYZHideViewsService
- (void)addHideableView:(id<XYZHideableView>)view;
- (void)removeHideableView:(id<XYZHideableView>)view;
@end
Run Code Online (Sandbox Code Playgroud)
现在,您不必担心是否viewArray
包含响应的内容hide
.
也就是说,我通常会这样做NSNotificationCenter
.可隐藏的视图应该观察到类似的通知XYZHideAllHideableViews
.当他们设置它时,他们应该隐藏自己.那你就不需要了HideViewsService
.你只需要一个+[HideableView hideAllHideableViews]
类方法.
归档时间: |
|
查看次数: |
1199 次 |
最近记录: |