Я установил delegate
и datasource
в File's Owner
, розетка установлена правильно в файле xib
. Теперь для .h
файла:Почему мое свойство табуретного дома null
@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
не обновляет вид таблицы. Как исправить это, спасибо заранее.
EDIT:
Я использую 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
?
Учитывая, что вы говорите, что у вас есть строка, которая говорит '@synthesize objTableView;', типичная проблема дублирующего ivar не является проблемой. (Вы действительно не должны явно объявлять свой ivar, чтобы избежать этой потенциальной путаницы. Пусть компилятор сделает это за вас.) В любом случае проблема должна быть в другом месте. Возвращаясь к исходному вопросу, как вы инициализируете 'objTableView'? Вы говорите, что это «IBOutlet» (но, как правило, ссылки «IBOutlet» являются «слабыми»). Вы вручную создали представление таблицы или создали в Interface Builder? Если вы создали в IB, проверили ли вы эту ссылку? – Rob
@Rob, +1: Я согласен, что 'IBOutlet' должен быть ссылкой« слабый », и вы должны позволить дескриптору компилятора создать поддержку ivar (путем« синтезирования »этого свойства для вас). Именование вашего «свойства» и его поддержки «ivar» то же самое только вызовет путаницу и проблемы для вас ... –
Я не знаю, хотя об «дублированном иваре не проблема» - возможно, это возможно что-то глупое может происходить через IB или во время выполнения, поскольку есть две переменные с тем же именем, которые оба перечислены как «IBOutlets»? Может быть, попробуйте избавиться от упомянутого ivar objTableView и посмотреть, не изменит ли это что-нибудь? –