2009-07-05 6 views
3

J'ai créé un solveur d'équations quadratiques pour l'iPhone et lorsque la zone de texte est cliquée, mon propre clavier personnalisé apparaît. J'ai un bouton qui change si le nombre est positif ou négatif. En ce moment je ce qui se passe est que lorsque le bouton est pressé (0 - valeur actuelle du texte) est ce qui est affiché dans la zone de texte, donc si le nombre est positif, il deviendra négatif et s'il est négatif, il deviendra positif. J'ai quelques problèmes à faire cela donc ce que je voulais faire est de mettre un signe moins au début de la chaîne si le nombre est positif et si le nombre est négatif, le signe moins sera supprimé. Quelqu'un peut-il me donner des conseils à ce sujet?Objectif C - Ajout de caractères à des parties spécifiques d'une chaîne

Répondre

3

au lieu de nier l'aide d'une mathématique J'ai affecté un NSMutableString à mon UITextField puis j'ai inséré un signe "-" en utilisant insertString: atIndex: puis j'ai réaffecté la chaîne changée à mon UITextField Pour basculer entre positif et négatif, j'ai créé une fonction if si la valeur float de mon textfield est greate r ou égal à 0, un "-" est inséré mais si la valeur flottante de mon champ de texte est inférieure à zéro, le "-" est supprimé en utilisant deleteCharactersInRange.Voici mon code tel qu'il est:

- (IBAction)positivity{ 

    NSMutableString *a = [NSMutableString stringWithString:aVal.text]; 


    if([aVal.text floatValue]>=0){  
    [a insertString: @"-" atIndex: 0]; 
    aVal.text = a; 
    } 
    else if([aVal.text floatValue]<0){ 
     NSRange range = {0,1}; 
     [a deleteCharactersInRange:range]; 
     aVal.text = a; 
} 

} 

aVal est le nom de l'UITextField que je change.

2

Alors que pourrait manipuler directement une représentation sous forme de chaîne d'une valeur numérique, une telle approche est une mauvaise idée. Non seulement c'est moins efficace que d'autres alternatives, mais potentiellement incorrect. (Par exemple, @Ken réponse de se traduirait par deux signes moins.)

Qu'est-ce que vous voulez sans doute faire est nie la valeur numérique (il suffit de multiplier par -1, ou soustraire de 0 comme vous avez suggéré) et refléter ce changement dans l'interface (vous mentionnez une zone de texte).

Si vous utilisez des contrôles Cocoa standard (qui héritent de NSControl, comme le fait NSTextField), je suggère d'utiliser -[NSControl setIntegerValue:] pour modifier le texte du champ de texte. Si vous (pouvez) bien diviser votre interface utilisateur et avoir un champ de texte pour chaque variable dans l'équation quadratique, cela devrait être assez simple. (Si vous utilisez autre chose qu'une valeur entière, utilisez quelque chose comme -setDoubleValue: ou -setFloatValue: à la place.)

Si vous devez créer votre propre chaîne au préalable, en utilisant un spécificateur de format entier affiche un « - » signe automatiquement le cas échéant . Veillez à utiliser %ld au lieu de %d (merci, @Peter!) Comme spécificateur de format pour les valeurs NSInteger pour éviter de tronquer éventuellement les valeurs supérieures à 32 bits. Par exemple:

NSString *result = [NSString stringWithFormat:@"%ld", nsIntegerValue]; 

Dans un sens plus général, si vous avez besoin d'insérer une chaîne dynamique obtenue (et pas seulement quelque chose pour lequel vous pouvez créer une chaîne de format au moment de la compilation), vous pouvez également utiliser un NSMutableString et son méthodes -appendString: et -insertString:atIndex: ainsi.

+4

Une correction mineure:% d est un int, pas NSInteger. Utilisez% ld (long int) à la place. Sur un Mac 64 bits, NSInteger est 64 bits, donc si vous utilisez% d, les nombres hors de la plage d'un entier 32 bits seront tronqués aux 32 bits inférieurs. –

+0

Bonne capture Peter, incorporant cela dans ma réponse. –

2

Une alternative à l'approche en chaîne droite est de ne pas utiliser une chaîne. Il y a quelque temps, j'ai écrit une calculatrice graphique pour iPhone qui stockait l'équation en interne dans un NSMutableArray de NSStrings. Chaque emplacement du tableau correspond à un élément de l'équation, comme "x", "^", "sin (", etc.

Lorsque je devais annuler l'équation, il était beaucoup plus facile de dire à la matrice à insertObject: @ « - » atIndex. 0 que d'essayer de l'insérer directement dans la chaîne Ensuite, chaque fois que le tableau a été changé, je viens refais la chaîne d'équation comme ceci:

NSString * newEquation = [equationElements componentsJoinedByString:@""]; 
+0

Si le demandeur est en train de résoudre * l'équation * quadratique (comme implicite) la formule sera fixée, mais en utilisant un tableau pour les éléments d'équation est certainement une idée intéressante. Très sympa! –

Questions connexes