在另一个类iOS

时间:2015-12-16 22:36:22

标签: ios objective-c class variables

我在这里遵循了无数类似的情况(堆栈溢出)。我已经为我的情况应用了这些写作并且已经接近但没有找到对我有用的解决方案。由于这是非常微不足道的事情,我感到困惑的是它不适合我。

无论如何,我试图从appDelegate类中设置一个Int变量,如果这是正确的话,变量实际上属于另一个类(mainViewController)。

对于MainViewController类.h文件,我有

@interface MainWindowControllerViewController :... { 
   int relayState;
}
@property (readwrite, nonatomic) int relayState;

对于MainViewController类.m文件,我有

@implementation MainWindowControllerViewController
@synthesize relayState = _relayState;

-(void)quickConnect { // Call for all UI bypassing and quick kill

NSLog(@"Relay state in MainWindow = %d", relayState);

    if (_relayState == 1) {
        NSLog(@"TURNING ON KILL SWITCH");
        self.writeData = [[NSString stringWithFormat:@"%@", @"e"] dataUsingEncoding:NSASCIIStringEncoding];
        [sensor write:sensor.activePeripheral data:writeData];

    } else {
        NSLog(@"TURNING OFF KILL SWITCH");
        self.writeData = [[NSString stringWithFormat:@"%@", @"o"] dataUsingEncoding:NSASCIIStringEncoding];
        [sensor write:sensor.activePeripheral data:writeData];
    }
}

对于appDelegate.h文件,我有

#import "MainWindowControllerViewController.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    MainWindowControllerViewController *relayState;
}
@property (nonatomic, assign) MainWindowControllerViewController *relayState;

然后我的appDelegate.m文件

#import "MainWindowControllerViewController.h"

@implementation AppDelegate
@synthesize relayState = _relayState;

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *) sourceApplication annotation:(id)annotation {

    NSLog(@" Calling application: %@", sourceApplication);
    NSLog(@" URL scheme: %@", [url scheme]);

    if ([sourceApplication isEqualToString:@"URL-Scheme-Test"]) {

        if ([[url scheme] isEqualToString:@"TurnOffRelay"]) {

            _relayState =[[MainWindowControllerViewController alloc] init];
            _relayState.relayState = 1;
            NSLog(@"Relay State BEFORE = %d", _relayState.relayState);

        }

        return YES;

        if ([[url scheme] isEqualToString:@"TurnOnRelay"]) {

            _relayState =[[MainWindowControllerViewController alloc] init];
            _relayState.relayState = 0;
            NSLog(@"Relay State BEFORE = %d", _relayState.relayState);

        }

        return YES;

    }

    else

        return NO;


}

这就是它。当我执行日志时,我发现我想要更改值的relayState表明我能够更改该值。但是,当我执行上面的If语句检查天气时,relayState等于1,变量总是为0。

我不是最熟练的Obj C.一些帮助将不胜感激!谢谢。如果需要,我很乐意回答有关代码的任何额外问题。

4 个答案:

答案 0 :(得分:0)

你有点混合一些旧式的obj-c与它当前通常看起来的样子,我认为你隐藏了一个变量(一个声明隐藏了另一个)

取出:

{ 
   int relayState;
}

从您的MainWindowControllerViewController界面

取出MainWindowControllerViewController实现中的@synthesize

请勿使用_relayState(只需使用relayState

对AppDelegate中的MainWindowControllerViewController变量执行相同的操作。

如果这不能解决问题,我们需要了解您正在创建的VC会发生什么。

答案 1 :(得分:0)

我认为问题就是这一行

 _relayState =[[MainWindowControllerViewController alloc] init];

您正在两个if块中初始化MainWindowControllerViewController,每次都将值重置为默认值(在本例中为0)。

答案 2 :(得分:0)

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
MainWindowControllerViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MainWindowControllerViewControllerIdentifier"];
vc.relayState = 1;

对于MainViewController类.h

@interface MainWindowControllerViewController :... { int relayState; //remove this line } @property (nonatomic) int relayState; //use this

试试这个

答案 3 :(得分:0)

你犯的错误会给你带来无穷无尽的问题。

您有一个名为relayState的属性和一个名为relayState的实例变量。

属性“relayState”由名为_relayState的实例变量支持。您有另一个名为relayState的实例变量。两个不同的变量。分配给self.relayState会更改一个,分配给relayState会更改另一个。不要这样做。

摆脱“int relayState;”并且不要使用@synthesize,你会没事的。至少比你现在更精细。然后,您可以使用self.relayState或_relayState。至少你会永远知道你在做什么。

PS。拥有一个int relayState和一个MainWindowViewController * relayState只是在寻找麻烦。你似乎故意试图迷惑自己。

PS。您似乎使用writeData属性/变量执行相同的危险游戏。