2013-03-24 3 views
0

Я установил 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?

+2

Учитывая, что вы говорите, что у вас есть строка, которая говорит '@synthesize objTableView;', типичная проблема дублирующего ivar не является проблемой. (Вы действительно не должны явно объявлять свой ivar, чтобы избежать этой потенциальной путаницы. Пусть компилятор сделает это за вас.) В любом случае проблема должна быть в другом месте. Возвращаясь к исходному вопросу, как вы инициализируете 'objTableView'? Вы говорите, что это «IBOutlet» (но, как правило, ссылки «IBOutlet» являются «слабыми»). Вы вручную создали представление таблицы или создали в Interface Builder? Если вы создали в IB, проверили ли вы эту ссылку? – Rob

+0

@Rob, +1: Я согласен, что 'IBOutlet' должен быть ссылкой« слабый », и вы должны позволить дескриптору компилятора создать поддержку ivar (путем« синтезирования »этого свойства для вас). Именование вашего «свойства» и его поддержки «ivar» то же самое только вызовет путаницу и проблемы для вас ... –

+0

Я не знаю, хотя об «дублированном иваре не проблема» - возможно, это возможно что-то глупое может происходить через IB или во время выполнения, поскольку есть две переменные с тем же именем, которые оба перечислены как «IBOutlets»? Может быть, попробуйте избавиться от упомянутого ivar objTableView и посмотреть, не изменит ли это что-нибудь? –

ответ

2

Вы уверены, что ищете 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 (как правило, это необходимо только для инициализатора и dealloc методов), не забудьте включить в себя подчеркивание. (Конвенция подчеркивания, чтобы свести к минимуму вероятности того, что вы случайно ссылаетесь на переменный экземпляр, когда вы на самом деле предназначены для использования геттера self.objTableView аксессора.

+0

Привет, Thanx для вашего быстрого ответа, на самом деле я уже сослался на свойство '@synthesize objTableView;' и BTW, я тестировал удаление декларации einstance, как вы упомянули выше, но представление таблицы затем gt werid поведение (ячейка исчезает при нажатии в теме). И табличное представление всегда «null». – Malloc

+0

Если вы вручную вызываете '@synthesize objTableView;', то дублирующий ivar не является проблемой. Тем не менее, я бы посоветовал вам избавиться от этого ивара, поскольку это только источник потенциальной путаницы, и он абсолютно ничего не делает. Если вы правильно синтезировали, комментирование явно объявленного ivar вообще не повлияет на операцию. Если вы действительно синтезировали это как свое слово, проблема лежит в другом месте, но вы недостаточно делитесь, чтобы позволить нам диагностировать, что происходит. – Rob

+0

Привет, Роб, я редактировал свои горшки, пожалуйста, посмотри. Моя проблема не решена, и я думаю, что я должен обновить 'UI' в основном потоке, есть ли у вас какой-нибудь опыт? Thanx заранее. – Malloc

2

Вы пробовали установки наблюдения на objTableView?

В вашем -viewDidLoad установите точку останова. Когда отладчик остановится, вторично щелкните по objTableView в списке переменных. Нажмите «Смотреть« objTableView ». Он будет разорваться в любое время, если значение objTableView изменится.

Он должен сообщить вам, когда изменения стоимости.

+0

+1: Я не знал, что вы можете это сделать. Спасибо за совет. : D –

0

Я предлагаю вам создать следующий метод:

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

Затем установить контрольную точку на линии _objTableView = Tableview, который должен сообщить вам, что вызывает _objTableView стать нулевым.

Смежные вопросы