2

Xcode(iOSOpenDev)で通知センターウィジェットを作成するときに「設定バンドル」ボックスにチェックを入れて追加した設定バンドルのコードを書き込もうとしています。私はそのPSLinkListCell中に3つのアイテムを持っています。UIimage選択した選択に応じて、ビュー内のイメージを変更する 3 つのアイテムも希望します。

どんな助けでも大歓迎です。

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);
4

1 に答える 1

1

したがって、必要なのは、ユーザーが設定(Preferences.app) を使用して設定を変更したときに、ウィジェットコードが通知を受けるようにすることです。plist のセットアップ方法に基づいて、次の名前のDarwin 通知のように見えます

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];
}

最後に、設定 plist を読み取ってイメージ ビューを更新するコード:

-(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 / blueBackground@2x.png
           break;
        case 2:
           bgView.image = [UIImage imageNamed: @"greenBackground"];
           break;
        case 3:
           bgView.image = [UIImage imageNamed: @"redBackground"];
           break;
        default:
           break;
    }
}
于 2013-04-16T01:54:19.760 に答える