k,我是新手,所以一般都是道歉。
我正在尝试从不同的视图和类访问UISwitch值(打开或关闭),但无法使其正常工作。
这是一款简单的2视图应用。主视图和第二个是偏好菜单。
尝试编写if / else方法,以便在开关(在另一个视图上)打开时播放声音,而不是在关闭时播放声音。
我似乎无法使其发挥作用。任何想法或一些语法示例都会对我有所帮助。
感谢。
答案 0 :(得分:4)
正如Matt Wilding所说:“从另一个视图控制器访问UI组件并不是一种好的形式......”。
当用户更改了开关状态时,您将状态保存为NSUserDefaults作为首选项值,而不是访问视图对象。您可以随时通过首选项访问交换机状态值。
答案 1 :(得分:1)
我将采取我认为你在这里想要完成的事情并建议另一种方法。您希望在您的应用程序中具有首选项(假设为“首选项菜单”),允许用户设置诸如您的应用程序是否播放背景音乐之类的内容。 (可能不准确,这只是为了澄清)。
通常,在设计良好的应用程序中,流程由数据驱动,UI反映数据模型的状态,控制器协调两个层。您的建议是让您的应用程序根据UI的状态播放音乐,而不受任何数据模型的支持。这会削减模型级别,正如您所注意到的,可能会导致在不同控制器的UI之间进行通信的笨拙尝试以获取信息。
应用程序首选项等内容通常存储在通过NSUserDefaults类管理的漂亮的.plist文件中。这将是数据级别跟踪您的偏好的好地方。在这种情况下,UISwitch将表示设置文件中的标志状态,更改开关的值将更改文件中的值。如果设置了play-sound-flag,您需要知道应用程序中的任何其他位置,您将引用数据模型信息而不是UI。这将视图控制器彼此分离,这是一件好事。
答案 2 :(得分:0)
为此目的,在app delegate中为swith添加选择器并生成NSInteger属性。如下所示
[
yourSwitch addTarget:self action:@selector(switched:) forControlEvents:UIControlEventValueChanged];
-(IBAction) switched: (id)sender
{
int state=0;
if(yourSwitch.on)
state=1;
else
state=0;
objAppDelegate.switchState=state;
}
然后你需要在播放声音的第二个视图中访问这个appDelegate属性 然后根据这个值你可以做你想做的事情,并且为了制作appDelegate类的对象,你需要这一行
YourAppDelegateClass *objAppDelegate=(YourAppDelegateClass *)[[UIApplication sharedApplication] delegate];
好的,如果你有任何其他疑问,那么你可以问。