我想为我的子视图实现一个可选协议。 subview-class由uiviewcontroller继承,大多数viewcontrollers由此子视图继承。我认为这是一个简单的结构。
问题是:它只能在模拟器中运行。在设备上只显示第一个nslog,然后应用程序关闭。在模拟器上它工作正常。
它会是什么?
确定你知道,有些东西被注释掉了,但他们没有任何努力。
协议:
@protocol CustomGestures <NSObject>
@optional
-(void)nextPage;
-(void)previousPage;
@end
我的子视图控件的一部分
@implementation SubViewController
//handles gestures and passes them
//further to the superclass
//uiviwcontroller to take the normal behaviour
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
//pass the information to superclass
[super touchesEnded:touches withEvent:event];
//create object with protocol and some other objects
id<CustomGestures> gestures;
UITouch* touch = [touches anyObject];
CGPoint currentPosition = [touch locationInView:self.view];
CGFloat deltaX = gestureStartPoint.x - currentPosition.x;
CGFloat deltaY = fabs(gestureStartPoint.y - currentPosition.y);
//if the subclass (self) has the protocol implemented, use the protocoll-features
if ([self conformsToProtocol:@protocol(CustomGestures)])
{
if (deltaX <= -80 && deltaY <= 20) {
NSLog(@"vorige seite");
[gestures nextPage];
} else
if (deltaX >= 80 && deltaY <= 20) {
[gestures previousPage];
NSLog(@"nächste seite");
}
}
}
}
子视图的一部分
@interface NavInfos :
SubViewController <CustomGestures>{
....}
@implementation NavInfos
//CustomGestures-Protocol
-(void)nextPage{
NSLog(@"nächste seite im navinfos");
//[[TTNavigator navigator] openURLAction:[TTURLAction actionWithURLPath:@"tt://mapkit"]];//applyAnimated:YES]
}
-(void)previousPage{
NSLog(@"vorige seite im navinfos");
//[[TTNavigator navigator] openURLAction:[TTURLAction actionWithURLPath:@"tt://windows"]];
//applyTransition:UIViewAnimationTransitionFlipFromLeft] applyAnimated:YES]
}
答案 0 :(得分:2)
首先,由于您将这两种方法声明为@optional
,因此对conformsToProtocol:
的检查不足以验证它们是否响应了相关方法。您应该删除@optional
关键字或添加支票respondsToSelector:
以及conformsToProtocol:
优惠。
至于你的问题,你没有设置任何手势,但无论如何你都在调用方法。您想将其设置为某些内容(例如,自己)或将两个来电从[gestures ...]
切换为[self ....]
。