0

我已将delegateand设置datasourceFile'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完成后在主线程中运行它?

4

3 回答 3

2

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

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

@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 方法时意外引用实例变量的机会。

于 2013-03-24T03:30:39.013 回答
2

您是否尝试过设置观察点objTableView

在你-viewDidLoad设置一个断点。objTableView当调试器停止时,在变量列表中二次单击。单击“观看'objTableView'”。它随时会破坏价值的objTableView变化。

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

于 2013-03-24T03:47:01.707 回答
0

我建议您创建以下方法:

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

然后在 _objTableView = tableView 行上设置断点,这应该让您知道是什么原因导致 _objTableView 变为 nil。

于 2013-03-24T05:36:01.800 回答