2010-11-08 3 views
0

Я играю с этим несколько часов, и я застрял. Я пытаюсь сохранить список избранных объектов в NSUserDefaults с помощью Monotouch. Я считаю, что я на правильном пути, но я просто не могу совсем понимаю ... вот мои объекты модели:Сохранение пользовательского списка в NSUserDefaults с Monotouch

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 с родным хранением данных, синхронизации с [Connect] атрибутом, что-то вроде этого:

[Register] 
public class Favorite : NSObject { 

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

Вы бы сделать то же самое для вашего класса песни. Вы можете хранить только собственные классы в хранилище объектов NSStandardUserDefaults.

Альтернатива - это то, что предложил Джейсон и просто сериализовал строку, а затем сохранил ее как NSString.

+0

Я не пошел так, как вы предлагали, но ваше решение ответило на вопрос, который я поставил ... спасибо. –

2

Я бы попробовал их сериализацию, а затем преобразовал в NSString.

+0

Мне действительно нравится эта идея лучше, потому что я не набрасываю NSObject на протяжении всей моей модели. +1 –

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 не пустые, поэтому я не знаю, что здесь происходит.

Смежные вопросы