我的班级看起来像这样:
@interface ApplicantPickerController : AppPage <NSTableViewDataSource, NSTableViewDelegate>
{
School *school;
__weak IBOutlet NSTableView *tableView;
NSMutableArray *familyList;
__weak IBOutlet NSProgressIndicator *progressIndicator;
}
- (IBAction)alphabetButtonPressed:(id)sender;
@end
在alphabetButtonPressed
方法中,我从Web服务中获取json数组并将其分配给familyList
。这样做之后,我做[tableView reload];
当控件转到- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
方法时,familyList
变为nil
。为什么会发生这种情况?我该如何解决?
我正在为这个项目使用ARC。 Cocoa / Objective-C新手在这里。任何帮助将非常感激。谢谢!
更新 - 以下是该类的实现:
@interface ApplicantPickerController ()
@end
@implementation ApplicantPickerController
- (IBAction)alphabetButtonPressed:(id)sender {
[progressIndicator startAnimation:self];
NSString * addy = [[NSString alloc] initWithFormat:@"%@.php?function=applicant_lookup&schoolID=%@&alpha=%@¤tYear=%@&format=json", BASE_URL_SCHOOL, school->recordID, [sender title], school->CurrentYear];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:addy]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if(data) {
//NSString * resp = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSError *error = nil;
NSObject *json = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
if([json isKindOfClass:[NSDictionary class]])
{
familyList = nil;
[tableView reloadData];
}
else if ([json isKindOfClass:[NSArray class]])
{
familyList = [[NSMutableArray alloc] init];
[familyList addObjectsFromArray:(NSArray*)json];
//[_familyList retain];
[tableView reloadData];
}
[progressIndicator stopAnimation:self];
}
}];
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return [familyList count];
}
- (id)initWithMainView:(NSView *)_theView AndMainController:(NSViewController *)_theViewController AndNibName:(NSString *)nibName AndArgs:(NSArray *)_args
{
self = [super initWithMainView:_theView AndMainController:_theViewController AndNibName:nibName AndArgs:_args];
school = [args objectAtIndex:0];
return self;
}
@end
答案 0 :(得分:1)
我不知道我是否发现了苹果的错误,但以下是我如何解决这个问题。
我在UI构建器中设置了NSTableView
委托和数据源(通过右键单击并使用鼠标建立连接)。出于某种原因,如果我在代码中设置delegate
和dataSource
(特别是在awakeFromNib
方法中),问题就会得到解决。
- (void)awakeFromNib {
tableView.delegate = self;
tableView.dataSource = self;
}