0 votes

Une façon plus propre de faire en sorte que le setter du contrôleur propage explicitement le changement au CALayer.

Mon précédent question a demandé un moyen de garder une vue de texte et un curseur en synchronisation avec les liaisons lors de la modification de la valeur "x" d'un CGRect.

En suivant les conseils de Peter Hosey sur l'utilisation du setter du contrôleur pour propager ces changements au CALayer, j'ai obtenu ce qui suit :

@interface WindowController : NSObject {
  CALayer *layer;
  float frameOriginX;
}
@end

@implementation WindowController
...
-(void)setFrameOriginX:(id)value {
  [layer setValue:[NSNumber numberWithFloat:[value floatValue]] 
       forKeyPath:@"frame.origin.x"];
  frameOriginX = [value floatValue];

}

-(float)frameOriginX {
 return [[layer valueForKeyPath:@"frame.origin.x"]floatValue];
}
@end

J'ai utilisé des liaisons pour connecter l'affichage du texte et le curseur à "self.frameOriginX" et tout fonctionne : les deux contrôles se mettent à jour mutuellement. Cependant, je me demandais quelle était la meilleure façon de procéder.

Merci,

Charles

0voto

Peter Hosey Points 66275

Tout d'abord, pourquoi setFrameOriginX: prendre un id y frameOriginX retourner un float ? KVC n'appréciera pas cela. De plus, vous devriez utiliser CGFloat pas float .

Une fois que tu as réparé ça, tu as de la chance. Aujourd'hui, Colin Barrett a diffusé SSGeometryKVC . Avec cela, votre passeur devient :

-(void)setFrameOriginX:(CGFloat)newX {
    frameOriginX = newX;
    [[layer mutableRectValueForKey:@"frame"].x = frameOriginX;
}

Notez que ni cette implémentation ni votre implémentation originale ne sont sûres pour les fils. Ce n'est pas un problème tant que seuls les contrôles l'appellent.

J'ai utilisé des bindings pour connecter la vue texte et le slider à "self.frameOriginX"

Hein ? Si vous les avez liés au contrôleur, vous n'avez pas besoin de self. aquí.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X