传递 BOOL 值

Posted

技术标签:

【中文标题】传递 BOOL 值【英文标题】:Pass BOOL value 【发布时间】:2014-04-29 00:15:11 【问题描述】:

我正在开发一个应用程序,但我陷入了无法检索类中设置的 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。

由于布尔值是原始类型,就像在 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 值。

谢谢。

【问题讨论】:

bool 只是 1 或 0。默认情况下它的 0 是你的问题。 您是否在任何地方初始化myBOOL 的值?你期望得到什么? 记录 BOOL 的便捷方式 -> NSLog(@"Bool is: %@", myBool ? @"YES" : @"NO"); 将您的值存储在单例中,然后从您可能需要的任何地方访问它;) 请记住,如果 firstClass 为 nil,则对 myBOOL 的引用将返回零。 (当然,零值也表示“假”值,因此从打印的零值中没有一种或另一种方式的真实证据。 【参考方案1】:

这段代码没有意义:

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 是的,当然,这就是为什么我在示例后面的段落中解释了重要部分:您需要确保self.pointerFirstClass 指向一个有效对象。 OP 没有向我们展示这样的对象存在,所以我必须创建一个来给出一个可行的例子。 然后你需要确保你已经分配了你想要的值...... IOW,现在我已经创建了一个对象,我将按照我想要的方式设置它.最后,我将展示如何从该对象的属性中获取值。 @Caleb 我编辑了我的问题,我的 BOOL 设置在一个文件中,我想在第二个文件中检索它的值。【参考方案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 对象,然后立即检查该属性,如果您没有在init 中将其设置为YES,那么它将是错误的

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

【讨论】:

我可能会发布一些实际代码。一切运行良好,期望我希望在 1 处看到的 BOOL(在我的第一个类文件中就是这种情况)在我的第二个类文件中返回 0。是的,很抱歉第一个 NSLog,它应该是你纠正我的。 没有实际代码,我们看不到您正在尝试做的事情的真实情况,只会导致可能对您没有用的答案 @Oinobares 是的,发布实际代码。否则你只是在浪费时间。 @Flexicoder 感谢您的分享,我更新了我的问题。 Gopefully 现在更清楚了。 @Oinobares - 更新了答案,将来如果您从一开始就使用实际代码,这将非常有帮助。【参考方案3】:

我猜你想要的是将 myBOOL 初始化为 1。 如果是这样,您需要执行以下操作

@implement FirstClass
- (id)init

    self = [super init];
    if(self) 
        _myBOOL = 1;
    
    return self;

// Other methods
@end

编辑:

cmets 是你得到 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
   

【讨论】:

我编辑了我的问题以便于理解。

以上是关于传递 BOOL 值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective-C 中将 BOOL 变量作为参数传递?

方法 BOOL 从内部块返回

如何最好地将 VARIANT_BOOL 转换为 C++ bool?

上手并过渡到PHP7——必须传递int, string, bool参数?没问题

将 BOOL 传递给 makeObjectsPerformSelector:withObject:

将 numpy 指针 (dtype=np.bool) 传递给 C++