Objective-C, счетчики и пользовательские сеттеры - как заставить это работать? - PullRequest
0 голосов
/ 22 января 2010

У меня есть класс Application Delegate с перечислением, которое выглядит следующим образом:

typedef enum {
    Online = 3500,
    DoNotDisturb = 9500,
    Offline = 18500,
    Away = 15500,
    Busy = 6500,
    BeRightBack = 12500
} status;

Кроме того, у меня есть свойство для установки значения из перечислителя в моем файле интерфейса:

@interface MyAppDelegate : NSObject <UIApplicationDelegate> {
    status userStatus;
}

@property (nonatomic, setter=setStatus) status userStatus;

@end

Наконец, в моем файле реализации есть следующее сообщение:

@implementation Communicator2AppDelegate

- (void)setStatus:(status)_userStatus {
    if ([NSThread isMainThread]) {
        // some stuff happens here ...
    } else {
        [self performSelectorOnMainThread:@selector(setStatus:) withObject:_userStatus waitUntilDone:NO];
    }
}

Моя проблема заключается в следующем: сообщение executeSelectorOnMainThread не работает, поскольку оно не принимает в качестве значения _userStatus. Я предполагаю, что сообщение предполагает, что это перечисление, а не реальная ценность. При компиляции я получаю следующее сообщение об ошибке: «Несовместимый тип для аргумента 2 executeSelectorOnMainThread: withObject: waitUntilDone.» »

Кто-нибудь знает, как заставить это работать?

1 Ответ

1 голос
/ 22 января 2010

Вам необходимо передать значение объекта этому методу, а enum (то есть int) является скалярным значением. Чтобы достичь того, что вам нужно, вы должны обернуть ваше целое число в объект obj-c (например, NSNumber):

- (void)setStatus:(status)_userStatus {
    if ([NSThread isMainThread]) {
        // some stuff happens here ...
    } else {
        [self performSelectorOnMainThread:@selector(setStatus:) withObject:[NSNumber numberWithInt:_userStatus] waitUntilDone:NO];
    }
}
...