2

配列、2つの辞書、およびテーブルビューを作成しました。テーブルビューには配列の内容が表示され、その配列には辞書のデータが含まれている必要があります。「[mArrayaddObject:(mDictionary)];」を使用して表示しようとすると 例外がスローされますが、「[mArray addObject:[mDictionary objectForKey:@ "firstname"]];」を使用すると、その正常に動作します。

なぜそれが起こっているのか、そして「objectForKey」を使用せずに辞書の値を表示することはできないのかを理解するのを手伝ってもらえますか?

これが私の「ViewController.m」です。

#import "ViewController.h"

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    mArray = [[NSMutableArray alloc]init];
    mDictionary = [[NSMutableDictionary alloc]init];
    [mDictionary setValue:@"shanu" forKey:@"firstname"];
    [mDictionary setValue:@"kumar" forKey:@"lastname"];
    mDictionary2 = [[NSMutableDictionary alloc]init];
    [mDictionary2 setValue:@"hgjghjgf" forKey:@"firstname1"];
    [mDictionary2 setValue:@"ghjgjgfj" forKey:@"lastname1"];
    [mArray addObject:mDictionary];
    [mArray addObject:mDictionary2];

    CGRect frame = self.view.frame;
    UITableView *tableView = [[UITableView alloc]initWithFrame:frame style:UITableViewStylePlain];
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
    tableView.backgroundColor = [UIColor cyanColor];
    tableView.separatorColor = [UIColor blackColor];
    tableView.delegate = self;
    tableView.dataSource = self;
    [self.view addSubview:tableView];
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return @"Array and Tableview";
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return mArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }
    cell.textLabel.text = [mArray objectAtIndex:indexPath.row];
    return cell;
}

- (void)dealloc
{
    [mArray release];
    [mDictionary release];
    [mDictionary2 release];
    [super dealloc];
}
@end
4

4 に答える 4

5

.hファイルで配列を宣言します。

NSArray *keys

これをviewDidLoadに書き込みます

keys = [mDictionary allKeys];

これはcellForRowAtIndexPathにあります

cell.textLabel.text = [mDictionary objectForKey:[keys objectAtIndex:indexPath.row];
于 2013-02-01T07:03:58.830 に答える
2

セルのテキストラベルにテキストを割り当てようとすると、オブジェクトは次の場所から返されます。

[mArray objectAtIndex:indexPath.row];

辞書全体ではなく、文字列である必要があります。

辞書全体を配列に入れると、[mArray objectAtIndex:indexPath.row];辞書が返され、テキストラベルに辞書を割り当てることができないため、例外が発生します。辞書全体を保存したい場合はobjectForKey、必要な文字列を取得するために使用します。

cell.textLabel.text = [[mArray objectAtIndex:indexPath.row] objectForKey:@"WHAT_EVER_KEY_YOU_WANT"];

ところで、あなたはおそらく自動リリースされたUITableViewCellを取得したいARCautorelease zoを使用していないので、セルに追加します。

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"] autorelease];

また

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
[cell autorelease];
于 2013-02-01T06:54:14.350 に答える
0

配列には同様のタイプのオブジェクトが含まれています。辞書オブジェクトを配列に追加できます。その場合は問題ありません。問題は、配列から要素を取得してcell.textLabel.textに割り当てる場合です。ここで、オブジェクトは辞書のタイプであり、cell.textLabel.textはnsstringのタイプです。したがって、辞書オブジェクトのキーの値をcell.textLabel.textに割り当てる必要があります。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }
    cell.textLabel.text = [[mArray objectAtIndex:indexPath.row] objectForKey:@"firstname"];
cell.detialTextLabel.text = [[mArray objectAtIndex:indexPath.row] objectForKey:@"lastname"];
        return cell;
    }

お役に立てればと思います。

于 2013-02-01T06:54:21.567 に答える
0

これは私の問題を解決しました

NSDictionary *cellDict = [self.tableInfoArr objectAtIndex:indexPath.row];

//This is to don't care about what is key and value in that dictionary
NSArray *keyArr = [cellDict allKeys];

//As at each index of array only one dictionary exist.
NSString *keyStr = [keyArr objectAtIndex:0];

cell.titleLabel.text =  keyStr;
cell.detailLabel.text =  [cellDict valueForKey:keyStr];
于 2016-05-04T06:18:41.480 に答える