为什么我的plist不会填充我的UITableView?

时间:2010-07-15 23:14:39

标签: iphone objective-c xcode uitableview plist

我已经取得了一些进展,并且正在编辑这个问题。我现在面临的一个大问题是,分组表视图将加载,但每行显示所有内容。此外,我的UIAlertView返回所有对我的plist的引用(null)。我如何解决这个问题,因为对plist的引用正在扼杀我。任何和所有的帮助将不胜感激!

以下是我的plist文件的纯文本版本:

<array>
<dict>
    <key>eventName</key>
    <string>Comedy Caravan</string>
    <key>eventSpecifics</key>
    <string>Nicholas Anthony</string>
    <key>eventLocation</key>
    <string>The Cats Den</string>
    <key>eventType</key>
    <string>Comedy</string>
    <key>eventGoodies</key>
    <string>Both</string>
    <key>eventDate</key>
    <date>2010-07-23T00:00:00Z</date>
</dict>
<dict>
    <key>eventName</key>
    <string>Comedy Caravan</string>
    <key>eventLocation</key>
    <string>The Cats Den</string>
    <key>eventType</key>
    <string>Comedy</string>
    <key>eventSpecifics</key>
    <string>Bruce Baum</string>
    <key>eventGoodies</key>
    <string>Prizes</string>
    <key>eventDate</key>
    <date>2010-07-24T00:00:00Z</date>
</dict>
<dict>
    <key>eventName</key>
    <string>Late Night Film Series</string>
    <key>eventLocation</key>
    <string>The Cats Den</string>
    <key>eventType</key>
    <string>Comedy</string>
    <key>eventSpecifics</key>
    <string>Avatar</string>
    <key>eventGoodies</key>
    <string>Food</string>
    <key>eventDate</key>
    <date>2010-07-24T02:00:00Z</date>
</dict>
</array>

这是我的ThisWeekViewController.h:

#import <UIKit/UIKit.h>

@class Event;

@interface ThisWeekViewController : UITableViewController

{
NSArray *eventNames;
Event *event;
}

@property (nonatomic, retain) NSArray *eventNames;
@property (nonatomic, retain) Event *event;

@end

这是我的ThisWeekViewController.m:

#import "ThisWeekViewController.h"
#import "Event.h"

@implementation ThisWeekViewController

@synthesize eventNames;
@synthesize event;


- (void)viewDidLoad {
    [super  viewDidLoad];

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Events" ofType:@"plist"];
    NSArray *dict = [[NSArray alloc] initWithContentsOfFile:path];

    NSArray *namesArray = [dict valueForKey:@"eventName"];
    self.eventNames = namesArray;
    [dict release];

    [self.tableView reloadData];    
}



- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    self.eventNames = nil;
}


#pragma mark Table View Methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [self.eventNames count];
}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    NSString *key = [NSString stringWithFormat:@"%@", event.eventName];
    return key;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.eventNames count];
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSUInteger row = [indexPath row];

    static NSString *CellIdentifier = @"Cell";

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

    // Configure the cell.

    // Set the cell's text to the event name
    cell.textLabel.text = event.eventName;

    return cell;
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

}


- (void)dealloc {
//  [thisWeek release];
    [event release];
    [eventNames release];
    [super dealloc];
}


@end

我还包含了我的Event.h文件

 #import <Foundation/Foundation.h>


@interface Event : NSObject {
    NSString *eventName;
    NSString *eventType;
    NSDate *eventDate;
    NSString *eventLocation;
    NSString *eventGoodies;
    NSString *eventSpecifics;

}

- (id)initWithDictionary:(NSDictionary *)aDictionary;

@property (nonatomic, retain) NSString *eventName;
@property (nonatomic, retain) NSString *eventType;
@property (nonatomic, retain) NSString *eventLocation;
@property (nonatomic, retain) NSDate *eventDate;
@property (nonatomic, retain) NSString *eventGoodies;
@property (nonatomic, retain) NSString *eventSpecifics;

@end

和我的Event.m文件

 #import "Event.h"


@implementation Event

@synthesize eventName;
@synthesize eventType;
@synthesize eventDate;
@synthesize eventLocation;
@synthesize eventGoodies;
@synthesize eventSpecifics;

- (id)initWithDictionary:(NSDictionary *)aDictionary {
    if ([self init]) {
        self.eventName = [aDictionary valueForKey:@"eventName"];
        self.eventType = [aDictionary valueForKey:@"eventType"];
        self.eventDate = [aDictionary valueForKey:@"eventDate"];
        self.eventLocation = [aDictionary valueForKey:@"eventLocation"];
        self.eventGoodies = [aDictionary valueForKey:@"eventGoodies"];
        self.eventSpecifics = [aDictionary valueForKey:@"eventSpecifics"];

    }
    return self;
}

- (void)dealloc {
    [eventName release];
    [eventType release];
    [eventDate release];
    [eventLocation release];
    [eventGoodies release];
    [eventSpecifics release];

    [super dealloc];
}

@end

我希望能够放置诸如cell.detailTextLabel.text = event.eventSpecifics之类的内容,并且只运行这样的引用。

1 个答案:

答案 0 :(得分:0)

如果我没记错的话,UITableViewController会重新加载-viewWillAppear:中的表格视图。在调用-viewDidLoad之前,可能会调用此方法。我建议您在[self.tableView reloadData]实施结束时插入-viewDidLoad来电。

您还应该在[super viewDidLoad]的实施顶部调用-viewDidLoad,同样调用-viewDidUnload

此外,您不需要声明自己的班级符合UITableViewDataSourceUITableViewDelegate,因为您的超类(UITableViewController)已经为您做了。