2013-09-10 1 views
0

У меня есть пользовательский UIView с UITableView в нем. Я подключаю делегат и dataSource через построитель интерфейсов, он выглядит так: http://postimg.org/image/nj9elaj4h/ (может не загружать изображения еще :()UITableView имеет значение null после первой загрузки данных, reloadData не работает

Когда я загружаю представление, данные отображаются так, как должно быть. Но когда я пытаюсь позвонить reloadData, ничего не происходит.Я проверил, установлен ли uitableview, но это NULL.Но как только я перетащил tableView и перезагрузил его представления, будут представлены новые данные. У кого-то появилась идея, почему reloadData не работает?

.h выглядит следующим образом:

@interface NextTitleView : UIView<UITableViewDataSource,UITableViewDelegate,SociusClientDelegate,UIActionSheetDelegate,Ne  xtTitleCustomCellDelegate> 
{ 
NexTitleCustomCell* _cellInFocus; 
} 

@property(nonatomic,retain)IBOutlet UITableView* _tableViewNextTitle; 

@end 

спасибо за вашу помощь: D

EDIT: Добавлен .m файл

@implementation NextTitleView 
@synthesize _tableViewNextTitle; 
- (id)initWithFrame:(CGRect)frame 
{ 
self = [super initWithFrame:frame]; 
if (self) { 
    // Initialization code 
} 
return self; 
} 

    -(id)init 
{ 
if(self) 
{ 
    [SharedSingeltons sharedInstance]._client.delegateCustomClient = self; 
    _tableViewNextTitle = [[UITableView alloc]init]; 
} 

return self; 
} 

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
return 2; 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
if(section == 0) 
    return @"Now playing"; 
if(section == 1) 
    return @"Comming Next"; 
else 
    return @""; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
if(section == 0) 
    return 1; 
if (section == 1) 
    return [[SharedSingeltons sharedInstance]._client._musicList count]; 
else 
    return 0; 

    } 

-(NexTitleCustomCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

NexTitleCustomCell* cell = [[NexTitleCustomCell alloc]init]; 
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"NextTitleCustomCell" owner:self options:nil]; 
cell = [nib objectAtIndex:0]; 

MusicItem* item = [[SharedSingeltons sharedInstance]._client._musicList 
        objectAtIndex:indexPath.row]; 
cell.delegate = self; 
cell._labelSongTitle.text = item._songTitle; 
cell._labelSongTitle.textColor = [UIColor blackColor]; 
cell._labelSubtitle.text = item._artist; 
cell._identifier = item._songIdentifier; 
cell._labelRating.text = item._rating.stringValue; 

return cell; 
} 

-(void)clientDidReceiveMusicList:(SociusClient *)sender list:(NSMutableArray *)array 
    { 
    for(MusicItem* item in [SharedSingeltons sharedInstance]._client._musicList) 
{ 
    NSLog(@"rating:%@",item._rating); 
} 
NSLog(@"TAbleVIEW:%@",_tableViewNextTitle); 
[self._tableViewNextTitle reloadData]; 

} 

    -(void)didPressActionButton:(NexTitleCustomCell *)sender 
    { 
    NSLog(@"Show alert view"); 

    _cellInFocus = sender; 
     UIActionSheet *popupQuery = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Vote Up", @"Like",@"Remember", nil]; 
[popupQuery showInView:self]; 
    } 

    -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex 
    { 
     if(buttonIndex == 0) 
    { 
    NSLog(@"Vote up"); 
    [self sendUpdateVoteForSong]; 
    } 
    } 

-(void)sendUpdateVoteForSong 
{ 
NSMutableDictionary* dict = [[NSMutableDictionary alloc]init]; 
[dict setObject:_cellInFocus._identifier forKey:@"Vote"]; 
NSLog(@"Identifier:%@",_cellInFocus._identifier); 

[[SharedSingeltons sharedInstance]._client sendObject:dict error:nil]; 
} 



    @end 
+1

где вы положили reloadData ??? – iPatel

+0

Опубликовать в целом.m для NextTitleView, пожалуйста, –

+0

В вашем init вы не вызывали self = [super init] –

ответ

0

Я бы сказал, вы вызываете данные релоад слишком рано, вероятно, в initWithNibName, вы должны называть его в viewDidLoad.

+0

Я отправлю файл .m после того, как вернусь домой. Но я вызываю метод reloadData после Init. Он вызывается, когда новые данные поступают с хоста. – user1990524

+0

Добавлено м файл под EDIT в вопросе – user1990524

+0

Здравствуйте, я удалил метод инициализации и заменить код в initWithFrame к этому: '- (ID) initWithFrame: (CGRect) кадр { самих = [супер initWithFrame: кадр]; if (self) { // Код инициализации [SharedSingeltons sharedInstance] ._ client.delegateCustomClient = self; _tableViewNextTitle.delegate = self; _tableViewNextTitle.dataSource = self; } return self; } '}' По-прежнему tableView имеет значение null, когда я хочу перезагрузить источник данных, как я уже сказал, если бы связал все в IB – user1990524

0

Я только что настроил uiviewcontroller для обработки представления. Теперь он работает нормально.

0

Я думаю, что UIActionSheet привел к возникновению проблемы, вы можете попробовать повторно загрузить данные дважды.

0
  1. Я заметил, вы New-ING ваш взгляд таблицы, но это на выходе ... Вам не нужно Alloc инициализации вашей точки зрения таблицы, если это IBOutlet. Поэтому либо избавляйтесь от IBOutlet, и просто объявляйте его как свойство (но тогда вам нужно убедиться, что вы программно выложите представление в виде таблицы), или сохраните IBOutlet, и избавитесь от кода, чтобы передать init. В настоящее время ваш источник данных и делегат устанавливаются с IB, поэтому, если вы выделите init свой вид в таблице, то они больше не будут установлены ...

  2. Выход для просмотра стола не должен быть nil.

Можете ли вы установить контрольную точку в awakeFromNib и посмотреть, есть ли в ней витрина TableView?

Вы загружаете класс вида, который содержит представление таблицы, используя его файл NIB правильно?

Если вы просто вставляете класс View в раскадровку, он не будет загружать NIB автоматически. Обычно я использую контейнер View, затем программно загружаю NIB и программно встраиваю загруженное представление в контейнер представления.

NSArray *arrayXibObjects = [[NSBundle bundleWithIdentifier:@"net.mycompany.myappid"] loadNibNamed:@"myNibName" owner:nil options:nil]; 

for (id object in arrayXibObjects) { 
    if ([object isKindOfClass:myNibsClass]) { 
     return object; // this is your class loaded from NIB 
    } 
} 

Этот код может быть размещен в утилите, чтобы сделать его доступным с помощью 1 строки кода.

Возвращенный класс будет иметь IBOutlets, подключенный из NIB к соответствующему классу.

Теперь проверить в отладчике:

po [loadedClassFromNib tableView] // should not be NIL 

Затем встроить загруженный СИБ в контейнере, как это: (или использовать ограничения)

[self.viewContainer addSubview: classLoadedFromNib]; 
classLoadedFromNib.frame = self.viewContainer.frame;