1

私はiphoneアプリケーションを開発しています。これでは、サーバーからのフィールド情報に従って動的にユーザー プロファイル フォームを生成する必要があります。

したがって、応答に 5 つのフィールドがある場合、それらのデータから 5 つのラベルを作成して、のセルに表示する必要がありuitableviewます。

プロファイルの値ではなく、ユーザープロファイルのフィールドの名前を取得しているわけではありません。

それらのデータから動的にフォームを生成したい。

これらのデータを取得することはできますNSMutableArrayが、cellForRowAtIndexPathメソッドでは null が表示されます。

どうすればこれを解決できますか?

私のコードスニペットは次のとおりです。

-(void) connectionDidFinishLoading:(NSURLConnection *)connection  {
if (connection)
{
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

    //You've got all the data now
    //Do something with your response string

  //  NSLog(@"Response:%@",responseString);

    SBJsonParser *parser = [[SBJsonParser alloc] init];
    NSDictionary *object = [parser objectWithString:responseString error:nil];

    NSString *pec_count = [object valueForKey:@"peculiarity_count"];

    NSDictionary *pecs = [object valueForKey:@"peculiarities"];

    NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:nil];
    [array addObject:@""];

    for (int j= 1; j <= [pec_count integerValue] ; j++) {


        NSString *val = [NSString stringWithFormat:@"%@%d",@"pec_",j];
        NSString *pec_i = [pecs valueForKey:val];

        NSString *modifiedString = [pec_i stringByReplacingOccurrencesOfString:@"_" withString:@" "];

        NSString *capitalisedSentence = [modifiedString stringByReplacingCharactersInRange:NSMakeRange(0,1)
                                                                                withString:[[modifiedString  substringToIndex:1] capitalizedString]];
        [array insertObject:capitalisedSentence atIndex:j];
    }

    self.peculiarity = array;
    [self.table reloadData];

}

for (int j=0 ; j < [self.peculiarity count] ; j++) {

    NSLog(@"info:%@", [self.peculiarity objectAtIndex: j]);
}

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  reuseIdentifier:CellIdentifier];


    UIButton *racebtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    racebtn.frame = CGRectMake(240, 7, 10, 15);
    [racebtn setBackgroundImage:[UIImage imageNamed:@"select.png"] forState:UIControlStateNormal];
    [racebtn addTarget:self action:@selector(selectRace:)forControlEvents:UIControlEventTouchUpInside];

    NSLog(@"cell=%@",[self.peculiarity objectAtIndex:3]);

}

どんな助けでも大歓迎です。ありがとうございました。

4

3 に答える 3

0

上記のすべての解決策を以前に確認しましたが、最終的にこれに対する解決策を得ました。問題は、データが到着する前にセルがロードされていたことです。だから私はサーバーへの同期リクエストを使用しました。

このためのコードは以下のとおりです。

  NSString *path = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"path"];

NSString *address = [NSString stringWithFormat:@"%@%@%@%@", path,@"users/",@"peculiarity/",self.tablename];

NSURL *URL = [NSURL URLWithString:address];
NSLog(@"%@",address);

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[URL host]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL cachePolicy:NSURLCacheStorageAllowedInMemoryOnly
                                                   timeoutInterval:60.0];

[request setHTTPMethod:@"GET"];


NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

if (data) {

    NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"data:%@",responseString);

    SBJsonParser *parser = [[SBJsonParser alloc] init];
    NSDictionary *object = [parser objectWithString:responseString error:nil];

    pecs = [object valueForKey:@"pec_values"];

    for (int j =0; j < [pecs count] ; j++) {

           NSLog(@"values:%@",[pecs objectAtIndex:j]);
    }


    self.peculiarity = array;

}
else {
    // Handle error by looking at response and/or error values
    NSLog(@"%@",error);
}
于 2013-08-13T05:48:23.770 に答える
0

注:割り当てていない場合はself.peculiarity NSMutableArray、次のようにその配列を割り当てます..

    if (self.peculiarity == nil)
        self.peculiarity = [[NSMutableArray alloc] init];

そして、以下のようにその配列をこの配列に割り当てます..

self.peculiarity = array;

メソッドの後に、cellForRowAtIndexPath:その値または名前を次textLabelUITableViewCellようなものに設定するだけです..

   cell.textLabel.text = [self.peculiarity objectAtIndex:indexPath.row];

その方法で全体の例を参照してください..

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  reuseIdentifier:CellIdentifier];


        UIButton *racebtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        racebtn.frame = CGRectMake(240, 7, 10, 15);
        [racebtn setBackgroundImage:[UIImage imageNamed:@"select.png"] forState:UIControlStateNormal];
        [racebtn addTarget:self action:@selector(selectRace:)forControlEvents:UIControlEventTouchUpInside];
        [cell addSubview:racebtn];
        cell.textLabel.text = [self.peculiarity objectAtIndex:indexPath.row];
     }
     return cell;
}
于 2013-08-01T10:37:01.417 に答える
0

connectionDidFinishLoading: メソッドで、次の行を置き換えます。

self.peculiarity = 配列; と、

self.peculiarity = [[NSMutableArray alloc] initWithArray:array];

cellForRowAtIndexPath メソッドに次のコード行を追加します。

cell.textLabel.text = [self.peculiarity objectAtIndex:indexPath.row];

これがあなたを助けることを願っています。

于 2013-08-01T10:59:55.617 に答える