我有一个父视图控制器和一个子视图控制器,我需要将子视图控制器中的按钮信息传递回父视图控制器,以便突出显示正确的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;
}
}
我会在上述每个开关语句中添加一些内容,但是我不确定哪种方法最适合?
因为这是父视图控制器中的样子:
- (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;
}
我知道我会添加某种方法,并重新加载表格,但我不确定最好的方法。有任何想法吗?谢谢!
答案 0 :(得分:2)
在子视图控制器中创建委托
@protocol ChildView_Delegate <NSObject>
-(void)reSelectTableRow:(int)index
@end
在子视图控制器中创建属性
@property (nonatomic) id delegate;
当你向前推进&amp;向后按钮做这样的事情。
-(IBAction)forward:(id)sender{
if(_delegate){
[_delegate reSelectTableRow:position+1];
}
}
返回主控制器实现ChildView_Delegate&amp;实现它的方法就像这样
-(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];
}
}
答案 1 :(得分:1)
在父
中添加委托方法 @protocol childDelegate <NSObject>
-(void) updateTable
@end
和
@property (assign) id <childDelegate> cDelegate;
然后在父
中添加相同的方法-(void) updateTable
{
[yourTableView reloadData];
}
-(IBAction)indexChanged:(UISegmentedControl *)sender
{
[self.cDelegate updateTable];
}
希望它有所帮助。
答案 2 :(得分:1)
在子控制器中定义协议。该协议应该有一个类似于&#39; didSelectSkipButton&#39;接受一些参数来表示按下的按钮类型。
为您的子视图控制器定义一个委托属性,符合协议。
在孩子的indexChanged中,将didSelectSkipButton消息发送给委托,传递代表按下按钮的值。
在您的父vc中,将自己设置为子代理并实现协议方法。在didSelectSkipButton
中,使用indexPathForSelectedRow
查找表格视图的当前行,并根据按下的按钮在[indexpath row]
中添加或减去一行。检查新行索引是否在表视图的有效范围内。然后发送你的表视图a
selectRowAtIndexPath:animated:scrollPosition:
消息以选择新行。