0

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よいですか?

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行を記述しない限り、コンパイラはインスタンス変数に名前を付けます_objTableViewobjTableViewプロパティのインスタンス変数を参照する必要がある場合(通常はイニシャライザと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 に答える