Objective c 对NSMutableArray进行洗牌和取消洗牌(查找正确的索引)

Objective c 对NSMutableArray进行洗牌和取消洗牌(查找正确的索引),objective-c,ios,cocoa-touch,Objective C,Ios,Cocoa Touch,我正在我的应用程序中安装一个音乐播放器,当用户选择一个播放列表时,他们可以控制随机播放和重复播放模式 最初,播放列表的单个MPMediaItems存储在NSArray中(然后由播放音乐的功能处理)。当用户将洗牌模式切换为ON时,阵列将复制到NSMutableArray,对象将被洗牌(当前播放的歌曲索引为0)。在这一点上我很好;当用户关闭洗牌模式时,问题就会出现 就像在iPod音乐应用程序中一样,当用户关闭洗牌模式时,原始播放列表将恢复,当前播放的歌曲的位置将显示在原始阵列中 基本上,我希望这种情

我正在我的应用程序中安装一个音乐播放器,当用户选择一个播放列表时,他们可以控制随机播放和重复播放模式

最初,播放列表的单个
MPMediaItem
s存储在
NSArray
中(然后由播放音乐的功能处理)。当用户将洗牌模式切换为ON时,阵列将复制到
NSMutableArray
,对象将被洗牌(当前播放的歌曲索引为0)。在这一点上我很好;当用户关闭洗牌模式时,问题就会出现

就像在iPod音乐应用程序中一样,当用户关闭洗牌模式时,原始播放列表将恢复,当前播放的歌曲的位置将显示在原始阵列中

基本上,我希望这种情况发生:

  • 用户在播放列表中选择曲目5/12:现在播放曲目5/12 十二,
  • 用户打开洗牌模式:现在播放12首曲目中的第1首
  • 用户播放下一首歌曲:现在播放12首曲目中的第2首
  • 用户关闭洗牌模式:现在播放曲目7/12(其中曲目 7是该歌曲在原始播放列表中的位置,该播放列表为 无序播放列表中的曲目2)
  • 我希望我已经说得够清楚了。对于如何以最有效的方式进行这项工作,我非常感谢您的指导


    谢谢

    为放入NSArray的对象添加orderValue,该值将等于对象索引。因此,您可以洗牌一个数组,并根据该值恢复原始顺序。

    只是为了澄清,我应该为当前正在播放的项目添加
    setValue
    ,这样我就可以知道它在原始数组中的位置了?你能给出一个简短的伪代码吗?是的。您可以创建自己的类,它将包括音乐文件路径(或者我不知道您是如何做到的…)和附加值,如
    NSNumber
    。所以,当您从类中放置对象引用时,您将它与它自己的属性一起放置。根据此模型,您将获得
    [[myplaylayarray objectAtIndexPath:i]orderValue].intValue的访问权限(例如)(我使用了
    NSNumber
    ,因为CoreData framework像往常一样为托管类中的整数值创建了这种类型)。哦,我现在看到了您的问题。对于切换随机播放模式的方法,您可以设置
    @property
    值,该值将以随机播放模式存储当前歌曲编号,如increment。因此,最大值将等于
    NSMutableArray
    计数。当用户在洗牌模式下按“下一步”按钮时,您可以增加此属性值,当用户禁用洗牌时,您可以在此值索引处将播放器切换到歌曲。这不起作用,因为您无法保证洗牌数组中属于该索引的歌曲与原始数组中的歌曲相同。但是你的第一个答案给了我另一个方法。当然,你应该访问原始的
    NSArray
    对象索引:)最简单的方法就是释放你的
    NSMutableArray
    并在
    NSArray
    中再次设置它,而不需要乱序。若无序和有序的歌曲都会增加属性值,你们可以随时切换到必要的位置。也许我已经失去了你主要想法的一些细节。无论如何,我很高兴我用另一种方法帮助了你;)