我已经将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
完成后在主线程中运行它? 最佳答案
您确定要查看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
属性的实例变量(通常仅在initializer和dealloc
方法中需要),请记住要包含前划线。 (下划线的约定是为了最大程度地减少在实际打算使用self.objTableView
访问器getter方法时意外引用实例变量的机会。关于ios - 为什么我的tableview属性为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15594804/