为什么我的tableview属性为null

时间:2013-03-24 03:20:21

标签: ios uitableview

我已将delegatedatasource设置为File's Owner,并在xib文件中正确设置了该插座。现在是.h文件:

@interface ProductsViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>{

    IBOutlet UITableView *objTableView;
}


@property(nonatomic,strong)IBOutlet UITableView *objTableView;

.m文件中:

NSLog(@"%@",self.objTableView);
[self.objTableView reloadData];

第一次正确设置self.objTableViewNSLog(@"%@",self.objTableView); 给出:

<UITableView: 0x1d9a5800; frame = (4 54; 532 660); clipsToBounds = YES; autoresize = W+H; 

但是下次我得到了一个(null)表视图对象,因此reloadData不刷新表视图。如何解决这个问题,提前做好。

修改

我正在使用Afnetworking方法JSONRequestOperationWithRequest,如下所示:

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON){

    [SVProgressHUD dismiss];
    //Get the response from the server
    //And then refresh the tableview

    [self.objTableView reloadData];//I shouldn't put this here, it should be in the main thread
}failure:^(NSURLRequest *request, NSHTTPURLResponse *response,NSError *error, id JSON){

            [SVProgressHUD dismiss];

            //Alert the error message

}];
[operation start];
[SVProgressHUD showWithStatus:@"Searching for products, please wait.."];

实际上,JSONRequestOperationWithRequest运行异步,因此不在主线程中运行,但是它转变为UI更新应该在主线程中完成,所以我需要删除[self.objTableView reloadData];外部那种方法。但是哪里?如何在JSONRequestOperationWithRequest完成后确保在主线程中运行它?

3 个答案:

答案 0 :(得分:2)

您确定要查看self.objTableView(属性的访问方法)而不是objTableView(您手动定义的实例变量)吗?你有@synthesize行吗?如果您省略了@synthesize行,它将为您有效地完成@synthesize objTableView = _objTableView;,为您的属性_objTableView定义一个名为objTableView的实例变量,从而为您手动定义的实例变量,objTableView永远不会被初始化。

建议您删除手动定义的实例变量,让编译器为您合成,然后定义属性,这样:

@interface ProductsViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>

// Following lines removed. Do not define the instance variable.
// Let the compiler synthesize it for you.
//
// {
//     IBOutlet UITableView *objTableView;
// }

@property(nonatomic,strong)IBOutlet UITableView *objTableView;

@end

编译器将为您生成实例变量,除非手动编写自己的@synthesize行,否则编译器会将实例变量命名为_objTableView。如果您需要为objTableView属性引用实例变量(通常仅在初始化程序和dealloc方法中需要),请记住包含前导下划线。 (下划线的惯例是尽量减少在实际打算使用self.objTableView访问器getter方法时意外引用实例变量的可能性。

答案 1 :(得分:2)

您是否尝试在objTableView设置观察点?

-viewDidLoad设置断点。当调试器停止时,请在变量列表中的objTableView上进行二次单击。点击“观看'objTableView'”。只要objTableView的值发生变化,它就会中断。

它应该让您确切知道值何时发生变化。

答案 2 :(得分:0)

我建议您创建以下方法:

- (void)setObjTableView:(UITableView *)tableView {
    _objTableView = tableView;
}

然后在_objTableView = tableView行上设置一个断点,让你知道导致_objTableView变为零的原因。

相关问题