使用委托从按钮传递信息以突出显示单元格
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];
}
希望对您有所帮助。
在您的 child 控制器中定义一个协议。该协议应该有一个像 'didSelectSkipButton' 这样的方法,它接受一些参数来表示按下的按钮类型。
为您的 child 视图控制器定义一个委托 属性,符合协议。
在 child 的 indexChanged 中,将 didSelectSkipButton 消息发送给委托,传递表示按下按钮的值。
在您的 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];
}
}
我有一个父视图控制器和一个子视图控制器,我需要将信息从子视图控制器中的按钮传递回父视图控制器,以便正确的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];
}
希望对您有所帮助。
在您的 child 控制器中定义一个协议。该协议应该有一个像 'didSelectSkipButton' 这样的方法,它接受一些参数来表示按下的按钮类型。
为您的 child 视图控制器定义一个委托 属性,符合协议。
在 child 的 indexChanged 中,将 didSelectSkipButton 消息发送给委托,传递表示按下按钮的值。
在您的 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];
}
}