繁体   English   中英

在另一个类iOS中更改变量

[英]Changing Variable in another class iOS

我在这里遵循了无数类似的情况(堆栈溢出)。 我已经针对我的情况应用了这些文章,并且已经接近,但没有找到适合我的解决方案。 因为这是一件非常琐碎的事情,所以我对它对我不起作用感到困惑。

无论如何,我试图从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的专家。 谢谢。 如果需要,我将很乐意回答有关代码的任何其他问题。

您有点将一些较旧的obj-c与当前的外观混合在一起,并且我认为您正在隐藏变量(一个声明正在隐藏另一个)

取出:

{ 
   int relayState;
}

从您的MainWindowControllerViewController界面

在MainWindowControllerViewController实现中删除@synthesize

不要使用_relayState (仅使用relayState

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

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

我相信的问题是这条线

 _relayState =[[MainWindowControllerViewController alloc] init];

您正在两个if块中初始化MainWindowControllerViewController,每次将其重置为默认值(在这种情况下为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

尝试这个

您犯了一个错误,将为您带来无穷的问题。

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

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

只是摆脱“ int relayState;” 并且不要使用@synthesize,一切都会好起来的。 至少比您现在好很多。 然后,您可以使用self.relayState或_relayState。 至少您将永远知道自己在做什么。

PS。 具有int relayState和MainWindowViewController * relayState只是在问麻烦。 您似乎在故意使自己迷惑。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM