简体   繁体   中英

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

I guys, I am fighting with a problem since some days and wanted to get your assistance. I have an RSS file on a server which gets parsed normally. Basically it's about shows, concerts, gigs of a band. That's why I have created the 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

and the 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

In my TourViewController (which is a table view) i have created this:

- (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";
}

As far as I can tell, that worked all without problems. Now I want to show the "gigName" of the show in the table. For this I need to get the show object from the NSDictionary. I have this but it crashes:

- (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;
}

Error Output:

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”.

Can you guys tell me how I can get the show object and set the table text to show.gigName? Any help is appreaciated. Thank you,

cheers, doonot

Try to change this :

cell.text = show.gigName;

into :

cell.textLabel.text = show.gigName;

In your init:... for the Show object you need to make it:

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;

so that each of them are retained (or do gigName = [_gigName retain]; but then you loose the release if it was not empty).

You may also have the same problem in the view controller and the way the variables are being set there but without seeing more I can't be sure.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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