2010-08-02 6 views
0

Je voulais implémenter un protocole optionnel pour mes sous-vues. la classe subview est héritée par uiviewcontroller et la plupart des viewcontrollers sont hérités par cette sous-vue. Je pense que c'est une structure simple.iphone: protocole fonctionne en simulateur, mais pas sur le périphérique - je ne sais pas plus loin

le problème est: il ne fonctionne que dans le simulateur. Sur un périphérique, le premier nslog apparaît, puis l'application se ferme. sur le simulateur, cela fonctionne bien. Que pourrait-il être?

bien sûr que vous voyez, que certaines choses sont commentées, mais ils n'ont aucun effort.

le protocole:

@protocol CustomGestures <NSObject> 

@optional 

-(void)nextPage; 
-(void)previousPage; 

@end 

parties de mon subviewcontroller

@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"); 
      } 
     } 

    } 
} 

parties d'un sous-vue

@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

merci Vladimir d'avoir corrigé ça. sur n'importe quel autre navigateur que j'utilise que safari, le formatage ne fonctionne pas correctement – nico

Répondre

2

Tout d'abord, puisque vous déclarer ces deux méthodes comme @optional un chèque à conformsToProtocol: est pas assez pour vérifier qu'ils répondent aux méthodes en question. Vous devez supprimer le mot-clé @optional ou ajouter un chèque au respondsToSelector: ainsi qu'à l'offre conformsToProtocol:. En ce qui concerne votre problème, vous ne définissez rien sur les gestes, mais vous appelez des méthodes de toute façon. Vous voulez le définir sur quelque chose (par exemple, vous-même) ou basculer les deux appels de [gestures ...] à [self ....].

+0

au respontsToSelector: j'ai aussi eu cette idée avant - peut-être que je me trompe, mais si j'init une variable avec le protocole, c'est toujours vrai, même si le sous-classe n'a pas mis en œuvre cela. peut-être, je fais une erreur fondamentale. dans la ligne UIViewController: SubViewController: anyViewController je veux, que SubViewController implémente un geste-aknowledge comme ci-dessus en tant que protocole optionnel. donc si anyViewController a le protocole implémenté, je veux qu'il soit appelé. s'il n'est pas implémenté, il ne devrait pas être appelé - ou mieux un code standard pourrait être appelé. mais pour la seconde, je n'ai pas d'idée – nico

+0

> Vous voulez définir quelque chose (par exemple, vous-même) ou passer les deux appels de [gestes ...] à [auto ....]. c'était ça, pas de définition d'un objet, c'était une mauvaise idée – nico

+0

Non, un protocole avec des déclarations facultatives n'a pas besoin de les déclarer, et vous devez vérifier leur existence, ou risquer de planter. Croyez-moi, j'ai écrasé celui-là. :) – Kalle

Questions connexes