使用Monotouch在NSUserDefaults中保存自定义列表

时间:2010-11-08 22:37:40

标签: xamarin.ios nsuserdefaults

我一直在玩这个几个小时而且我被卡住了。我正在尝试使用Monotouch在NSUserDefaults中保存Favorite对象列表。我相信我在正确的轨道上,但我不能完全理解......这是我的模型对象:

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 个答案:

答案 0 :(得分:3)

如果你想这样做,你需要你的Favorite类是一个NSObject,它具有与[Connect]属性同步的本机存储,如下所示:

[Register]
public class Favorite : NSObject {

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

你会为你的Song课程做同样的事情。您只能在NSStandardUserDefaults对象库中存储本机类。

另一种选择是Jason建议的,只是序列化为一个字符串,然后将其存储为NSString。

答案 1 :(得分:2)

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

答案 2 :(得分: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不是空的,所以我不知道这里会发生什么......