2014-09-25 3 views
0

У меня есть UITableViewController с пользовательской ячейкой прототипа. Внутри ячейки прототипа у меня есть 2 метки и изображение. Они помечены значком 100 для изображения, 101 и 102 для метки. Я пытаюсь получить доступ к этой метки внутри этого методаviewWithTag, возвращающий nil внутри cellForRowAtIndexPath метод

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

    if ([indexPath row] == 0) { 
     static NSString *CellIdentifier = @"InfoCell"; 
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

     UIImageView *albumArtworkImageView = (UIImageView *)[cell viewWithTag:100]; 
     albumArtworkImageView.image = [self getAlbumArtworkWithSize:albumArtworkImageView.frame.size]; 

     UILabel *albumArtistLabel = (UILabel *)[cell viewWithTag:101]; 
     albumArtistLabel.text = [self getAlbumArtist]; 

     UILabel *albumInfoLabel = (UILabel *)[cell viewWithTag:102]; 
     albumInfoLabel.text = [self getAlbumInfo]; 

     return cell; 
    } else { 

     static NSString *CellIdentifier = @"Cell"; 
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 


     MPMediaQuery *audiobookQuery = [MPMediaQuery audiobooksQuery]; 
     MPMediaPropertyPredicate *albumPredicate = [MPMediaPropertyPredicate predicateWithValue: audiobookTitle forProperty: MPMediaItemPropertyAlbumTitle]; 
     [audiobookQuery addFilterPredicate:albumPredicate]; 
     NSArray *albumTracks = [audiobookQuery items]; 

     NSUInteger trackNumber = [[[albumTracks objectAtIndex:(indexPath.row-1)] valueForProperty:MPMediaItemPropertyAlbumTrackNumber] unsignedIntegerValue]; 

     if (trackNumber) { 
      cell.textLabel.text = [NSString stringWithFormat:@"%i. %@", trackNumber, [[[albumTracks objectAtIndex:(indexPath.row-1)] representativeItem] valueForProperty:MPMediaItemPropertyTitle]]; 
     } else { 
      cell.textLabel.text = [[[albumTracks objectAtIndex:(indexPath.row-1)] representativeItem] valueForProperty:MPMediaItemPropertyTitle]; 
     } 


     if ([self sameArtists]) { 

      cell.detailTextLabel.text = @""; 

     } else { 

      if ([[[albumTracks objectAtIndex:(indexPath.row-1)] representativeItem] valueForProperty:MPMediaItemPropertyArtist]) { 
       cell.detailTextLabel.text = [[[albumTracks objectAtIndex:(indexPath.row-1)] representativeItem] valueForProperty:MPMediaItemPropertyArtist]; 
      } else { 
       cell.detailTextLabel.text = @""; 
      } 

     } 

     return cell; 
    } 
} 

ЭРВО взглянуть на раскадровке

Storyboard

Этот вопрос я имею линии, где я смотрю на вид из тегов возвращая ноль. Я уже делал этот тип поиска, и я не могу понять, почему они возвращают нуль. Любая помощь будет очень оценена. Я даже не уверен в хорошем способе отладки. Я разработчик C#, пытаясь выучить программирование цели-c/ios. Благодаря!

+0

Измените на '[cell.contentView viewWithTag: 101]'. Все ваши просмотры должны находиться в представлении содержимого ячейки, а не непосредственно в ячейке. – rmaddy

+0

Я пробовал это, но он все еще возвращает ноль. Что-нибудь еще я мог делать неправильно? – user1585542

+0

Откуда вы знаете, что viewWithTag: возвращает nil? Вы подтвердили это с помощью журнала или отладчика? – rdelmar

ответ

2

Предлагаю вам альтернативу. Создайте собственный класс для UITableViewCell и объявите его там; затем подключите подчиненные подсистемы каждой ячейки с этими свойствами и напрямую обращайтесь к ним, не вызывая viewWithTag.

Например, в пользовательской ячейке:

@interface MyCustomCell : UITableViewCell 

@property (strong, nonatomic) UIImageView *albumArtworkImageView; 
@property (strong, nonatomic) UILabel *albumArtistLabel; 
@property (strong, nonatomic) UILabel *albumInfoLabel; 

и в методе cellForRowAtIndexPath:

MyCustomCell *cell = (MyCustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
cell.albumArtworkImageView.image = [self getAlbumArtworkWithSize:albumArtworkImageView.frame.size]; 
cell.albumArtistLabel.text = [self getAlbumArtist]; 
cell.albumInfoLabel.text = [self getAlbumInfo]; 

Не забудьте установить MyCustomCell в камере в раскадровке.

Надеюсь, это поможет!

+0

Спасибо за ваш ответ. Должны ли свойства быть IBOutlets? Как подключить их? – user1585542

+0

Я реализовал это и понял, что когда я переключаю свой iPhone на пейзаж, он работает, но когда у меня он в портретном режиме, он не работает. Любая идея, почему это произойдет? Благодаря!! – user1585542

+0

Вы могли подключить их? Ctrl + щелчок и перетаскивание с владельца (то есть viewController с желтым значком) в subview (label, imageView и т. Д.). Что не работает в портретном режиме? – Leandro

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