繁体   English   中英

如何从NSDictionary检索对象以设置表

[英]How can I retrieve an object from NSDictionary to set up table

伙计们,自几天以来,我一直在与一个问题作斗争,并希望获得您的帮助。 我在正常解析的服务器上有一个RSS文件。 基本上是关于表演,音乐会,乐队演出的。 这就是为什么我创建了Show-Class的原因:

Show.h:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface Show : NSObject {

    NSString* gigName;
    NSString* date;
    NSString* place;
    NSString* door;
    NSString* time;
    NSString* bands;
    NSString* entry;
    NSString* query;
    NSString* flyer;
    NSString* type;
}

- (id)init:(NSString*)gigName date:(NSString*)date place:(NSString*)place door:(NSString*)door time:(NSString*)time bands:(NSString*)bands
     entry:(NSString*)entry query:(NSString*)query flyer:(NSString*)flyer type:(NSString*)type;

@property (nonatomic, retain) NSString* gigName;
@property (nonatomic, retain) NSString* date;
@property (nonatomic, retain) NSString* place;
@property (nonatomic, retain) NSString* door;
@property (nonatomic, retain) NSString* time;
@property (nonatomic, retain) NSString* bands;
@property (nonatomic, retain) NSString* entry;
@property (nonatomic, retain) NSString* query;
@property (nonatomic, retain) NSString* flyer;
@property (nonatomic, retain) NSString* type;

@end

和Show.m:

#import "Show.h"

@implementation Show
@synthesize gigName, date , place, door, time, bands, entry, query, flyer, type;

- (id)init:(NSString*)_gigName date:(NSString*)_date place:(NSString*)_place door:(NSString*)_door time:(NSString*)_time bands:(NSString*)_bands
     entry:(NSString*)_entry query:(NSString*)_query flyer:(NSString*)_flyer type:(NSString*)_type {
    //if (self = [super init]) {
    self = [super init];

    if(self) {
        gigName = _gigName;
        date = _date;
        place = _place;
        door = _door;
        time = _time;
        bands = _bands;
        entry = _entry;
        query = _query;
        flyer = _flyer;
        type = _type;
    }
    return self;
}

- (void)dealloc {
    [super dealloc];
}
@end

在我的TourViewController(这是一个表视图)中,我创建了以下代码:

- (void)viewDidLoad {

    [super viewDidLoad];

    //Initialize the array.
    listOfItems = [[NSMutableArray alloc] init];

    pastShowArray = [NSMutableArray arrayWithCapacity:[stories count]]; // needs to be mutable
    futureShowArray = [NSMutableArray arrayWithCapacity:[stories count]]; // needs to be mutable


    for(int i = 0; i < [stories count]; i++) {

        // get fields from story parser object
        gigName = [[stories objectAtIndex:i] objectForKey:@"gig"];
        type = [[stories objectAtIndex:i] objectForKey:@"type"];
        date  = [[stories objectAtIndex:i] objectForKey:@"date"];
        place = [[stories objectAtIndex:i] objectForKey:@"place"];
        door = [[stories objectAtIndex:i] objectForKey:@"door"];
        time = [[stories objectAtIndex:i] objectForKey:@"time"];
        bands = [[stories objectAtIndex:i] objectForKey:@"bands"];
        entry = [[stories objectAtIndex:i] objectForKey:@"entry"];
        query = [[stories objectAtIndex:i] objectForKey:@"query"];
        flyer = [[stories objectAtIndex:i] objectForKey:@"flyer"];

        // remove unnecessary whitespaces
        gigName =   [gigName stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
        type =      [type stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
        date  =     [date stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
        place =     [place stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
        door =      [door stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
        time =      [time stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
        bands =     [bands stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
        entry =     [entry stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
        query =     [query stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
        flyer =     [flyer stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];

        NSLog(gigName);
        NSLog(type);

        Show* show = [[Show alloc] init:gigName date:date place:place door:door time:time bands:bands entry:entry query:query flyer:flyer type:type];

        if([type isEqualToString:@"past"]) {
            // fill past show array
            NSLog(@"adding past object now");

            [pastShowArray addObject:show];

        } else {
            // fill future show array
            NSLog(@"adding future object now");

            [futureShowArray addObject:show];
        }
    } 

    NSMutableDictionary *pastShowsArrayDict = [NSMutableDictionary dictionaryWithObject:pastShowArray forKey:@"Show"];
    NSLog(@"added past show array to pastshowarraydict");

    NSMutableDictionary *futureShowsArrayDict = [NSMutableDictionary dictionaryWithObject:futureShowArray forKey:@"Show"];
    NSLog(@"added future show array to futureshowarraydict");

    [listOfItems addObject:pastShowsArrayDict];
    [listOfItems addObject:futureShowsArrayDict];

    //Set the title
    self.navigationItem.title = @"Tour";
}

据我所知,这一切都没有问题。 现在,我想在表中显示节目的“ gigName”。 为此,我需要从NSDictionary获取show对象。 我有这个但是崩溃了:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

    // Set up the cell...
    NSLog(@"try to set up cell");
    //First get the dictionary object
    NSDictionary *dictionary = [listOfItems objectAtIndex:indexPath.section];
    NSArray *array = [dictionary objectForKey:@"Show"];

    Show *show = [array objectAtIndex:indexPath.row];
    NSLog(show.gigName);
    cell.text = show.gigName;

    return cell;
}

错误输出:

2011-02-14 16:32:44.462 All in Vain [405:307] try to set up cell
terminate called after throwing an instance of 'NSException'
Program received signal:  “SIGABRT”.

你们能告诉我如何获取显示对象并将表文本设置为show.gigName吗? 任何帮助表示赞赏。 谢谢,

干杯,杜诺

尝试更改此:

cell.text = show.gigName;

进入:

cell.textLabel.text = show.gigName;

在您的init:... ,对于Show对象,您需要使其:

self.gigName = _gigName;
self.date = _date;
self.place = _place;
self.door = _door;
self.time = _time;
self.bands = _bands;
self.entry = _entry;
self.query = _query;
self.flyer = _flyer;
self.type = _type;

以便保留每个版本(或执行gigName = [_gigName retain];但是如果版本不为空,则释放版本)。

您可能还会在视图控制器中以及在其中设置变量的方式中遇到相同的问题,但是我看不到更多不确定信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM