如何将消息发送到不同视图的按钮?
问题描述:
我有一个应用程序,它具有充当视图控制器的主视图。这个主视图上有3个按钮。我有3个子视图,我可以通过3个按钮控制这个主视图。每个子视图都有一个按钮。当按下此按钮时,我希望它禁用主视图上的3个按钮,直到再次按下该按钮。有没有办法在视图之间发送消息来禁用按钮?如何将消息发送到不同视图的按钮?
答
使用NSNotifications发布按钮被按下的通知。
[[NSNotificationCenter defaultCenter] postNotificationName:@"Button1Pressed" object:self userInfo:info];
然后添加观察者,以便他们监听这些通知。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(buttonPress:) name:@"Button1Pressed" object:nil];
现在实行buttonPress
阅读HERE的NSNotification手动和学会使用它。
答
这听起来像是切换到我。更像一个设置。如果你想一想,这应该在NSUserDefaults
。而当你特定的视图来了,大概在viewWillAppear:
或viewDidAppear:
,为此,
BOOL controlsEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"ControlsEnabledKey"];
button1.enabled = controlsEnabled;
button2.enabled = controlsEnabled;
button3.enabled = controlsEnabled;
要节省按下按钮的价值,
BOOL controlsEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"ControlsEnabledKey"];
[[NSUserDefaults standardUserDefaults] setBool:!controlsEnabled forKey:@"ControlsEnabledKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
注由于boolForKey:
将返回NO
如果找不到密钥,我建议您在应用程序启动时将值设置为YES
,如果您希望在启动时启用控件。
答
将主视图/控制器设置为内部视图的代表,定义一个协议,在该协议中定义一个方法,例如toggleMainButtons
,使VC符合该协议并实现该消息。在按钮上,addTarget:self.delegate action:@selector(toggleMainButtons) forControlEvents:UIControlEventTouchUpInside
。
好的,我试图理解这一点。请耐心等待,我对Objective C相当陌生。在我的主视图中,在viewDidLoad中,我放置了观察者(如上所示)和removeObserver。在3个子视图中的一个中,我将postNotification放置在buttonPress方法中。我没有收到任何警告或错误,但是当我按下按钮时什么都没有发生。有任何想法吗? – tombuarts 2011-06-17 23:41:33
好的,我想出了我的错误。我在错误的地方删除了Observer。我把它移到(void)dealloc中,它很好用。非常感谢您的帮助。 – tombuarts 2011-06-18 00:30:16