我已将delegate
和datasource
设置为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.objTableView
:
NSLog(@"%@",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
完成后确保在主线程中运行它?
答案 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变为零的原因。