didSelectRowAtIndexPath 被调用但不 prepareForSegue
didSelectRowAtIndexPath gets called but not prepareForSegue
只有当我 运行 第一次使用应用程序时才会发生这种情况,即便如此,当我尝试重新创建以进行调试时,大部分时间它都能正常工作。
我 select indexPath.row
的歌曲,一切都正确记录,除了没有调用 segue。
它调用didSelectRowAtIndexPath
,但不调用prepareForSegue
。
一切都连接正确,因为如果我再次尝试它,它会完美地工作并且 didSelectRowAtIndexPath
和 prepareForSegue
都被调用。 (我只是使用 didSelectRowAtIndexPath
进行调试以记录我没有得到 nil 数据。)
有没有人 运行 对此感兴趣,或者对如何调试它有任何想法?谢谢!
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
MPMediaItem *selectedItem = [[albumsArrayForTVC objectAtIndex:indexPath.section] representativeItem];
NSString *albumDetailTitle = [selectedItem valueForProperty:MPMediaItemPropertyAlbumTitle];
MPMediaQuery *tempAlbumMPMediaQuery = [MPMediaQuery songsQuery];
MPMediaPropertyPredicate *albumPredicate = [MPMediaPropertyPredicate predicateWithValue: albumDetailTitle forProperty: MPMediaItemPropertyAlbumTitle];
[tempAlbumMPMediaQuery addFilterPredicate:albumPredicate];
NSArray *albumTracksArray = [tempAlbumMPMediaQuery items];
MPMediaItem *rowItemSong = [[albumTracksArray objectAtIndex:indexPath.row] representativeItem];
NSLog(@"track: %@", rowItemSong);
NSString *song = [rowItemSong valueForProperty:MPMediaItemPropertyTitle];
NSLog(@"track name: %@", song);
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([segue.identifier isEqualToString:@"nowPlaying"]){
// send to now playing
NSUInteger selectedSection = [[self.tableView indexPathForSelectedRow] section];
NSUInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];
NSArray *albumTracksArray = [self albumTracksForSegue:[[albumsArrayForTVC objectAtIndex:selectedSection] representativeItem]];
MPMediaItem *rowItemSong = [[albumTracksArray objectAtIndex:selectedIndex] representativeItem];
MPMusicPlayerController *musicPlayer = [MPMusicPlayerController systemMusicPlayer];
[musicPlayer setQueueWithItemCollection:[MPMediaItemCollection collectionWithItems:albumTracksArray]];
[musicPlayer setNowPlayingItem:rowItemSong];
[musicPlayer play];
NSLog(@"Row Item Song: %@", rowItemSong);
}
}
这很奇怪,因为它不是我每次都能重新制作的东西,这就是为什么我很难弄清楚这里发生了什么,是系统音乐播放器的问题还是这是我的代码等
在您的 didSelectRowAtIndexPath:
方法中调用 [self performSegueWithIdentifier:@"YourSegueIdentifier" sender:nil];
。请注意,didSelectRowAtIndexPath:
和 prepareForSegue:
都是 UIViewController
的方法,而不是 UITableViewCell
.
的方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//If you have only one segue then do just this else add your if condition for different segues
[self performSegueWithIdentifier:@"YourSegueIdentifier" sender:nil];
}
首先,永远不要 link 使用 UITableViewCell
你的 segues。当你想从你的 UITableViewController
转到另一个控制器时,link 使用控制器的 segue。按住 Control 键将控制器顶部的黄色圆圈拖动到您要连接到的控制器并为其指定一些标识符。
其次,在您的 didSelectRowAtIndexPath
方法中,使用您给定的标识符调用函数 performSegueWithIdentifire
以连接到另一个控制器。
希望这对您有所帮助。 :)
只有当我 运行 第一次使用应用程序时才会发生这种情况,即便如此,当我尝试重新创建以进行调试时,大部分时间它都能正常工作。
我 select indexPath.row
的歌曲,一切都正确记录,除了没有调用 segue。
它调用didSelectRowAtIndexPath
,但不调用prepareForSegue
。
一切都连接正确,因为如果我再次尝试它,它会完美地工作并且 didSelectRowAtIndexPath
和 prepareForSegue
都被调用。 (我只是使用 didSelectRowAtIndexPath
进行调试以记录我没有得到 nil 数据。)
有没有人 运行 对此感兴趣,或者对如何调试它有任何想法?谢谢!
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
MPMediaItem *selectedItem = [[albumsArrayForTVC objectAtIndex:indexPath.section] representativeItem];
NSString *albumDetailTitle = [selectedItem valueForProperty:MPMediaItemPropertyAlbumTitle];
MPMediaQuery *tempAlbumMPMediaQuery = [MPMediaQuery songsQuery];
MPMediaPropertyPredicate *albumPredicate = [MPMediaPropertyPredicate predicateWithValue: albumDetailTitle forProperty: MPMediaItemPropertyAlbumTitle];
[tempAlbumMPMediaQuery addFilterPredicate:albumPredicate];
NSArray *albumTracksArray = [tempAlbumMPMediaQuery items];
MPMediaItem *rowItemSong = [[albumTracksArray objectAtIndex:indexPath.row] representativeItem];
NSLog(@"track: %@", rowItemSong);
NSString *song = [rowItemSong valueForProperty:MPMediaItemPropertyTitle];
NSLog(@"track name: %@", song);
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([segue.identifier isEqualToString:@"nowPlaying"]){
// send to now playing
NSUInteger selectedSection = [[self.tableView indexPathForSelectedRow] section];
NSUInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];
NSArray *albumTracksArray = [self albumTracksForSegue:[[albumsArrayForTVC objectAtIndex:selectedSection] representativeItem]];
MPMediaItem *rowItemSong = [[albumTracksArray objectAtIndex:selectedIndex] representativeItem];
MPMusicPlayerController *musicPlayer = [MPMusicPlayerController systemMusicPlayer];
[musicPlayer setQueueWithItemCollection:[MPMediaItemCollection collectionWithItems:albumTracksArray]];
[musicPlayer setNowPlayingItem:rowItemSong];
[musicPlayer play];
NSLog(@"Row Item Song: %@", rowItemSong);
}
}
这很奇怪,因为它不是我每次都能重新制作的东西,这就是为什么我很难弄清楚这里发生了什么,是系统音乐播放器的问题还是这是我的代码等
在您的 didSelectRowAtIndexPath:
方法中调用 [self performSegueWithIdentifier:@"YourSegueIdentifier" sender:nil];
。请注意,didSelectRowAtIndexPath:
和 prepareForSegue:
都是 UIViewController
的方法,而不是 UITableViewCell
.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//If you have only one segue then do just this else add your if condition for different segues
[self performSegueWithIdentifier:@"YourSegueIdentifier" sender:nil];
}
首先,永远不要 link 使用 UITableViewCell
你的 segues。当你想从你的 UITableViewController
转到另一个控制器时,link 使用控制器的 segue。按住 Control 键将控制器顶部的黄色圆圈拖动到您要连接到的控制器并为其指定一些标识符。
其次,在您的 didSelectRowAtIndexPath
方法中,使用您给定的标识符调用函数 performSegueWithIdentifire
以连接到另一个控制器。
希望这对您有所帮助。 :)