传递布尔值

5
我正在开发一款应用程序,遇到了一个问题:无法检索设置在类中的BOOL值。我已经花费了很多时间,并查看了所有相关问题,但仍无法解决。
不幸的是,我得到了一些信息,但并非我需要的内容(我得到的是0,这意味着该值没有正确地被检索出来,应该是1)。
我尝试了以下方法:
  • pass a pointer to my first class and access to my BOOL like this:

    //in some method
    self.pointerFirstClass.myBOOL;
    NSLog(@"%d", firstClass.myBOOL); => This gives 0!
    
通过在我的第二个类中将它(指针)声明为属性(并从我的第一个类导入h文件,在那里我的BOOL也被声明为属性):
    @property FirstClass *pointerFirstClass;

但是我使用这个方法得到的结果是0。
  • The other shot I gave was add my BOOL in the first class and create an instance of the class in my second class

    //in some method
    FirstClass *firstClass = [[FirstClass alloc] init];
    if (firstClass.myBOOL){
          //Do something
    }
    NSLog(@"%d", firstClass.myBOOL); => This gives 0!
    

    But I got 0 too.

由于布尔类型是原始类型,就像在C中一样,我对面向对象编程还很陌生,不知道该如何创建getter方法来获取它的值。
我尝试在我的第一个类中编写了一个名为getBOOLValue的方法,然后在我的第二个类中调用此方法并将其分配给该类中的BOOL。但结果并不理想。
我已经尽力想到了各种方法来解决这个问题,但似乎并不是很难,希望这只是一个简单的错误。
编辑:
以下是一些实际代码。我正在两个文件之间工作,一个是AppDelegate(确实是这个文件),另一个是WelcomeViewController(也就是一个VC)。
AppDelegate.h
    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    {
        BOOL inRegion; //thought of this making my BOOL as a property of AppDelegate
    }
    @property (strong, nonatomic) UIWindow *window;
    @property BOOL inRegion; //Declaring my BOOL here to make it accessible for another class
    - (BOOL)getBOOLValue; //An attempt to pass my BOOL value

AppDelegate.m

    - (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
    {
        if (state == CLRegionStateInside)
        {
            self.inRegion = YES; //Set my BOOL to TRUE
        }
        else if (state == CLRegionStateOutside)
        {
            self.inRegion = NO; //Else set it to False
        }


    - (BOOL)getBOOLValue
    {
        return inRegion; //Tried to create a custome "getter"
    }

WelcomeViewControler.m(我在.h文件中没有作任何更改) 我试过很多方法,现在这是我的代码的最新版本。

    //Simply trying to do a Segue on a condition...
    - (IBAction)onClick:(id)sender {
       AppDelegate *appDelegate = [[AppDelegate alloc] init];

      if (appDelegate.inRegion) {

         [self performSegueWithIdentifier:@"WelcomeToDetection" sender:self];

       }
       else
     {
          //Do Nothing
       }
    }
  • 如上所述,我想获取AppDelegate的BOOL值。

谢谢。


2
布尔型只是1或0,它的默认值为0。你对此有什么问题? - CoolMonster
4
记录BOOL的方便方法 -> NSLog(@"Bool is: %@", myBool ? @"YES" : @"NO"); - Abizern
@Abizern 你的意思是说,如果我在任何地方初始化它,那么我总是得到0吗?我期望从我的第一个类文件中获取BOOL的值。在我的情况下,它应该是1。 - ySiggen
BOOL默认设置为什么意思(如果您没有将其设置为1,则默认情况下将为0)?您是如何从FirstClass转到第二个类的? - rdelmar
2
请注意,如果firstClass为空,则对其上的myBOOL的引用将返回零。(当然,零值也表示“false”值,因此从打印的零值无法得出任何真实证据。) - Hot Licks
显示剩余3条评论
3个回答

4

这段代码没有意义:

self.pointerFirstClass.myBOOL;
NSLog(@"%d", firstClass.myBOOL); => This gives 0!

第一行没有任何作用。您没有将任何内容分配给属性,也没有对值进行任何操作。此外,从您提供的代码中,我们无法看到第二行与第一行有任何关系。请尝试使用以下代码:

self.pointerFirstClass = [[FirstClass alloc] init];
self.pointerFirstClass.myBOOL = YES;
NSLog(@"myBOOL = %d", self.pointerFirstClass.myBOOL);

换言之,你需要确保self.pointerFirstClass指向一个有效的对象。然后你需要确保已经将想要的值分配给了该对象的myBOOL属性。
更新:看起来你正在与错误的对象交互。请看这个:
- (IBAction)onClick:(id)sender {
       AppDelegate *appDelegate = [[AppDelegate alloc] init];

这肯定不是你真正想要的。应用程序对象是一个单一的对象——实际上是真正的单例,这意味着只有一个应用程序对象存在和可能存在。该对象有一个委托对象,而那是您的AppDelegate类的特定实例。然而在这段代码中,您创建了一个新的AppDelegate实例,它与应用程序正在使用的实例不同。对于由应用程序发送的消息所做的任何更改都不会反映在您创建的新对象中。
我认为你想得到的是实际的应用程序委托对象,你可以使用以下方法:
[[UIApplication sharedApplication] delegate];

所以,将您的代码更改为以下内容:
- (IBAction)onClick:(id)sender {
   AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];;

   if (appDelegate.inRegion) {
      [self performSegueWithIdentifier:@"WelcomeToDetection" sender:self];
   }
   // note: you don't need an else clause if it doesn't do anything
}

这样,您将与应用程序使用的同一对象进行交互,该对象是响应于位置管理器调用而设置了inRegion属性的对象。


你的解决方案指向一个有效的对象,但它是否正确呢?我怀疑他已经有了FirstClass的实例,并且他需要获取对它的引用,而不是创建一个新的实例。 - rdelmar
1
@rdelmar 当然,这就是为什么我在我的示例后面解释了重要部分:你需要确保self.pointerFirstClass指向一个有效的对象。 OP没有向我们展示这样的对象存在,所以我不得不创建一个来给出一个可行的示例。然后你需要确保你已经分配了你想要的值... 换句话说,现在我已经创建了一个对象,我将设置它的方式。最后,我展示如何从该对象的属性中获取值。 - Caleb
@Caleb 我编辑了我的问题,我的BOOL值在一个文件中设置,我想在第二个文件中检索它的值。 - ySiggen

2

更新 - 现在我们可以看到你的代码,问题就很明显了,你尝试通过创建一个新的appDelegate来访问它...

- (IBAction)onClick:(id)sender {
       AppDelegate *appDelegate = [[AppDelegate alloc] init];

相反,你应该这样做...
- (IBAction)onClick:(id)sender {
        AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]

不确定您是否发布了实际的代码?但是您给出的第一个示例...

self.pointerFirstClass.myBOOL;
NSLog(@"%d", firstClass.myBOOL); => This gives 0!

第二行不应该是:

NSLog(@"%d", self.pointerFirstClass.myBOOL);

此外,该属性还可以用于将元素的背景图像设置为固定位置。
@property FirstClass *pointerFirstClass;

你设置后它不会保留,需要重新设置。
@property (nonatomic,strong) FirstClass *pointerFirstClass;

In the second example...

FirstClass *firstClass = [[FirstClass alloc] init];
if (firstClass.myBOOL){
      //Do something
}
NSLog(@"%d", firstClass.myBOOL); => This gives 0!

您分配并初始化一个新的FirstClass对象,然后立即检查属性,如果您没有在init中将其设置为YES,则它将为false。
就像我所说的,也许您没有发布您的实际代码?

我可能会发布一些实际的代码。一切都运行良好,除了那个BOOL变量,我希望它在第一个类文件中返回1(这是事实),但在第二个类文件中返回0。 是的,对不起我的第一个NSLog,应该按照你纠正的方式来写。 - ySiggen
2
没有实际的代码,我们无法看到您尝试做什么,这将导致可能对您没有用处的答案。 - Flexicoder
1
@Oinobares 是的,请发表实际的代码。否则你只是在浪费时间。 - Caleb
@Flexicoder,谢谢你的分享,我更新了我的问题,希望现在更清晰了。 - ySiggen
1
@Oinobares - 更新了答案,今后如果您一开始就提供实际代码会更有帮助。 - Flexicoder
明白了,抱歉。 - ySiggen

1
我猜你想将myBOOL初始化为1。 如果是这样,你需要做以下操作
@implement FirstClass
- (id)init
{
    self = [super init];
    if(self) {
        _myBOOL = 1;
    }
    return self;
}
// Other methods
@end

编辑:

评论是你得到0分的原因。

- (IBAction)onClick:(id)sender {
   AppDelegate *appDelegate = [[AppDelegate alloc] init]; // this is the problem.
                                                          // you create a new appdelegate,
                                                          // and never call locationManager:didDetermineState:forRegion:

  if (appDelegate.inRegion) {

     [self performSegueWithIdentifier:@"WelcomeToDetection" sender:self];

   }
   else
 {
      //Do Nothing
   }
}

将您的代码按照以下方式重写:

- (IBAction)onClick:(id)sender {
   AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

  if (appDelegate.inRegion) {
     [self performSegueWithIdentifier:@"WelcomeToDetection" sender:self];

   }
   else
 {
      //Do Nothing
   }
}

我编辑了我的问题,以便更容易理解。 - ySiggen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接