为啥我的 plist 不会填充我的 UITableView?

Posted

技术标签:

【中文标题】为啥我的 plist 不会填充我的 UITableView?【英文标题】:Why will my plist not populate my UITableView?为什么我的 plist 不会填充我的 UITableView? 【发布时间】:2010-07-15 23:14:39 【问题描述】:

我已经取得了一些进展,并且正在编辑问题以再次成为当前问题。我现在的大问题是分组表视图将加载,但会显示每个部分中的所有内容和每一行。此外,我的 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】:

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

您还应该在-viewDidLoad 的实现顶部调用[super viewDidLoad]-viewDidUnload 也是如此。

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

【讨论】:

不,viewDidLoad 会先被调用,并且只会被调用一次。所以,将 [self.tableView reloadData] 放入 viewWillAppear: 更准确 不能保证viewDidLoadviewWillAppear: 之前被调用,事实上很容易证明是这样。创建一个记录这两种方法的 UIViewController 子类,并将其推送到导航堆栈上。上次我测试时,UINavigationController 在访问视图并触发 viewDidLoad 之前调用了 viewWillAppear: 我添加了 Kevin Ballard 的所有建议,但表格视图仍然是空的。我还添加了:-(void)viewWillAppear:(BOOL)animated //强制 tableview 加载 [self.tableView reloadData]; 根据 vodkhang 和表视图仍然是空的。您可能会在代码中看到任何其他错误吗? 您是否尝试过记录键的值?您还应该改用self.keys 而不是keys,但这不是您的问题的原因。您应该尝试在-numberOfSectionsInTableView: 中记录keys 并查看其中包含的内容。

以上是关于为啥我的 plist 不会填充我的 UITableView?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 info.plist 不是正常工作的 iphone info.plist

为啥我的 App 找不到我的 plist 文件?

无法使用 plist 填充数组

知道为啥我的 DbInitializer 中的数据没有填充到我的数据库中

如何使 UIButton 从 UITable 中的选择中播放相应的音频剪辑?

为啥要将 entitlements.plist 添加到我的项目中?