0

で解析された要素を取得し、NSMutableArrayそれらをNSString変数に格納してから、 NSMutableArrayasに格納しNSStringたい (コンテンツを a に表示したいためNSComboBox)。これを試しましたが、うまくいきません。問題を解決できますか?私には解決できません:

//--this is the parsing code : 
- (void)parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict {

    if ([elementName isEqualToString:@"user"]) {
        NSLog(@"user element found – create a new instance of User class...");
        if(currentElementValue == nil)
            currentElementValue = [NSMutableString string];
        else 
            [currentElementValue setString:@""];
    }
    else {
        currentElementValue = nil;
    }
        user = [[User alloc] init];


}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if (!currentElementValue) {
        // init the ad hoc string with the value     
        currentElementValue = [[NSMutableString alloc] initWithString:string];
    } else {
        // append value to the ad hoc string    
        [currentElementValue appendString:string];
        if (currentElementValue) 
        {
            currentElementValue = nil;
        }
    }
    NSLog(@"Processing value for : %@", string);
}  

- (void)parser:(NSXMLParser *)parser 
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qName {

    if ([elementName isEqualToString:@"users"]) {
        // We reached the end of the XML document
        return;
        NSLog(@"QUIT");
    }
    if ([elementName isEqualToString:@"userName"]) {
        [[self user] setUserName:currentElementValue];
        NSLog(@"final step for value: %@", user.userName);
        NSLog(@"currentElementName content : %@", currentElementValue);
        [currentElementValue release];
        NSLog(@"release : %@", currentElementValue);
        currentElementValue = nil;
        NSLog(@"release : %@", currentElementValue);
    }
    if ([elementName isEqualToString:@"firstName"]) {
        [[self user] setFirstName:currentElementValue];
        [currentElementValue release];
        currentElementValue = nil;
    }

    if ([elementName isEqualToString:@"lastName"]) {
        [[self user] setLastName:currentElementValue];
        [currentElementValue release];
        currentElementValue = nil;
    }

    if ([elementName isEqualToString:@"user"]) {
        NSLog(@"\n user=%@ \n",user);

        [users addObject:user];
        NSLog(@"userName test : %@", users);

        [user release];
        user = nil;
    }
}
-(BOOL)parseDocumentWithData:(NSData *)data {

    if (data == nil)
        return NO;
    NSXMLParser *xmlparser = [[NSXMLParser alloc] initWithData:data];
    [xmlparser setDelegate:self];
    [xmlparser setShouldResolveExternalEntities:NO];

    BOOL ok = [xmlparser parse];
    if (ok == NO)
        NSLog(@"error");
    else
        NSLog(@"OK");

    [xmlparser release];
    return ok;
}

// this is the xml file : 

<users>
 <user>
  <userName>mspeller</userName>
  <firstName>Mike</firstName>
  <lastName>Speller</lastName>
 </user>
 <user>
  <userName>mgdan</userName>
  <firstName>Mila</firstName>
  <lastName>Gdan</lastName>
 </user>

</users>


//-------
NSMutableArray *tabletest= [[NSMutableArray alloc] init];
NSMutableString * result = [[NSMutableString alloc] init];
int i;
for(i=0; i < [users count]; i++){

    [result appendString:[NSString stringWithFormat:@"%@",[[users objectAtIndex:i] valueForKey:@"userName"]] ];
    NSLog(@"result==%@",result);

    [tabletest addObject:result];
}
4

2 に答える 2

0

コメント セクションのリンクに基づいて、「userName」プロパティに間違った方法でアクセスしていると思います。NSDictionaryユーザーにオブジェクトが含まれているため、アクセスしようとしています。私が見る限り、Userオブジェクトをに追加していNSMutableArrayます。

次のことを試してください(コードを少し美しくするために自由を取りました):

NSMutableArray *tabletest= [NSMutableArray array];

for (User* user in users)
{
    NSString* result = [NSString stringWithFormat:@"%@", user.userName];
    NSLog(@"result==%@",result);

    [tabletest addObject:result];
}

あなたのデザインを完全に誤解している場合は、訂正してください。

于 2012-07-17T08:51:29.737 に答える
0

私はあなたの意図に従っていませんが、現時点であなたのコードが行うことは、次のように同じ文字列[user count]時間を配列に追加することですtabletest:

この線:

[result appendString:[NSString stringWithFormat:@"%@",[[users objectAtIndex:i] valueForKey:@"userName"]] ];

resultは、それぞれを一緒に追加した結果に蓄積され[[users objectAtIndex:i] valueForKey:@"userName"]ます。ループの反復ごとに、次の項目が の末尾に追加されますresult

この線:

[tabletest addObject:result];

によって参照されるオブジェクトresultを配列に追加します。これは反復ごとに 1 回行われるため、配列は同じオブジェクト[users count]への参照で終了します。変更可能な文字列への参照を配列に配置しても、現在の値のコピーは配置されず、文字列への参照のみが配置されます。文字列を変更すると、配列に格納されている参照を通じて変更が表示されます。

したがって、コードの最終結果は[users count]、同じ変更可能な文字列への参照の配列であり、その文字列はすべての[[users objectAtIndex:i] valueForKey:@"userName"]値の連結です。

あなたの意図は何でしたか?

の文字列表現の配列を作成しようとしている場合は[[users objectAtIndex:i] valueForKey:@"userName"]、コードを次のように変更します。

NSMutableArray *tabletest= [[NSMutableArray alloc] init];

for(int i = 0; i < [users count]; i++)
{
   // create a string representation of userName
   NSString *result = [NSString stringWithFormat:@"%@",[[users objectAtIndex:i] objectForKey:@"userName"]];
   // add the string to the array
   [tabletest addObject:result];
}

しかし、おそらくあなたの意図は別のものですか?

于 2012-07-17T08:53:33.513 に答える