Preference Bundle PSLinkListCell изменить изображение

Я пытаюсь написать код для своего пакета предпочтений, который я добавил, отметив поле «пакет предпочтений» при создании виджета центра уведомлений в Xcode (iOSOpenDev). У меня есть PSLinkListCell с тремя элементами внутри. Я хотел бы, чтобы три элемента также меняли изображение в представлении UIimage в зависимости от выбранного варианта.

Любая помощь приветствуется.

PLIST (только PSLinkListCell)

  <dict>
        <key>cell</key>
        <string>PSLinkListCell</string>
        <key>defaults</key>
        <string>dylankelly.MyStat</string>
        <key>key</key>
        <string>color_pref</string>
        <key>label</key>
        <string>Background Colour</string>
        <key>detail</key>
        <string>PSListItemsController</string>
        <key>validTitles</key>
        <array>
            <string>Blue</string>
            <string>Green</string>
            <string>Red</string>
        </array>
        <key>validValues</key>
        <array>
            <integer>1</integer>
            <integer>2</integer>
            <integer>3</integer>
        </array>
        <key>default</key>
        <integer>1</integer>
        <key>PostNotification</key>
        <string>dylankelly.MyStat-preferencesChanged</string>
    </dict>

Представление UIImage

UIImage *bg = [[UIImage imageWithContentsOfFile:@"/System/Library/WeeAppPlugins/MyStat.bundle/WeeAppBackground.png"] stretchableImageWithLeftCapWidth:5 topCapHeight:71];
UIImageView *bgView = [[UIImageView alloc] initWithImage:bg];
bgView.frame = CGRectMake(0, 0, 312, 71);

person dylaank    schedule 14.04.2013    source источник
comment
пожалуйста, покажите код (plist), который определяет ваш PSLinkListCell, и, возможно, код, который показывает ваш UIImageView, который вы используете в виджете.   -  person Nate    schedule 15.04.2013
comment
простите это понятно?   -  person dylaank    schedule 15.04.2013
comment
Я отредактировал вопрос.   -  person dylaank    schedule 15.04.2013
comment
У вас уже есть обработчик обратного вызова в коде Objective-C вашего виджета, который отвечает на уведомление dylankelly.MyStat-preferencesChanged?   -  person Nate    schedule 16.04.2013
comment
Извините, я не знаю, что это такое, это #define PLIST_FILENAME @/Library/PreferenceLoader/Preferences/MyStat.plist это что?   -  person dylaank    schedule 16.04.2013
comment
о нет, это не то. Извините, я не знаю, что это такое.   -  person dylaank    schedule 16.04.2013


Ответы (1)


Итак, вам нужно, чтобы ваш виджет code получал уведомление, когда пользователь использует Settings (Preferences.app) для изменения настройки. В зависимости от того, как настроен ваш plist, он выглядит как Уведомление Дарвина с именем

dylankelly.MyStat-preferencesChanged

будет отправлено через центр уведомлений Darwin, когда пользователь изменит настройку. Итак, вам нужно зарегистрировать обратный вызов, который будет вызываться при появлении этого уведомления. Как только ваш код загружен, вы должны сделать что-то вроде этого (например, в MyWidgetViewController.m, если там управляются изображения):

#include <notify.h>

...

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
                                (void*)self, // observer
                                onPreferencesChanged, // callback
                                CFSTR("dylankelly.MyStat-preferencesChanged"), // event name
                                NULL, // object
                                CFNotificationSuspensionBehaviorDeliverImmediately);

где ваш метод обратного вызова (поместите его в тот же файл MyWidgetViewController.m) будет:

static void onPreferencesChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {

    // since this is a static method, we pass the instance in the observer parameter
    MyWidgetViewController* vc = (MyWidgetViewController*)observer;
    [vc updateImage];
}

и, наконец, код для чтения списка предпочтений и обновления изображения:

-(void) updateImage {
    // load the preferences plist file, and read the new color_pref value
    NSDictionary* sharedPrefs = [[NSDictionary alloc] initWithContentsOfFile: PLIST_FILENAME];
    NSNumber* color = (NSNumber*)[sharedPrefs valueForKey: @"color_pref"];
    int colorValue = [color intValue];
    // the integer values correspond to the validValues defined in the 
    //  preference bundle's plist file
    switch (colorValue) {
        case 1:
           bgView.image = [UIImage imageNamed: @"blueBackground"];  // for blueBackground.png / [email protected]
           break;
        case 2:
           bgView.image = [UIImage imageNamed: @"greenBackground"];
           break;
        case 3:
           bgView.image = [UIImage imageNamed: @"redBackground"];
           break;
        default:
           break;
    }
}
person Nate    schedule 16.04.2013
comment
Спасибо за ответ! Я обновил свой код всем вышеперечисленным. изображения находятся как таковые bg.image = [[UIImage imageNamed: @/System/Library/WeeAppPlugins/MyStat.bundle/WeeAppBackgroundBlue.png]; Должно ли это быть проблемой, потому что фоновое изображение не отображается? - person dylaank; 16.04.2013
comment
также куда должен идти CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter()? - person dylaank; 16.04.2013
comment
@user2196709 user2196709, как я уже сказал в своем ответе, CFNotificationCenterAddObserver() нужно добавить в код вашего виджета в место, которое запускается как можно скорее. Пока этот вызов не будет сделан, ваш виджет не сможет получать уведомления. Поскольку вам также необходимо передать указатель на контроллер представления, который управляет изображениями (например, self выше), вероятно, также имеет смысл сохранить этот код в том же классе, который имеет обратный вызов (onPreferencesChanged()) и updateImage. - person Nate; 17.04.2013
comment
@user2196709 user2196709, если /System/Library/WeeAppPlugins/MyStat.bundle/WeeAppBackgroundBlue.png - это правильный путь к вашему изображению, и оно не загружается, то я бы сказал, что UIImage imageNamed: требует относительных путей, а не абсолютных. Например [UIImage imageNamed: @"WeeAppBackgroundBlue"]. Обычно вы также хотите оставить расширение .png и позволить UIKit выбирать между изображениями с низким и высоким разрешением (Retina). - person Nate; 17.04.2013
comment
Спасибо за все что ты сделал для меня! Я пробовал [UIImage imageNamed], но все равно не повезло. Вы сказали, что мне нужно передать указатель на контроллер представления, который управляет изображениями, это файл .m? потому что у меня только один из них. - person dylaank; 17.04.2013
comment
@ user2196709, вы задаете здесь довольно сложный вопрос (как использовать недокументированные функции для создания джейлбрейк-твика), но ваши вопросы указывают на то, что вы начинающий разработчик. Извините за резкость, но я не думаю, что смогу помочь вам с этим. Загрузка UIImage из вашего пакета — это самый простой из возможных вопросов iOS. Как ты это делаешь сейчас? Вы, должно быть, уже установили фоновое изображение, верно? Сделайте так, но измените имя файла. Или, может быть, задать другой вопрос здесь, без всего, что связано с префами plist. Это не имеет ничего общего с изображениями. - person Nate; 17.04.2013
comment
Подводя итог, важно научиться ходить, прежде чем бегать. Делайте свое приложение/настройку по одному маленькому шагу за раз и ознакомьтесь с некоторыми учебными пособиями. - person Nate; 17.04.2013
comment
Я могу нормально загрузить изображение в imageView, все в порядке, ага, я пытался найти учебники по этому вопросу, но, похоже, не могу их найти. Может быть, есть другой (более простой) способ включить фоновое изображение без использования PSLinkListCell? Спасибо - person dylaank; 17.04.2013
comment
@ user2196709, ваша проблема ничего не связана с PSLinkListCells. Ваша проблема в том, что вам трудно понять, как загрузить UIImage из вашего пакета (что, как я заметил, было вашей проблемой в одном из двух ваших других вопросов). Еще раз извините, но сейчас мне придется расписаться. - person Nate; 17.04.2013