2009-11-21 11 views
2

Je suis un débutant complet à Objective-C, venant d'un arrière-plan de PHP, des dialectes assortis de BASIC, et une poignée de C/C++. Bien que je sois assez clair sur la configuration des fenêtres de base dans Interface Builder, j'ai du mal à manipuler le contenu des champs de texte, en particulier en appelant des valeurs et en leur envoyant des valeurs. J'utilise un modèle d'application de base Xcode Cocoa sans extras et j'ai créé une classe Cocoa appelée "controller.h". Dans Interface Builder, j'ai mis en place une fenêtre avec un champ de texte sécurisé, un objet NSTextField de base et un bouton poussoir pour soumettre le formulaire. Ma classe de contrôleur est comme ceci:Affectation de valeurs variables à NSTextFields dans Objective-C

//controller.h 
#import <Cocoa/Cocoa.h> 

@interface controller { 
    IBOutlet id userInput; 
    IBOutlet id userOutput; 
} 
- (IBAction)submitButton:(id)sender; 
@end 

//controller.m 
#import "controller.h" 

@implementation controller 
- (IBAction)submitButton:(id)sender { 
    NSBeep(); 
    [userOutput setStringValue: userInput]; 
    [userInput setStringValue:nil]; 
} 
@end 

Je UserInput liée à la zone de texte sécurisé et userOutput lié à la NSTextField. submitButton est lié au bouton-poussoir. Selon ma compréhension de la façon dont les choses fonctionnent, cela devrait affecter la valeur du texte sécurisé dans userInput à userOutput, mettant ainsi à jour ce qui est affiché dans NSTextField, puis réinitialiser le champ. Le bip est là pour me faire savoir si la fonction est appelée.

Le bip ne s'éteint pas, ce qui signifie que rien ne se passe. Interface Builder a construit les fichiers, donc je sais qu'ils ont été définis correctement et sont connectés aux bons endroits. Comment puis-je le corriger pour que IBAction s'exécute et que les valeurs soient envoyées là où elles doivent être?

Répondre

1

Une façon plus efficace de voir si elle est appelée est de définir un point d'arrêt (double-cliquez dans la gouttière à gauche de l'éditeur) et de déboguer l'application à la place. La première suggestion est toujours de vérifier vos connexions.

De plus, vous voudrez probablement utiliser cette ligne à la place: (. Notez que -stringValue est héritée de NSControl, tout comme -setStringValue: est)

[userOutput setStringValue:[userInput stringValue]]; 


EDIT: Il peut vous aider à vous assurer que vous êtes en train d'instancier l'objet contrôleur. Vous pouvez ajouter une méthode -awakeFromNib au contrôleur et y placer un point d'arrêt pour voir si c'est le cas. (Voir http://www.cocoadev.com/index.pl?AwakeFromNib) Si cette méthode n'est pas appelée, alors les connexions spécifiées dans IB ne seront pas faites non plus.

+0

Nous vous remercions de votre aide concernant la question du champ de texte et de l'utilisation des ruptures! Avez-vous une idée de la raison pour laquelle l'IBAction ne fonctionne pas, par hasard? – Kaji

+0

Pas de problème. J'ai mis à jour ma réponse avec une autre idée. Les problèmes liés à l'IB sont assez difficiles à déboguer sans être réellement devant l'écran, mais j'espère que cela aidera. –

+0

D'accord, j'ai traversé et bricolé comment j'ai défini et connecté les prises et les actions dans la définition de la classe, et tout semble fonctionner maintenant! awakeFromNib activé, et ainsi j'ai enlevé cette ligne et ai placé la fonction de bouton à [userOutput setStringValue: [userInput stringValue]]; et il fait exactement ce qu'il est censé faire maintenant. Merci beaucoup! – Kaji