2009-09-10 18 views

Répondre

4

Vous pouvez ajouter une fonction - (void) initWithView: (EchiquierDisplayView *) aSuperview ou quelque chose comme ça, définir une référence dans votre

@interface pieceDraggableImageView : UIImageView { 
CGPoint startLocation; 
CGPoint startLocationInView; 
EchiquierDisplayView *theSuperview; 
} 

@property (nonatomic, retain) EchiquierDisplayView *theSuperview; 

-(void)correctDestinationPosition; 
-(void)initWithView:(EchiquierDisplayView *)aSuperview; 
... 
-(void)askSuperview; 
@end 

@implementation pieceDraggableImageView 

... 
-(void)initWithView:(EchiquierDisplayView *)aSuperview 
{ 
    theSuperview = aSuperview; 
} 
... 
-(void) correctDestinationPosition 
{ 
    [theSuperview correctIt]; 
} 

maintenant être sûr de mettre en œuvre la fonction correctIt dans votre superview. Si tout va bien je compris votre droit de question ...

+0

bonjour, je ai essayé votre Sugestion. je peux maintenant accéder à [theSuperview correctIt]; et il compile correctement. Mais je ne peux voir aucune correction. même pas les journaux de bord. Pensez-vous à quelque chose que je devrais vérifier ?? merci encore – kossibox

+0

Je pense que vous devriez rafraîchir votre vue en appelant correctDestinationPosition après la correction [self setNeedsDisplay: YES]; –

4

Les UIViews n'ont aucune connaissance de leurs contrôleurs de vue. Vous devrez créer une sous-classe UIView personnalisée qui conserve une référence à un (ou potentiellement plus d'un) contrôleur de vue, bien que cela introduise un couplage supplémentaire entre UIView et UIViewController.

Vous devez envisager d'implémenter la méthode dans la classe superview ou view plutôt que de l'implémenter dans un contrôleur de vue.

7

Généralement, cela est fait par les délégués.

Demandez à votre interface d'affichage de définir un protocole et une référence à un délégué. Ensuite, demandez à votre viewcontroller parent d'implémenter ce protocole.

le parent ferait ceci:

someView.fooDelegate = self; 

alors la vue ferait quelque chose comme ceci:

if(self.fooDelegate != nil) { 
    if([fooDelegate respondsToSelector:...]) { 
     [fooDelegate performSelector:...]; 
    } 
} 

Ce n'est pas compilé, mais je pense que vous obtenez l'essentiel.

1

Voici une autre façon:

SuperviewsViewController *controller = self.superview.nextResponder; 

if (controller && [controller isKindOfClass:[SuperviewsViewController class]]) 
{ 
    [controller method]; 
} 

Il devrait fonctionner dans la plupart des cas.

Apple's UIResponder Reference