didSelectRowAtIndexPath被调用但不是prepareForSegue

时间:2016-06-27 00:18:41

标签: ios objective-c uitableview audio-player mpmediaitem

这种情况只有在我第一次运行应用程序时才会发生,即便如此,当我尝试重新创建调试时,大部分时间它都能正常运行。

我在indexPath.row选择了一首歌,所有内容都正确记录,除了没有调用segue。

致电didSelectRowAtIndexPath,但未致电prepareForSegue

所有东西都是正确的,因为如果我再次尝试它会完美地工作,didSelectRowAtIndexPathprepareForSegue都会被调用。 (我只是使用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);
    }
}

enter image description here

这是一个奇怪的,因为它不是我每次都可以重新创建的东西,这就是为什么我更难以弄清楚这里发生了什么,是否是系统音乐播放器的东西或者是否是我的东西代码等

2 个答案:

答案 0 :(得分:2)

首先,永远不要使用UITableViewCell链接您的segues。如果要从UITableViewController转移到另一个控制器,请使用控制器链接segue。按控制 - 将控制器顶部的黄色圆圈拖动到要转移到的控制器,并为其指定一个标识符。

其次,在您的didSelectRowAtIndexPath方法中,使用您给定的标识符调用函数performSegueWithIdentifire以转到另一个控制器。

希望这会有所帮助。 :)

答案 1 :(得分:1)

[self performSegueWithIdentifier:@"YourSegueIdentifier" sender:nil];方法中致电didSelectRowAtIndexPath:。请注意,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]; 
}