2010-11-08 35 views
0

我一直在玩这个游戏几个小​​时,并且卡住了。我试图使用Monotouch在NSUserDefaults中保存一个Favorite对象列表。我相信我是在正确的轨道上,但我不能完全得到它...这里是我的模型对象:使用Monotouch将自定义列表保存在NSUserDefaults中

public class Favorite { 
    public Favorite(){} 
    public string Description {get;set;} 
    public Song Song {get;set;} 
} 

public class Song { 
    public Song(){} 
    public string Name {get;set;} 
    public string Artist {get;set;} 
} 

接下来,我要保存用户已选择收藏夹列表。从我读过的内容中,我可以使用NSArray来保存NSUserDefaults中的项目列表。那么,我如何从收藏夹列表中移除收藏夹的NSArray ......我一直没有找到任何关于此的文档。这里是我的设置包装:

public class Settings { 
    private static string _favoritesKey = "favorites"; 
    public static IList<Favorite> Favorites {get;set;} 

    public static void Add(Favorite favorite){ 
     Favorites.Add(favorite); 
    } 

    public static void Remove(Favorite favorite){ 
     Favorites.Remove(favorite); 
    } 

    public static void Read() 
    { 
     var tempFavorites = (NSArray)NSUserDefaults.StandardUserDefaults[_favoritesKey]; 
     if(tempFavorites == null){ 
      Favorites = new List<Favorite>(); 
     } 
     else { 
      for(uint i=0;i<tempFavorites.Count;i++){ 
       var fav = tempFavorites.ValueAt(i); //returns IntPtr 
       // do something to convert to Favorite 
       // Favorites.Add(converted_favorite); 
      } 
     } 
    } 

    public static void Write() 
    { 
     var tempArray = Favorites.ToArray(); 
     // convert to NSObject[] 
     NSUserDefaults.StandardUserDefaults[_favoritesKey] = NSArray.FromNSObjects(converted_array); 
     NSUserDefaults.StandardUserDefaults.Synchronize(); 
    } 
} 

我在正确的轨道上?它看起来像我需要做的是弄清楚如何转换和从NSObjects。另外,如果我将这些自定义对象保存在NSUserDefaults中,它们是否需要可序列化?非常感谢!

回答

3

如果你想做到这一点,就需要你最喜欢的课程是与本地存储一个NSObject的,你与[连接]属性同步,这样的事情:

[Register] 
public class Favorite : NSObject { 

    [Connect] 
    public string Description { 
    get { 
     return (string) this.GetNativeField ("Description"); 
    } 
    set { 
     this.SetNativeField ("Description", new NSString (value)); 
    } 
    } 
} 

你会做同样的为你的歌班。您只能将本机类存储在NSStandardUserDefaults对象存储中。

另一种方法是Jason建议并将其序列化为一个字符串,然后将其存储为NSString。

+0

我没有按照你的建议去做,但你的解决方案确实回答了我提出的问题......谢谢。 – 2010-11-10 15:56:01

2

我会尝试序列化它们,然后转换为NSString。

+0

我其实更喜欢这个想法,因为我不会在我的模型中喷洒NSObject。 +1 – 2010-11-10 15:54:50

0

编辑,找到办法解决它:

var Chosenkey = new object[] { NSUserDefaults.StandardUserDefaults.StringForKey("FooIdentifier").ToString() }; 
    var DefValueToSet = new object[] { "Foo" }; 
    var newInfo = NSDictionary.FromObjectsAndKeys(Chosenkey,DefValueToSet); 

然后我们注册这个NSDictionary的用户默认值,我们就大功告成了。


我试图序列化,然后将结果转换为一个的NSString,但我仍然得到试图创建字典时nullexception:

这是我的声明:

string llalalala = "Thisisatest"; 
     NSString test = SerializeToString(llalalala); 

     NSDictionary dictionary = new NSDictionary(test, test,null); 

这是我的序列化方法:

//Method to serialize objects 
    public NSString SerializeToString(object obj) 
    { 
     XmlSerializer serializer = new XmlSerializer(obj.GetType()); 

     using (StringWriter writer = new StringWriter()) 
     { 
      serializer.Serialize(writer, obj); 
      try 
      { 
       return (NSString)writer.ToString(); 
      } 
      catch (Exception ex) 
      { 
       return new NSString(""); 
      } 

     } 
    } 

我做错了什么? NSstrings不是空的,所以我不知道这里发生了什么事情。

相关问题