2013-09-03 3 views
0

chers maîtres ObjectiveC, Je suis un programmeur de pomme débutant et que je prends actuellement un diplôme de maîtrise en enseignement des mathématiques, je veux le faire une thèse sur faire des applications qui repose sur l'éducation mathématique ..Dessin avec drawRect

En ce moment, j'essaie de faire une application iPad qui dessine une fonction sinusoïdale et transforme ensuite la fonction sinusoïdale. Je dessine le graphique sinus en remplaçant la fonction drawrect dans une classe uiview personnalisée et la charge sur un objet uiview. La fonction sinus est bien dessinée sur un contexte, avec des grilles et des axes qui sont dessinés sur des contextes différents.

J'ai mis plusieurs curseurs, puis j'ai prévu d'utiliser les curseurs pour changer les variables de la classe uiview que j'utilise pour dessiner. Maintenant, voici le problème, je me rends compte que je ne peux pas accéder aux variables dans le viewcontroller de la classe uiview personnalisée, et je soupçonne que j'ai peut-être mal utilisé le mauvais paradigme en écrivant le programme entier.

Quelqu'un peut-il m'aider à résoudre la confusion ici? Il ne doit pas être dans les codes exacts mais plutôt dans les grandes images de la façon dont je devrais dessiner et redessiner la fonction sinus sur un objet de vue tout en changeant les variables de la fonction sinus à travers les curseurs.

Nous vous remercions de votre aimable aide :) Chandra d'Indonésie.

+0

Bonjour Pii, y a-t-il encore des questions ouvertes? – JFS

Répondre

1

Il y a deux façons de résoudre ce:

  1. Au lieu de laisser la UIView demander les valeurs du UIViewController, vous pouvez également pousser les valeurs au UIView le moment l'un des changements de curseurs. De cette façon, UIView fait ce qu'il doit faire: dessiner ce que le ViewController lui demande. Pensez à une fonction telle que redrawUsingNewValues: que vous implémentez dans UIView et que vous appelez à partir de UIViewController.

  2. Utiliser la délégation. Si vous voulez vraiment contrôler UIView, vous pouvez lui donner un pointeur vers UIViewController en utilisant la délégation. De cette façon, UIView ne possède pas UIViewController, mais vous pouvez obtenir les valeurs souhaitées. Une introduction sur la délégation se trouve ici: Delegation and the Cocoa Frameworks

Bonne chance dans votre programme!

+0

Jacco .. Merci pour votre réponse .. Je n'ai pas utilisé la délégation autre que pour la libération du clavier, LoL .. Je suppose que je dois laisser de côté pour un moment pour étudier plus sur la délégation-thingy alors .. Est-ce la «bonne» façon ou serait-il plus facile si je reporte juste à explorer le thingy de la délégation et juste pousser cette valeur comme ce que vous avez dit dans # 1? –

+0

iOS est fortement basé sur MVC (Model-View-Controller). Dans ce cas, cela signifie que vous voulez que viewCONTROLLER contrôle la vue (ce qu'il y a dans un nom;)) Je vous recommande de garder la vue aussi stupide que possible (affichage uniquement) et de garder le contrôle de ViewController . Cela signifie que l'option n ° 1 est la voie à suivre. 1. créez les variables dont vous avez besoin sur votre UIView en tant que propriétés publiques 2. remplissez votre fonction drawrect pour utiliser ces variables 3. lorsqu'un curseur change, changez les variables de votre UIView dans le ViewController 4. appelez [yourView drawrect ] pour redessiner – Jacco

+0

C'est tout à fait vrai! Il m'est toujours difficile d'appliquer le modèle MVC, parce que je veux juste tout faire sans même penser au rôle de chaque classe. Votre sagesse me donne un aperçu! LOL ... Merci beaucoup :) –

0
  1. Procédé de la UIViewController devrait reconnaître lorsque les valeurs de curseur modifie
  2. la même méthode devrait déclencher une autre methode à l'intérieur de la UIViewController pour mettre à jour/recalculer les valeurs de fonction sinus (par exemple, la création d'un tableau de valeurs)
  3. à la fin de la mise à jour-Methode les valeurs nécessaires sont transférées au UIView par une sortie de UIViewController au UIView (le UIView est une propriété de la UIViewController)
  4. le UIView dessine la nouvelle fonction sinus en tirage rect

Edit 1: votre ViewController.h:

#import <UIKit/UIKit.h> 
@class YourGraphUIView; // that's you view where you draw 

@interface ResultViewController: UIViewController 

@property (weak, nonatomic) IBOutlet UISlider *valueFromSlider; //bound to your UISlider 
@property (weak) IBOutlet YourGraphUIView *yourGraphUIView; //bound to your costumUIView 
@property (nonatomic, retain) NSNumber *graphValue; 

- (IBAction)takeSliderValue:(id)sender; //bound to your UISlider 

@end 

votre ViewController.m:

#import "ResultViewController.h" 
#import "YourGraphUIView.h" 

@interface ResultViewController() 

@end 

@implementation ResultViewController 
@synthesize yourGraphUIView, valueFromSlider, graphValue; 

- (IBAction)takeSliderValue:(UISlider *)sender{ 

graphValue = [NSNumber numberWithDouble:[(double)sender.value]]; //takes value from UISlider 
yourGraphUIView.graphValue = graphValue; //gives the value to the yourGraphUIView 
[self.yourGraphUIView setNeedsDisplay] //<--- important to redraw UIView after changes 
} 
end 

votre YourGraphUIView.h:

#import <UIKit/UIKit.h> 

@interface YourGraphUIView : UIView 

@property(nonatomic, retain)NSNumber *graphValue; 

- (void)drawRect:(CGRect)dirtyRect; 

@end 

votre YourGraphUIView.m:

#import "YourGraphUIView.h" 

@implementation YoutGraphUIView 

@synthesize graphValue; 

//... init, draw rect with using the graphValue for calculating and updating the graph 

end; 

J'espère que cela a aidé. Vous devriez voir comment créer l'interface graphique et comment connecter les UIViews. Vous devez également définir les classes personnalisées pour ViewController et YourGraphUIView. Bonne chance!

+0

Merci pour votre réponse, JFS! Je ne sais pas si j'ai saisi ton idée ... C'est juste que je suis encore très nouveau sur ce truc Xcode, et je n'ai pas encore la grande image claire de comment je devrais vraiment travailler .. Je ne veux pas pour développer une mauvaise habitude de faire des patchs pour couvrir les trous dans mon programme .. Tant de tutoriels et de livres à étudier, mais je ne peux pas attendre pour terminer tous ces matériaux d'abord .. J'espère que vous comprenez ce que je voulais dire .. –

+0

Hou la la! Merci de l'avoir écrit pour moi .. Je reçois votre idée de passer la propriété .. Je l'ai essayé, et j'ai reçu un message d'erreur dit que Xcode ne pouvait pas trouver la propriété sur cet objet même si j'avais importé l'interface utilisateur classe personnalisée et synthétisé la propriété .. Une idée de ce qui ne va pas? Une autre question concerne l'objet NSNumber que vous avez créé, doit-il être un objet afin qu'il puisse avoir la propriété conserver sur sa propriété à transmettre le long des classes? J'ai essayé de passer la propriété CGpoint mais je ne pouvais pas, je pensais que c'était parce que ce n'était pas un objet? Pardonnez mon esprit encombré, hehe .. –

+0

Il est difficile de dire où le problème est sans le code. Avez-vous lié l'UIView au ViewController et avez-vous défini la classe personnalisée sur UIView et UIViewController? La valeur ne doit pas nécessairement être un objet, elle peut aussi être primitive. Mais sachez que 'CGPoint' n'est pas juste un var' La structure de données CGPoint représente un point dans un système de coordonnées bidimensionnel .' – JFS