[英]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.