MonoTouch: проблема с файлом Settings.bundle

Я пытался настроить параметры для своего приложения, но не могу заставить это работать, хотя я просматривал его снова и снова и сравнивал с примером в книге и пример в блоге Крейга Данна.

Я понимаю, что синтаксис должен быть идеальным, и этот файл довольно прост на данный момент, я просто пытаюсь отобразить одно текстовое поле. Я ненадолго заработал над совершенно новым проектом, однако с тех пор мне так и не удалось заставить его работать.

Вот XML моего файла 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>Root</key>
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string>Group Name</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>AutocapitalizationType</key>
            <string>None</string>
            <key>AutocorrectionType</key>
            <string>No</string>
            <key>Key</key>
            <string>usernameTextField</string>
            <key>Title</key>
            <string>Username</string>
            <key>Type</key>
            <string>PSTextFieldSpecifier</string>
        </dict>
    </array>
</dict>
</dict>
</plist>

Как я уже сказал, я просматривал его довольно много раз и не вижу никаких проблем с ним. Для действия сборки файла задано значение «Содержимое», а для параметра «Копировать в выходной каталог» задано значение «Всегда копировать». Я использую версию MonoTouch 6.0.7.

Буду признателен за любую помощь в этом вопросе. Спасибо


person Serberuss    schedule 07.12.2012    source источник
comment
Можете ли вы точно объяснить, какое поведение вы видите и какое поведение вы ожидаете?   -  person Rolf Bjarne Kvinge    schedule 08.12.2012
comment
Поведение, которое я вижу, заключается в том, что в приложении «Настройки» не отображаются параметры пользовательских настроек. Я ожидаю увидеть добавленное текстовое поле имени пользователя. Однако все, что я вижу, это настройки отладки MonoTouch. Я также пытался запустить его как сборку релиза, но настройки просто пусты.   -  person Serberuss    schedule 08.12.2012


Ответы (2)


  1. Убедитесь, что каталог Settings.bundle включен в верхний уровень проекта. Под верхним уровнем я подразумеваю, что в файловой системе каталог Settings.bundle должен находиться в том же каталоге, что и ваш файл ProjectName.csproj. В MonoDevelop он будет отображаться как одна из папок верхнего уровня в узле проекта.

  2. Установите для действия сборки Root.plist значение BundleResource (не включайте «Копировать в выходной каталог». Подсказка: если вы обнаружите, что устанавливаете «Копировать в выходной каталог», не делайте этого — это почти всегда неправильно — мы на самом деле обсуждали удаление опции вообще.)

Теперь о формате файла 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>PSGroupSpecifier</string>
            <key>Title</key>
            <string>Group Name</string>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSTextFieldSpecifier</string>
            <key>Title</key>
            <string>Username</string>
            <key>AutocapitalizationType</key>
            <string>None</string>
            <key>AutocorrectionType</key>
            <string>No</string>
            <key>KeyboardType</key>
            <string>Alphabet</string>
            <key>IsSecure</key>
            <false/>
            <key>Key</key>
            <string>usernameTextField</string>
            <key>DefaultValue</key>
            <string></string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

Глядя на ваш файл Root.plist, кажется, что ключ PreferenceSpecifiers не находится в узле dict верхнего уровня (он должен быть). Другими словами:

избавиться от следующих строк в верхней части файла:

<dict>
<key>Root</key>

...и одну из следующих строк в конце вашего файла:

</dict>

Это должно сделать это ...

Теперь... все это, я только недавно понял это сам, пытаясь добавить настройки в свой личный побочный проект, и решил, что нам, в Xamarin, нужно упростить это. Я уже исправил несколько незначительных проблем в грядущей версии MonoDevelop 3.1, но я надеюсь получить время, необходимое для добавления шаблонов для Settings.bundle в мастер «Добавить новый файл» MonoDevelop. Я также хотел бы добавить подсказку ключа/значения plist, как мы делаем для Info.plist и Entitlements.plist, чтобы редактор plist от MonoDevelop мог лучше направлять вас при редактировании этих файлов plist.

person jstedfast    schedule 08.12.2012
comment
Отлично, как только я удалил начальный корневой элемент, все заработало нормально. Спасибо за очень полезный пост - person Serberuss; 08.12.2012

Во-первых, вам не хватает закрывающего тега plist </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>Stay Signed-In</string>
          <key>Key</key>
          <string>staySignedIn</string>
          <key>DefaultValue</key>
          <true/>
      </dict>
    </array>
</dict>
</plist>

Надеюсь, это поможет.

person valdetero    schedule 07.12.2012
comment
Извините моя ошибка. У файла действительно есть закрывающий тег ‹/plist›, который я, должно быть, пропустил, когда копировал содержимое сюда. Мой оригинальный пост был обновлен. - person Serberuss; 07.12.2012