我已经将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.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/

10-11 18:46