Objective-C从其他类访问int

Mat*_*sDS 0 integer class objective-c

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

@interface ViewController : UIViewController
@property (nonatomic) int mutecounter;
@property (nonatomic) ViewController *targetLevelController;
@end
Run Code Online (Sandbox Code Playgroud)

我的代码在.m文件的第一个viewcontroller中:

#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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@interface LevelController : UIViewController
- (IBAction)muteButton:(id)sender;
@end
Run Code Online (Sandbox Code Playgroud)

和我在第二个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];
    }

}
Run Code Online (Sandbox Code Playgroud)

问题是代码不起作用.有人能帮助我吗?我总是在mutecounter2中得到值0.但它应该是1或2或3或其他东西.谢谢马蒂斯

在此输入图像描述

bbu*_*bum 10

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

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

但是,如果第二个视图控制器始终被第一个视图控制器推动,那么第一个视图控制器可以在推动之前的第二个视图控制器上设置值.因此也很常见.

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


通过更多思考,似乎@MatisDS应该使用管理背景音乐的共享实例,包括静音计数器的包含等等......虽然通常不鼓励使用共享实例,但有些情况下需要保证,这似乎是其中之一,因为你只会有一个背景音乐播放,它可能需要全球管理.

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