2014-01-08 4 views
4

Я долгое время пытался найти решение проблемы, которая должна быть довольно прямолинейной. Что я хочу - это переменные, которые можно редактировать в меню настроек iPhone, пока приложение не запущено. В основном файл конфигурации, завернутый в графический интерфейс iOS.Доступ к настройкам Xamarin.iOS.Bundle?

Предполагается, что это встроенная функция в iOS, и хотя я могу найти некоторые связанные с ней методы, я не могу найти фактическое решение.

Ближайший я был, чтобы получить то, что я хочу, это то, где он работает, как и любая другая переменная: пуст при запуске приложения и снова поцарапается при закрытии приложения. И все еще не отображается в окне настроек iPhone.

Это код у меня есть:

private void LoadSettingsFromIOS() 
{ 
    // This is where it works like any other variable. Aka. gets scratched on app closing. 
    _thisUser.SetValueForKey(new NSString("Blargh"), new NSString("SaveCredentials")); 
    string stringForKey = _thisUser.StringForKey("SaveCredentials"); 

    // This is where I'm supposed to be able to load the data from settings and set the checkbox's 'On' state to the value. Currently it always returns False. 
    bool saveCredentials = _thisUser.BoolForKey("SaveCredentials"); 
    chckBoxRememberMe.On = saveCredentials; 
} 

И мой Settings.Bundle Root.pList файл:

<?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
    <plist version="1.0"> 
    <dict> 
     <key>PreferenceSpecifiers</key> 
     <array> 
      <dict> 
       <key>Type</key> 
       <string>PSToggleSwitchSpecifier</string> 
       <key>Title</key> 
       <string>Credentials</string> 
       <key>Key</key> 
       <string>SaveCredentials</string> 
       <key>DefaultValue</key> 
       <true/> 
      </dict> 
     </array> 
     <key>StringsTable</key> 
     <string>Root</string> 
    </dict> 
    </plist> 

кто там, кто был баловаться с Xamarin прошивкой и знает, как это работает?

ответ

5

EDIT: Вот рабочий проект в Xamarin: https://github.com/xamarin/monotouch-samples/tree/master/AppPrefs

Во-первых, вы должны сделать свой вид, видимый в окне iPhone Settings.

Для этого вам необходимо создать папку с именем «Settings.bundle» в каталоге верхнего уровня пакета вашего приложения. Затем создайте новый файл с именем «Root.plist». Файл должен быть типа Property List. Вы делаете это, щелкнув правой кнопкой мыши Settings.bundle, затем Add -> New File ... -> iOS (на левой панели) -> Список свойств. Если вы добавите пустой файл и затем переименуете его как .plist, он не будет отображаться в настройках iPhone.

Первый элемент в вашем Root.plist должен быть массивом, и он должен содержать словари.

Вы можете найти более подробную информацию здесь о том, как построить свою Настройку Вид: https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html

Обратите внимание на Рисунок 4-2 (Строки файл не нужен). Кроме того, отредактируйте файл Root.plist в редакторе Xamarin, это намного проще.

Чтобы получить значения из вновь созданных настроек, вы можете использовать этот класс (Добавьте столько свойств, как вы хотите):

public class Settings 
{ 
    public static string ApiPath { get; private set; } 

    const string API_PATH_KEY = "serverAddress"; //this needs to be the Identifier of the field in the Root.plist 

    public static void SetUpByPreferences() 
    { 
     var testVal = NSUserDefaults.StandardUserDefaults.StringForKey(API_PATH_KEY); 

     if (testVal == null) 
      LoadDefaultValues(); 
     else 
      LoadEditedValues(); 

     SavePreferences(); 
    } 

    static void LoadDefaultValues() 
    { 
     var settingsDict = new NSDictionary(NSBundle.MainBundle.PathForResource("Settings.bundle/Root.plist", null)); 

     if (settingsDict != null) 
     { 
      var prefSpecifierArray = settingsDict[(NSString)"PreferenceSpecifiers"] as NSArray; 

      if (prefSpecifierArray != null) 
      { 
       foreach (var prefItem in NSArray.FromArray<NSDictionary>(prefSpecifierArray)) 
       { 
        var key = prefItem[(NSString)"Key"] as NSString; 

        if (key == null) 
         continue; 

        var value = prefItem[(NSString)"DefaultValue"]; 

        if (value == null) 
         continue; 

        switch (key.ToString()) 
        { 
         case API_PATH_KEY: 
          ApiPath = value.ToString(); 
          break; 
         default: 
          break; 
        } 
       } 
      } 
     } 
    } 

    static void LoadEditedValues() 
    { 
     ApiPath = NSUserDefaults.StandardUserDefaults.StringForKey(API_PATH_KEY); 
    } 

    //Save new preferences to Settings 
    static void SavePreferences() 
    { 
     var appDefaults = NSDictionary.FromObjectsAndKeys(new object[] { 
      new NSString(ApiPath) 
     }, new object[] { 
      API_PATH_KEY 
     }); 

     NSUserDefaults.StandardUserDefaults.RegisterDefaults(appDefaults); 
     NSUserDefaults.StandardUserDefaults.Synchronize(); 
    } 
} 

Вы просто позвоните SetUpByPreferences() (который является единственным публичным способом), а затем получить значения из свойств в классе.

0

Попробуйте это:

NSBundle.MainBundle.PathForResource ("Settings", @"bundle"); 
Смежные вопросы