I am working on an app and I got stuck at the point where I can't seem to retrieve the value of a BOOL set in a class. I spent too much time already on it, been through all the questions I found that seem to cover the matter.

The bad thing here is that I get something, but not what I need (I get a 0, which means, I guess, that the value wasn't retrieved correctly as it should be 1).

The things I tried are :

  • 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!
    

by declaring it (talking of the pointer) as a property in my second class (and importing the h. file from my first class, where my BOOL is declared as property too):

    @property FirstClass *pointerFirstClass;

But I got 0 using this.

  • 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.

As Booleans are primitive types, like in C, I get a bit confused since I am new to object-oriented programming, I don't know how I could like create a getter for this, for example.

I also tried to do a - (BOOL)getBOOLValue method in my first class, and call this method in my second class and assign it to a BOOL in that second class. But the result wasn't better.

  • Am I missing something?

  • Is there a way to get my value that I didn't think of or didn't know about yet?

I am running low on thoughts on how to get around this, it shouldn't be that hard IMO so I hope it is something simple that I just left aside.

EDIT :

Some actual code. I am working between 2 files called AppDelegate (yes, the actual one) and WelcomeViewController (so a 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 (I changed nothing in the .h file) I said I tried many things, right now, this is the last version of my code.

    //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
       }
    }
  • As said, I want to retrieve the BOOL value of the AppDelegate.

Thank you.

有帮助吗?

解决方案

This code doesn't make sense:

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

The first line doesn't do anything. You're not assigning anything to the property, and you're not doing anything with the value. Furthermore, the second line doesn't relate to the first line in any way that we can see from the code you've provided. Try this instead:

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

In other words, you need to be sure that self.pointerFirstClass points to a valid object. And then you need to make sure that you've assigned the value you want to the myBOOL property of that object.

Update: This looks like a case where you're talking to the wrong object. Look at this:

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

This is surely not what you really want. The application object is a single object -- a real singleton, in fact, meaning that there is and can be only one application object. That object has a delegate object, and that's a specific instance of your AppDelegate class. In this code, though, you're creating a new instance of AppDelegate, one that's different from the one that the application is using. Any changes that are made to the actual application delegate in response to messages from the application will not be reflected in the new object that you've created.

What I think you want is to get the actual application delegate object, and you can do that using:

[[UIApplication sharedApplication] delegate];

So, change your code to look like this:

- (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
}

That way, you'll be talking to the same object that the app uses, which is the one that has the inRegion property set in response to the location manager call.

其他提示

UPDATE - Now we can see your code the problem is obvious, you are trying to access the appDelegate by creating a new one...

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

Instead you should be doing this....

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

--

Not sure if you are posting your actual code? but the first example you give...

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

Shouldn't the second line be

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

Also this property...

@property FirstClass *pointerFirstClass;

Won't retain it once you've set it, it needs to be

@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!

You allocate and initialise a new FirstClass object and then check the property straight away, if you are not setting this to YES in the init then it will be false

Like I say, maybe you're not posting your actual code?

I guess what you want is initializing myBOOL to 1. If so, you need do something as following

@implement FirstClass
- (id)init
{
    self = [super init];
    if(self) {
        _myBOOL = 1;
    }
    return self;
}
// Other methods
@end

EDIT:

The comments is why you get 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
   }
}

rewrite your code as following:

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

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

   }
   else
 {
      //Do Nothing
   }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top