【问题标题】:Using a variable from one class in another在另一个类中使用一个类的变量
【发布时间】:2014-10-06 23:26:27
【问题描述】:

我正在尝试使用 Objective-C 制作 iOS 应用程序。但是,我遇到了一个问题。基本上,我在一个类中设置 myVariable 的值,然后尝试在另一个类中使用它。这是我的代码。

//This is in Class2
#import Class1
Class1 *class = [[Class1 alloc] init];

//Then I try to log my variable
NSLog(@"%@", Class1.myVariable);

我不想将 myVariable 设置为 class2 中的任何值,因为我希望它保持与 class1 中相同的值。但是,使用我的代码,myVariable 在 class2 中返回 (null)。在 class1 myVariable 是 6。有人认为他们可以帮助我吗?谢谢!

这是我在 Class1 中的代码示例。

- (IBAction)six:(id)sender {
_numberOfDice = 6;
 [self saveNumber];
self.checkmark.hidden = YES;
self.checkmark2.hidden = YES;
self.checkmark3.hidden = YES;
self.checkmark4.hidden = YES;
self.checkmark5.hidden = YES;
self.checkmark6.hidden = NO;
}
-(void) saveNumber {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [paths lastObject];
NSString *filePath = [documentPath stringByAppendingPathComponent:@"number"];
_amountString = [NSString stringWithFormat:@"%d", _numberOfDice];
BOOL isSuccessful = [NSKeyedArchiver archiveRootObject:_amountString toFile:filePath];
if(isSuccessful) {
    NSLog(@"It has saved.");
    NSLog(@"the string is %@", _amountString);
    NSLog(@"The integer is %d", _numberOfDice);

}
}

-(void) loadNumber {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [paths lastObject];
NSString *filePath = [documentPath stringByAppendingPathComponent:@"number"];
_amountString = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
if(!_amountString) {
    _amountString = [[NSString alloc] init];
}
}

正如你在上面的代码中看到的,有人可以点击按钮 6,并且 _numberOfDice 设置为 6。然后我将其转换为字符串并保存该字符串。当我运行 viewDidLoad 时,我会加载数字。 string(_amountString) 是我要传递给 Class2 的变量。我把它设置在 Class1 中,然后我想将它传递给 Class2。

【问题讨论】:

  • 发布Class1 的代码。很可能发生的事情是您在Class1 中有代码在一段时间后设置 myVariable = 6。但是,当您执行Class1 *class = [[Class1 alloc] init]; 时,您会创建一个全新的Class1 副本。这意味着如果您没有在initviewDidLoad 中设置myVariable,那么它还不会被设置。
  • 是的,我确实在 Class1 中设置了 myVariable = 6。基本上它是一个设置视图控制器。您可以单击您希望 myVariable 等于多少。如果您单击 6,它将等于 6。然后我保存金额,现在我尝试将 6(或该人单击的任何数字)传递给 Class2。
  • 您正在 Class2 中创建 Class1 的新对象。这是一个质量很低的问题。
  • @user3754646 查看我对为什么它不起作用的回答。请查看类实例的含义,以了解您的代码为何无法按预期工作。如果这是您第一次使用任何语言进行编程,那么我建议您选择一本编程入门书。

标签: ios objective-c variables


【解决方案1】:

好的,这是您的问题。

当您编辑myVariable in Class1 时,您正在为该特定实例执行此操作。实例是对象的特定副本。您可以拥有一个Class1 实例,也可以拥有100 个Class1 实例。每一个都将是独一无二的。在您的情况下,您现在有 2 个Class1s。您编辑的第一个,它知道myVariable。第二个没有,因为你从来没有点击 loadNumber/saveNumber。

所以你有你原来的Class1,你设置了myVariable = 6。但是,当您执行Class1 *class = [[Class1 alloc] init]; 时,您会创建一个全新的副本。这就像去商店买新的汽水一样。即使您以前购买过这种苏打水,它仍然不同,因为这是全新的。

我看到的另一个问题是,这对于保存数字来说太过分了——您正在创建一个新文件来保存数字,然后每次都读取它。这是非常低效和复杂的。 NSUserDefaults 是一个更好的选择,在这里更有意义。

有很多方法可以解决您的问题。老实说,我会在NSUserDefaults 中保存myVariable。然后在Class2 中,您只需从NSUserDefaults 中读取。另一种解决方案是使myVariable 成为Class1 上的静态变量,或者保存对您编辑的Class1 的引用。但最简单的解决方案是保存到NSUserDefaults 并在Class2 中读取它

【讨论】:

  • 使用 NSUserDefaults 将数据从一个控制器传递到另一个控制器也不是一个好习惯。它应该用于需要在应用程序启动之间持久化的数据,而不是在应用程序的一次运行中。 OP 应该只是将数据从一个控制器传递到下一个控制器,这种方式在 SO 上已经被回答了数千次。
  • @rdelmar 在大多数情况下我同意你的看法,但 OP 说这是一个设置屏幕 + 他的代码是关于保存/加载这个值的。看起来他正在使用它在应用程序启动之间持续存在。我将更新我的答案以指定该建议是由于他的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
相关资源
最近更新 更多