在另一个方法中设置后,变量在numberOfRowsInTableView中变为nil

时间:2014-10-28 14:01:44

标签: objective-c macos cocoa automatic-ref-counting nstableview

我的班级看起来像这样:

@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=%@&currentYear=%@&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

1 个答案:

答案 0 :(得分:1)

我不知道我是否发现了苹果的错误,但以下是我如何解决这个问题。

我在UI构建器中设置了NSTableView委托和数据源(通过右键单击并使用鼠标建立连接)。出于某种原因,如果我在代码中设置delegatedataSource(特别是在awakeFromNib方法中),问题就会得到解决。

- (void)awakeFromNib {
    tableView.delegate = self;
    tableView.dataSource = self;
}