更新:不幸的是,下面提供的帮助并没有解决我跨功能共享类属性的问题。其他人可以提出可能的问题吗?这是最新的代码:
标题.h:
@interface FirstViewController:UIViewController <UITableViewDataSource, UITableViewDelegate, UITabBarControllerDelegate> {
NSDictionary *sectorDictionary;
NSInteger sectorCount;
}
@property (nonatomic, retain) NSDictionary *sectorDictionary;
- (id)initWithData:(NSMutableDictionary*)inData;
实施.m:
@synthesize sectorDictionary;
- (id) testFunction:(NSDictionary*)dictionary {
NSLog(@"Count #1: %d", [dictionary count]);
return nil;
}
- (id)initWithData:(NSMutableDictionary *)inData {
self = [self init];
if (self) {
[self testFunction:inData];
// set the retained property
self.sectorDictionary = inData;
}
return self;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSLog(@"Count #2: %d", [self.sectorDictionaryCopy count]);
return [self.sectorDictionaryCopy count];
}
控制台输出:
2010-05-05 20:11:13.126 JSONApp[17378:207] Count #1: 9
2010-05-05 20:11:13.130 JSONApp[17378:207] Count #2: 0
关于在this question之间关于在类之间共享对象的问题,我现在需要弄清楚如何在类中的各种函数之间共享该对象。
首先,设置:在我的App Delegate中,我将来自JSON的菜单信息加载到NSMutableDictionary中,并使用名为initWithData的函数传递给视图控制器。我需要使用这个字典来填充一个新的表视图,它有像numberOfRowsInSection和cellForRowAtIndexPath这样的方法。
我想使用字典计数返回numberOfRowsInSection和字典中的信息来填充每个单元格。不幸的是,我的代码永远不会超出init阶段,字典是空的,所以numberOfRowsInSection总是返回零。
我以为我可以创建一个类属性,合成它然后设置它。但它似乎并不想保留房产的价值。我在这做错了什么?
标题.h:
@interface FirstViewController:UIViewController <UITableViewDataSource, UITableViewDelegate, UITabBarControllerDelegate> {
NSMutableDictionary *sectorDictionary;
NSInteger sectorCount;
}
@property (nonatomic, retain) NSMutableDictionary *sectorDictionary;
- (id)initWithData:(NSMutableDictionary*)data;
@end
在实现中.m:
@synthesize sectorDictionary;
- (id) testFunction:(NSMutableDictionary*)dictionary {
NSLog(@"Count #1: %d", [dictionary count]);
return nil;
}
- (id)initWithData:(NSMutableDictionary *)data {
if (!(self=[super init])) {
return nil;
}
[self testFunction:data];
// this is where I'd like to set a retained property
self.sectorDictionary = data;
return nil;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSLog(@"Count #2: %d", [self.sectorDictionary count]);
return [self.sectorDictionary count];
}
NSLog的输出:
2010-05-04 23:00:06.255 JSONApp[15890:207] Count #1: 9
2010-05-04 23:00:06.259 JSONApp[15890:207] Count #2: 0
答案 0 :(得分:0)
如果成功完成,任何init函数都应返回self。更改返回nil以在initWithData结束时返回self。
-(id) initWithData:(NSMutableDictionary *)inData {
self = [self init]; // best practice use super for method with same name
if ( self ) {
self.sectorDictionary = inData;
}
return self;
}
sectorDictionary成员不应该是可变的。如果更改,则需要在表上调用reloadData。你的setter函数应该是一个不可变的副本。
-(void) setSectorDictionary:(NSDictionary *)inData {
NSDictionary *old = sectorDictionary;
sectorDicitonary = inData ? [[NSDictionary alloc] intWithDictionary:inData] : nil;
[self.table reloadData];
[old release];
}
答案 1 :(得分:0)
我相信你的问题在self.sectorDictionary = data
行。
你需要首先为你正在创建的字典分配一些内存,所以像这样的行
self.sectorDictionary = [[NSMutableDictionary alloc] init];
将是必要的。
启动新词典后,您需要使用传入的词典内容填充它。
因此...
试一试:
self.sectorDictionary = [[NSMutableDictionary alloc] initWithDictionary:data];
而不是:
self.sectorDictionary = data;
答案 2 :(得分:-1)
而不是
self.sectorDictionary = data;
试试这个......
self.sectorDictionary = [[NSMutableDictionary alloc] init];
self.sectorDictionary = (NSMutableDictionary *) data;