Xamarin.ios 使用Monotouch在NSUserDefaults中保存自定义列表
我已经玩了几个小时了,我被卡住了。我正在尝试使用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
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我没有按照你建议的方式,但你的解决方案是我没有按照你的建议去做,但你的解决方案确实回答了我提出的问题……谢谢。