使用委托从按钮传递信息以突出显示单元格

Using a delegate to pass information from button to highlight cell

我有一个父视图控制器和一个子视图控制器,我需要将信息从子视图控制器中的按钮传递回父视图控制器,以便正确的tableViewCell 文本被突出显示。

在父视图控制器中,当点击一个单元格时,单元格文本会突出显示,子视图控制器会弹出屏幕并播放所选的歌曲。但是,在子视图控制器上有一个向后跳过和向前跳过按钮,因此当按下其中任何一个并且再次显示父视图控制器时,现在需要为不同的单元格突出显示 单元格文本在.

之前被突出显示

所以我已经向每个视图控制器添加了适当的委托样板代码,但我不确定从子视图控制器获取的最佳信息发送回父视图控制器,以及如何使用它.

子视图控制器

-(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; 
    } 
}

我会在上面的每个 switch 语句中添加一些内容,但是 我不确定什么最有效?

因为这就是它在 父视图控制器 中的样子:

- (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;
}

我知道我会添加某种方法,然后重新加载 table,但我不确定执行此操作的最佳方法。有任何想法吗?谢谢!

在父级中添加委托方法

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

@property (assign) id <childDelegate> cDelegate;

然后在父级中添加相同的方法

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

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

希望对您有所帮助。

  1. 在您的 child 控制器中定义一个协议。该协议应该有一个像 'didSelectSkipButton' 这样的方法,它接受一些参数来表示按下的按钮类型。

  2. 为您的 child 视图控制器定义一个委托 属性,符合协议。

  3. 在 child 的 indexChanged 中,将 didSelectSkipButton 消息发送给委托,传递表示按下按钮的值。

  4. 在您的 parent vc 中,将自己设置为 child 的委托并实现协议方法。在 didSelectSkipButton 中,使用 indexPathForSelectedRow 找到 table 视图的当前行,并根据按下的按钮从 [indexpath row] 中添加或减去一个。检查新行索引是否在 table 视图的有效范围内。然后发送您的 table 查看 selectRowAtIndexPath:animated:scrollPosition: 消息到 select 新行。

在您的子视图控制器中创建委托

 @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];
   }
 }