2009-11-01 7 views
0

Comment obtenir la valeur textuelle d'un objet afin de l'afficher dans un tableau? D'autres messages disent que les objets ne sont pas NSStrings et vous devez demander à l'objet son texte. Mais comment? L'erreur est la suivante:Comment obtenir la valeur textuelle d'un objet?

* Mettre fin application en raison d'une exception non interceptée 'NSInvalidArgumentException', raison: '* - [Noms isEqualToString:]: sélecteur non reconnu envoyé à l'instance 0xf51b60'

pour cette code Objective-C:

NSString *cellValue = [namesArray objectAtIndex:indexPath.row]; 
cell.textLabel.text = cellValue; 
return cell; 

Mes excuses à tous vous programers avancés, je suis novice en la matière et ne pouvait pas trouver la réponse dans la documentation NSObject non plus. Merci.

+0

Quel est le type de l'objet? Il n'y a pas de «valeur textuelle» canonique pour un objet, donc plusieurs méthodes peuvent correspondre à la facture. Un paramètre commun est '-stringValue'. – outis

+0

Un autre est '-description'. – outis

+0

@outis: Non, un-common est '-description', qui est implémenté dans' NSObject', et quelles classes remplacent généralement. Il renvoie une chaîne. – jbrennan

Répondre

0

Lorsque vous souhaitez afficher un objet avec NSLog() et le format "%@", la méthode utilisée est -(NSString*) description si elle existe. Il est de votre responsabilité d'écrire cette méthode pour vos propres cours.

+0

Merci. Va essayer et voir ce qui se passe. – Doug

3

Vous pouvez utiliser la méthode -description pour obtenir la valeur de chaîne d'un objet, similaire à toString() en Java. De nombreuses classes répondent également à la méthode -stringValue.

Toutefois, -description est utilisé principalement à des fins de débogage. Si le code que vous avez posté ne fonctionne pas, cela signifie que namesArray contient autre chose que NSString instances, auquel cas vous aurez besoin de savoir quel type d'objets sont dans votre tableau; vous ne pouvez pas simplement lancer un objet sur NSString.

+0

A l'origine, le code fonctionnait lorsque j'avais des noms de chaînes dans le code et ils s'affichaient correctement dans la table. Mais j'ai supprimé les noms de chaînes maintenant et j'essaie d'utiliser CoreData où l'utilisateur entre les noms, ils sont enregistrés, récupérés, puis affichés dans la table. Oui, namesArray est supposé contenir des chaînes, donc peut-être que c'est un problème CoreData qui ne fonctionne pas encore, ou j'ai besoin d'une méthode stringValue. – Doug

+0

Selon le message d'erreur vous avez une classe appelée "Noms" que vous traitez comme une chaîne, d'où l'erreur. – Darren

2

Je sens que les réponses à ce jour manquent le point de la question. Votre erreur indique que la classe Names n'implémente pas la méthode isEqualToString:. Ceci est appelé (vraisemblablement) parce que le UITableViewCell change seulement le text de son textLabel si la chaîne est différente de ce qui est affiché, et il effectue cette comparaison en utilisant isEqualToString:, parce que cell.textLabel.text est une propriété NSString. Cependant, vous ne lui donnez pas NSString. Vous lui donnez un objet Names, alors bien sûr ça ne va pas marcher. Puisque Names est évidemment un objet personnalisé, vous devez fournir une méthode pour extraire une représentation de chaîne de cet objet, et vous devez explicitement appeler cette méthode vous-même.

Par exemple, vous pouvez mettre en œuvre une méthode appelée -asString (ce qui serait un nom horrible, mais cela est d'illustrer un point), qui pourrait ressembler à ceci:

- (NSString*) asString { 
    return [NSString stringWithFormat:@"This name is %@", aNameIvar]; 
} 

Vous pouvez ensuite l'utiliser comme ceci:

Name * thisName = [namesArray objectAtIndex:indexPath.row]; 
cell.textLabel.text = [thisName asString]; 
return cell; 

Le nom propre de cette méthode serait -stringValue. -stringValue est utilisé sur plusieurs objets Cocoa pour retourner une représentation de chaîne des données qu'ils détiennent, comme NSNumber, NSCell (Mac), etc.

EDIT:

Peter Hosey a répondu à cette question exacte assez adroitement dans this StackOverflow.com question.

+0

J'ai vu la réponse de Peter Hosey avant de poster ici. Situation très similaire, mais je me suis fait trébucher quand sa réponse était "demander à l'objet son texte". Je vais essayer votre suggestion pour la méthode -stringValue et voir si cela fonctionne. Merci. Voir aussi ma réponse à Darren; cela fonctionnait quand j'ai spécifiquement défini les chaînes, mais j'essaye maintenant d'utiliser CoreData à la place. – Doug

Questions connexes