0

我正在发送带有枚举的通知:

[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationTitle object:nil userInfo:@{[NSNumber numberWithInt:option2]:kNotificationName}];

并收到它:

- (void)myAction:(NSNotification *)notification {
MyState myState = (MyState)[[[notification userInfo] objectForKey:kNotificationName] integerValue];

问题是 myState 的值错误。当我打印通知时,我得到:

Printing description of notification:
NSConcreteNotification 0x123456 {name = notificationTitle; userInfo = {2 = notificationName;}}

但是 myState == option0。

为什么会这样?

编辑:

typedef enum myStates {
  option0,
  option1,
  option2,
  option3
} MyState;
4

4 回答 4

1

尝试像这样编写您的枚举函数:-

typedef enum myStates {
  option0 = 0,
  option1,
  option2,
  option3
} MyState;

并单独打印通知的输出和 myState 对象的输出。

于 2013-09-11T07:42:43.670 回答
1

我不会使用 NSNotification (正如您所发现的,没有编译时检查,并且在很多情况下使用起来真的很麻烦)。相反,一个更好的选择可能是使用像Tolo这样的事件总线——非常易于使用,并且可以在 dealloc 上自动删除订阅者。你只需写:

@interface EventStateChanged : NSObject
@property(nonatomic) MyState state;
@end

SUBSCRIBE(EventStateChanged)
{
MyState state = event.state;
    // Do something with state.
}

一探究竟。

于 2013-09-11T18:57:29.157 回答
0

看起来你得到了值和键转换。

字典应该这样使用:@{key:value}

尝试这个:

[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationTitle object:nil userInfo:@{kNotificationName:[NSNumber numberWithInt:option2]}];

希望能帮助到你 :)

于 2013-09-11T07:50:39.223 回答
0

用户信息是一个键 => 值字典:

userInfo:@{[NSNumber numberWithInt:option2]:kNotificationName}];

在这里你有值 => 键。尝试这个:

@{kNotificationName:@{option2}]
于 2013-09-11T07:52:25.583 回答