传递BOOL值

时间:2014-03-21 14:47:49

标签: ios objective-c boolean getter

我正在开发一个应用程序而且我遇到了无法检索类中BOOL集值的问题。 我花了太多时间在上面,经历了我发现的所有问题似乎都涉及到这个问题。

这里的坏处是我得到的东西,但不是我需要的东西(我得到一个0,这意味着,我猜,这个值没有被正确检索,因为它应该是1)。

我尝试过的事情是:

  • 将指针传递给我的第一个类并访问我的BOOL,如下所示:

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

通过在我的第二个类中声明它(指向指针)作为属性(并从我的第一个类导入h。文件,其中我的BOOL也被声明为属性):

    @property FirstClass *pointerFirstClass;

但我使用它得到0。

  • 我给的另一个镜头是在第一个类中添加我的BOOL并在我的第二个类中创建一个类的实例

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

    但我也是0。

由于Booleans是原始类型,就像在C中一样,因为我是面向对象编程的新手,所以我有点困惑,例如,我不知道如何为此创建一个getter。

我还尝试在我的第一个类中执行 - (BOOL)getBOOLValue方法,并在我的第二个类中调用此方法并将其分配给第二个类中的BOOL。 但结果并不好。

  • 我错过了什么吗?

  • 有没有办法获得我没想到或不知道的价值?

关于如何解决这个问题的想法很少,它应该不是那么难的IMO所以我希望这是一个简单的事情,我只是把它放在一边。

编辑:

一些实际的代码。我正在两个文件之间工作,名为 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值。

谢谢。

3 个答案:

答案 0 :(得分: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属性的对象。

答案 1 :(得分: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;

在第二个例子中......

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

您分配并初始化新的FirstClass对象,然后立即检查该属性,如果您未将其设置为YES中的init,那么它将为false

就像我说的,也许你没有发布你的实际代码?

答案 2 :(得分: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
   }
}