2016-07-15 3 views
0

У меня есть контроллер родительского контроля и контроллер детского просмотра, и мне нужно, чтобы передавал информацию с кнопки в контроллере Child View обратно в контроллер родительского контроля, чтобы правильный текст tableViewCell выделен.Использование делегата для передачи информации с кнопки для выделения ячейки

В контроллере родительского контроля, когда ячейка прослушивается, текст ячейки подсвечивается, и на экране появляется контрольный элемент Child View Controller и воспроизводит выбранную песню. Тем не менее, на контроллере Child View есть кнопка прокрутки назад и пропустить вперед, поэтому, когда одна из этих кнопок нажата, и снова отображается контроллер родительского контроля, текст ячейки должен быть выделен для другой ячейки, чем был выделен до ,

Таким образом, я добавил правильный код делегата делегата для каждого контроллера представления, но я не уверен, что лучшая информация для захвата с контроллера детского просмотра, чтобы отправить обратно в контроллер родительского контроля и как его использовать.

Child View Controller:

-(IBAction)indexChanged:(UISegmentedControl *)sender 
{ 
    NSURL *musicFile = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Blip_Select" ofType:@"wav"]]; 
    AVAudioPlayer *click = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile error:nil]; 

    switch (self.segmentedControl.selectedSegmentIndex) 
    { 
     case 0: 
      [click play]; 
      [click play]; 
      [musicPlayer skipToPreviousItem]; 
      break; 
     case 1: 
      [click play]; 
      if ([musicPlayer playbackState] == MPMusicPlaybackStatePlaying) { 
       [musicPlayer pause]; 
      } else { 
       [musicPlayer play]; 
      } 
      break; 
     case 2: 
      [click play]; 
      [click play]; 
      [musicPlayer skipToNextItem]; 
     default: 
      break; 
    } 
} 

Я хотел бы добавить что-то внутри каждого из приведенных выше утверждений переключателя, но я не уверен, что именно будет работать лучше?

Потому что это то, что она выглядит в Родитель View Controller:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    AlbumsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    MPMediaItem *rowItemAlbum = [[albumsArrayForTVC objectAtIndex:indexPath.section] representativeItem]; 
    NSString *albumDetailTitle = [rowItemAlbum valueForProperty:MPMediaItemPropertyAlbumTitle]; 
    MPMediaQuery *albumMPMediaQuery = [MPMediaQuery albumsQuery]; 
    MPMediaPropertyPredicate *albumPredicate = [MPMediaPropertyPredicate predicateWithValue: albumDetailTitle forProperty: MPMediaItemPropertyAlbumTitle]; 
    [albumMPMediaQuery addFilterPredicate:albumPredicate]; 
    NSArray *albumTracksArray = [albumMPMediaQuery items]; 

    MPMediaItem *rowItemSong = [[albumTracksArray objectAtIndex:indexPath.row] representativeItem]; 
    NSString *songTitle = [rowItemSong valueForProperty:MPMediaItemPropertyTitle]; 
    cell.textLabel.text = songTitle; 
    cell.textLabel.highlightedTextColor = [UIColor brownColor]; 

    return cell; 
} 

Я знаю, что я хотел бы добавить какой-то метод, и загрузить таблицу, но я не уверен, что лучший путь к этому. Есть идеи? Благодаря!

+1

реализации делегата на вашего ребенка VC, а затем работать с источником данных на родителя VC, затем перезагрузить таблицу, как набор Int, чтобы определить, какая строка подсвечена. – Tj3n

+0

Попробуйте использовать блок как обратный вызов в контроллере просмотра детей. И определите, что делает блок в контроллере родительского представления. – EricXuan

+0

@ Tj3n, что все имеет смысл и было похоже на то, что я тоже думал, но не знал, как сделать часть Int, о которой вы говорите, например, как точно реализовать + 1/-1 в родитель VC я знаю? – SRMR

ответ

1
  1. Определите протокол в своем дочернем контроллере. Этот протокол должен иметь такой метод, как «didSelectSkipButton», который принимает некоторый параметр для представления типа нажатой кнопки.

  2. Определите свойство делегата для вашего контроллера детского вида, соответствующего протоколу.

  3. В указателе childChanged отправьте сообщение didSelectSkipButton делегату, передав значение, представляющее нажатую кнопку.

  4. В своем родительском vc настройте себя как делегат ребенка и реализуйте методы протокола. В didSelectSkipButton найдите текущую строку таблицы, используя indexPathForSelectedRow, и добавьте или вычтите ее из [indexpath row] в зависимости от нажатой кнопки. Убедитесь, что индекс новой строки находится в допустимых пределах для вашего представления в таблице. Затем отправьте свой стол в сообщение selectRowAtIndexPath:animated:scrollPosition:, чтобы выбрать новую строку.

+0

Спасибо за ответ! # 3 + # 4 - это то, чего у меня еще не было, и пытался выяснить, как его решить. Позвольте мне попытаться приготовить решение с этим. – SRMR

+0

В # 4 у меня есть «найти текущую строку таблицы, используя indexPathForSelectedRow», «NSIndexPath * indexPathSelected = [self.tableView indexPathForSelectedRow];» и проверить, что индекс новой строки находится в допустимых границах для вашего представления таблицы. Затем отправить таблицу просмотра selectRowAtIndexPath: анимированный: scrollPosition: сообщение, чтобы выбрать новую строку «' если (indexPath SRMR

+0

Но я не хватает "и добавляю или вычитаю один из [indexpath row] в зависимости от нажатой кнопки." Между ними. Знаете ли вы, что мне там делать? – SRMR

1

Добавить метод делегата в родительском

@protocol childDelegate <NSObject> 
-(void) updateTable 
@end 

и

@property (assign) id <childDelegate> cDelegate; 

Затем добавьте то же метод в родительском

-(void) updateTable 
{ 
    [yourTableView reloadData]; 
} 

-(IBAction)indexChanged:(UISegmentedControl *)sender 
{ 
    [self.cDelegate updateTable]; 
} 

Надеется, что это помогает.

+0

Спасибо за ответ! У меня уже есть весь код делегата, но не был уверен, как реализовать метод + 1/-1 для родителя, вы знаете? Любые идеи о том, как это сделать? – SRMR

+0

И что еще более важно, текст должен быть выделен для другой ячейки, чем был выделен раньше, знаете ли вы, как это сделать? – SRMR

2

Создание делегата в контроллере представления ребенка

@protocol ChildView_Delegate <NSObject> 
-(void)reSelectTableRow:(int)index 
@end 

создать свойство вашего ребенка контроллер представления

@property (nonatomic) id delegate; 

И при нажатии вперед & кнопку назад сделать что-то вроде этого.

-(IBAction)forward:(id)sender{ 
    if(_delegate){ 
     [_delegate reSelectTableRow:position+1]; 
    } 
} 

Назад в основной контроллер реализации ChildView_Delegate & реализовать это метод, как этот

-(void)reSelectTableRow:(int)index{ 
    if(index<songsArray.count){ 
    //define a index path 
     NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0]; 
    //select a row of table view programatically 
    [tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition: 
    UITableViewScrollPositionNone]; 
    } 
} 
+0

Да, это имеет смысл, я думал, что это должно быть какое-то решение + 1/-1, но не знаете, как реализовать это на главном контроллере. – SRMR

+0

(Going to попробуйте реализовать!) – SRMR

+0

I думаю, что у меня есть это, за исключением того, что текст должен быть выделен для другой ячейки сейчас, чем был выделен раньше, но теперь текст ячеек не выделен? – SRMR

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