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

Xamarin.ios 使用Monotouch在NSUserDefaults中保存自定义列表,xamarin.ios,nsuserdefaults,Xamarin.ios,Nsuserdefaults,我已经玩了几个小时了,我被卡住了。我正在尝试使用Monotouch在NSUserDefaults中保存喜爱对象的列表。我相信我在正确的轨道上,但我只是不能完全得到它。。。以下是我的模型对象: public class Favorite { public Favorite (){} public string Description {get;set;} public Song Song {get;set;} } public class Song { publi

我已经玩了几个小时了,我被卡住了。我正在尝试使用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中保存项目列表。那么我该如何从一个收藏列表变成一个收藏列表。。。我还没有找到任何关于这个的文档。这是我的设置包装:

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();
    }
}
公共类设置{
私有静态字符串\u favoritesKey=“收藏夹”;
公共静态IList收藏夹{get;set;}
公共静态无效添加(收藏夹){
收藏夹。添加(收藏夹);
}
公共静态无效删除(收藏夹){
收藏夹。删除(收藏夹);
}
公共静态无效读取()
{
var tempFavorites=(NSArray)NSUserDefaults.StandardUserDefaults[_favoritesKey];
if(tempFavorites==null){
收藏夹=新列表();
}
否则{

对于(uint i=0;i我将尝试序列化它们,然后转换为NSString。

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

如果要执行此操作,您需要将最喜欢的类设置为一个NSObject,该类具有与[Connect]属性同步的本机存储,如下所示:

[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。

如果要执行此操作,您需要将您最喜欢的类设置为具有与[Connect]属性同步的本机存储的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。

编辑,找到了解决方法:

    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("");
            }

        }
    }

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

编辑,找到解决方法:

    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("");
            }

        }
    }

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

我实际上更喜欢这个想法,因为我没有在我的模型中喷洒NSObject。+1我实际上更喜欢这个想法,因为我没有在我的模型中喷洒NSObject。+1我没有按照你建议的方式,但你的解决方案是我没有按照你的建议去做,但你的解决方案确实回答了我提出的问题……谢谢。