0

我知道这个问题被问了很多,但我是 Objective-C 的新手。我在第一个 viewcontroller.h 中的代码:

@interface ViewController : UIViewController
@property (nonatomic) int mutecounter;
@property (nonatomic) ViewController *targetLevelController;
@end

我在 .m 文件的第一个视图控制器中的代码:

#import "ViewController.h"
@interface ViewController ()
@end

@implementation ViewController
@synthesize mutecounter;
- (void)viewDidLoad
    {
    [super viewDidLoad];
    NSURL *musicFile = [[NSBundle mainBundle] URLForResource:@"Ambler" withExtension:@"mp3"];
    self.backgroundMusic = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile error:nil];
    self.backgroundMusic.numberOfLoops = -1;
    self.backgroundMusic.volume = 0.3;
    [self.backgroundMusic play];
    [self.muteButtonOutlet setBackgroundImage:[UIImage imageNamed:@"mutebutton.png"] forState: UIControlStateNormal];
    _targetLevelController=[[ViewController alloc]init];
    _targetLevelController.mutecounter = mutecounter;
}
- (IBAction)muteButton:(id)sender {
    if (mutecounter % 2 == 0){
        self.backgroundMusic.volume = 0;
        mutecounter = mutecounter + 1;
        [self.muteButtonOutlet setBackgroundImage:[UIImage imageNamed:@"unmutebutton.png"] forState: UIControlStateNormal];
    } else {
        self.backgroundMusic.volume = 0.3;
        mutecounter = mutecounter + 1;
        [self.muteButtonOutlet setBackgroundImage:[UIImage imageNamed:@"mutebutton.png"] forState: UIControlStateNormal];
    }
}

我在第二个 Viewcontroller.h 中的代码:

@interface LevelController : UIViewController
- (IBAction)muteButton:(id)sender;
@end

和我在第二个 Viewcontroller.m 中的代码

#import "LevelController.h"
#import "ViewController.h"

@interface LevelController ()

@end
@implementation LevelController
int mutecounter2;
- (void)viewDidLoad
{
    [super viewDidLoad];
    NSURL *musicFile = [[NSBundle mainBundle] URLForResource:@"Ambler" withExtension:@"mp3"];
    self.backgroundMusic = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile error:nil];
    self.backgroundMusic.numberOfLoops = -1;
    self.backgroundMusic.volume = 0.3;
    [self.backgroundMusic play];
    ViewController *targetLevelController=[[ViewController alloc]init];
    mutecounter2 = targetLevelController.mutecounter;
    if (mutecounter2 % 2 == 0){
        self.backgroundMusic.volume = 0;
        [self.muteButtonOutlet setBackgroundImage:[UIImage imageNamed:@"mutebutton.png"] forState: UIControlStateNormal];
    } else {
        self.backgroundMusic.volume = 0.3;
        [self.muteButtonOutlet setBackgroundImage:[UIImage imageNamed:@"unmutebutton.png"] forState: UIControlStateNormal];
    }
}

- (IBAction)muteButton:(id)sender {
    if (mutecounter2 % 2 == 0){
        self.backgroundMusic.volume = 0;
        mutecounter2 = mutecounter2 + 1;
        [self.muteButtonOutlet setBackgroundImage:[UIImage imageNamed:@"unmutebutton.png"] forState: UIControlStateNormal];
    } else {
        self.backgroundMusic.volume = 0.3;
        mutecounter2 = mutecounter2 + 1;
        [self.muteButtonOutlet setBackgroundImage:[UIImage imageNamed:@"mutebutton.png"] forState: UIControlStateNormal];
    }

}

问题是代码不起作用。有人可以帮助我吗?我总是在 mutecounter2 中得到值 0。但它应该是 1 或 2 或 3 之类的。谢谢马蒂斯

在此处输入图像描述

4

2 回答 2

10

这里有很多问题。我建议重新访问一些讨论应用程序架构的指南。例如, mutecounter2 不是实例变量,但它可能根本不应该存在。

如果静音计数在您的应用程序中是全局状态,那么存储它的最简单位置可能是在您的应用程序的委托中。将 muteCounter @property 添加到委托,两个视图控制器都可以访问它。

但是,如果您的第二个视图控制器总是由第一个推送,那么第一个可以在推送之前设置第二个的值。因此也很常见。

除非 muteCounter 应该在应用程序启动时保持不变,否则不要使用 NSUserDefaults。


仔细考虑一下,似乎@MatisDS 应该可能使用管理背景音乐的共享实例,包括静音计数器的包含等......虽然通常不鼓励共享实例,但在某些情况下它是有保证的并且这似乎是其中之一,因为您只会播放一首背景音乐,并且可能需要全局管理。

虽然 Peter Hosey 的使用全局变量的建议非常有效,但似乎有足够的逻辑与所述变量的管理相关,将功能封装到一个位置可以节省代码并且更简单。

于 2013-07-06T12:25:36.127 回答
1

我总是在 mutecounter2 中得到值 0。但它应该是 1 或 2 或 3 之类的。

出色地...

ViewController *targetLevelController=[[ViewController alloc]init];
mutecounter2 = targetLevelController.mutecounter;

您正在初始化一个 ViewController 实例。它有一个 mutecounter 属性,但你没有在任何地方初始化它。所以 mutecounter2 为 0。

if (mutecounter2 % 2 == 0){
    self.backgroundMusic.volume = 0;
    mutecounter2 = mutecounter2;
    [self.muteButtonOutlet setBackgroundImage:[UIImage imageNamed:@"mutebutton.png"] forState: UIControlStateNormal];
}

你输入那个条件块是因为 0 % 2 = 0。你将 volume 属性设置为 0,然后将 mutecounter2 设置为它自己,所以它仍然是 0(这行应该被删除,它什么都不做)。

所以退后一步,我想知道您是否还需要 2 个视图控制器?虽然父/子视图控制器的概念在 iOS 5 中是可行的,但在 iOS 6 中通过在 Storyboard 中嵌入 Segue 更容易实现。看来您才刚刚开始,所以我建议您使用 Storyboards 开始。Apple 在其文档中提供了一些 Storyboard 教程。

如果你真的需要两个视图控制器,你通常会像这样直接将这样的数据传递给视图控制器,比如:

ViewController *newVC = [[ViewController alloc] init]
newVC.propertyName = someValue

但是你的情况正好相反,所以看起来你正试图从另一个 VC 中“拉”一个值,而不是推一个值。不要那样做,因为那样你的 VC 就会有不必要的依赖。

但实际上,使用故事板。

于 2013-07-06T13:04:46.517 回答