1

k,我对此很陌生,所以总的来说,我很抱歉。

我正在尝试从不同的视图和类访问 UISwitch 值(打开或关闭)并且无法使其工作。

这是一个简单的 2 视图应用程序。主视图,第二个是首选项菜单。

尝试编写一个 if/else 方法来在开关(在另一个视图上)打开而不是在其关闭时播放声音。

我似乎无法让它工作。任何想法或一些语法示例都会真正帮助我。

谢谢。

4

3 回答 3

4

正如 Matt Wilding 所说,“从另一个视图控制器访问一个视图控制器的 UI 组件不是一种好的形式……”。

当用户更改开关状态时,您无需访问视图对象,而是将状态保存到 NSUserDefaults 作为首选项值。您可以随时通过首选项访问开关状态值。

于 2011-01-21T05:34:20.387 回答
1

我将采用我认为您在这里尝试完成的工作并提出一种替代方法。您希望在您的应用程序中有一个首选项(假设来自“首选项菜单”),允许用户设置您的应用程序是否播放背景音乐。(可能不准确,这只是为了澄清)。

通常,在设计良好的应用程序中,流程由数据驱动,UI 反映数据模型的状态,控制器协调两个层。您的建议是让您的应用程序根据 UI 的状态播放音乐,这不受任何数据模型的支持。这会切断模型级别,并且正如您所注意到的,可能会导致在不同控制器的 UI 之间进行通信以获取信息的尴尬尝试。

诸如应用程序首选项之类的东西通常存储在一个漂亮的 .plist 文件中,该文件通过 NSUserDefaults 类进行管理。这将是您偏好的数据级别跟踪的好地方。在这种情况下,UISwitch 将表示设置文件中标志的状态,更改开关的值将更改文件中的值。在您的应用程序中您需要知道是否设置了播放声音标志的任何其他地方,您引用数据模型信息而不是 UI。这将视图控制器彼此分离,这是一件好事。

于 2011-01-21T06:13:53.267 回答
0

为此,为 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];

好的,如果您有任何其他疑问,那么您可以问。

于 2011-01-21T05:38:40.507 回答