2009-10-13 6 views
0

J'ai une tableview. Une des colonnes de la tableView utilise un NSLevelIndicatorCell. Je veux pouvoir autoriser l'utilisateur à éditer les valeurs d'avertissement et critiques pour l'indicateur de niveau de sorte que quand ils entrent une valeur dans une zone de texte "niveau d'avertissement", cela change la valeur d'avertissement des indicateurs de niveau affichés dans TOUTES les lignes de tableview. Je suis un débutant avec Objective-C, donc tout ce que je peux comprendre jusqu'à présent, c'est que je dois avoir besoin d'une méthode de délégué pour regarder le textbox MAIS si je réussis à le faire, comment diable puis-je envoyer le nouveau valeur à la colonne tableview particulière de sorte que la mise à jour arrive à TOUTES les lignes (c'est-à-dire comment envoyer quel message à la tableview et cibler une cellule dans une colonne dans une vue de table)?Comment définir les valeurs de Cocoa NSLevelIndicatorCell?

Voici le code de la solution que j'ai trouvée si quelqu'un en avait besoin.

- (IBAction)setWarningLevel:(id)sender { 
    double v; 
    NSScanner *ns = [NSScanner scannerWithString:[warnLevel stringValue]]; 
    [ns scanDouble:&v]; 
    [levelIndicator setWarningValue:v]; 
} 
+0

Probablement un peu beaucoup - jetez un oeil à ma réponse pour une manière plus simple. – Abizern

Répondre

2

Ceci est un cas d'école pour utiliser Cocoa bindings. Il suffit de lier la valeur du champ de texte au NSLevelIndicatorCell dans votre vue de table (faites-le dans Interface Builder). Les mises à jour devraient avoir lieu automagiquement.

I pense devrait s'appliquer à toutes les cellules de la vue tableau si vous appliquez la liaison à la cellule dans IB. Toutefois, si ce n'est pas le cas, vous devrez écrire quelques lignes de code qui définissent la liaison chaque fois qu'une nouvelle ligne de la table est créée. Ce lien expliquera tout en détail, mais vous allez fondamentalement mettre en place une relation Key-Value Observer dans le code entre le champ de texte et l'instance de l'indicateur de niveau dans la ligne en cours de création.

+0

Merci pour votre aide rapide. Pendant que j'attendais, j'espère avoir une réponse, j'ai réussi à me débrouiller (je suis toujours sous le choc que je l'ai compris - je n'ai codé l'objectif-C que depuis 2 jours). Et oui, il s'applique automagiquement à toutes les lignes! Voici ma solution (au cas où cela aiderait quelqu'un): - (IBAction) setWarningLevel: (id) expéditeur { \t double v; \t NSScanner * ns = [NSScanner scannerWithString: [warnLevel chaîneValeur]]; \t [ns scanDouble: &v]; \t [levelIndicator setWarningValue: v]; } – Steve

+0

Hey, vous voudrez peut-être ajouter votre solution à votre question, car personne ne peut lire ce désordre de code non formaté que vous mettez dans votre commentaire. =) –

1

Je pense que vous avez peut-être surfait. NSTextField sous-classe NSControl, vous devez donc rechercher dans les docs de NSControl une fonction utile.

Essayez de le réécrire comme ceci; en supposant que vous prenez la valeur d'un champ de texte warnLevel.

- (IBAction)setWarningLevel:(id)sender { 
    double v = [warnLevel doubleValue]; 
    [levelIndicator setWarningValue:v]; 
} 

Bien que cela soit généralement raccourci à ceci;

- (IBAction)setWarningLevel:(id)sender { 
    [levelIndicator setWarningValue:[warnLevel doubleValue]]; 
} 

Vous devriez probablement avoir une validation que le champ de texte a un nombre valide. Si vous ne choisissez que quelques chiffres, jetez un oeil à l'aide d'un contrôle pas à pas.

Habituellement, avec le cacao, si vous avez l'impression de sauter trop de cerceaux, il y a parfois un moyen plus facile.

Habituellement ;-)

+0

Merci! Certainement une amélioration. Je suis encore dans ma phase d'apprentissage avec Objective-C (je viens juste de commencer à travailler dessus dimanche dernier) et c'est toujours une corvée d'apprendre ce qui est disponible dans une nouvelle langue (ie je sais ce que je veux faire, Je sais comment je le ferais en C ou en Pascal ou en PHP mais que diable Objective-C appelle-t-il?). J'y arriverai éventuellement !! – Steve

Questions connexes