【问题标题】:BOOL changes from YES to NO between ViewControllers by itself?BOOL 在 ViewControllers 之间从 YES 变为 NO?
【发布时间】:2012-05-25 01:56:04
【问题描述】:

我只是不明白.. 这种情况到处发生,但我找不到任何理由或理由。 我已经搜索了一段时间没有运气..也许你们可以告诉我我做错了什么?

我正在 ViewController_B 中的 ViewController_A 中设置一个 BOOL。 单步执行代码,我看到 BOOL 变为 YES,但是当我被发送回 VC_A 时,它又变为 NO

更新:这一切都在主线程上。

这是我的代码。

ViewController_A.h

BOOL shouldLogin;

@property(nonatomic,assign)BOOL shouldLogin;

ViewController_A.m

@synthesize shouldLogin;


//in viewWillAppear of ViewController_A
if (shouldLogin == YES) {
//do something - im trying to get in here but I cant because the BOOL is NO when I come back to this view

}

这是我在 ViewController_B 中设置 BOOL 的方式

    ViewController_A * vc = [[ViewController_A alloc]init];
    vc.shouldLogin = YES; 
   //stepping through the code and looking at the value, shouldLogin shows YES 
    [self dismissModalViewControllerAnimated:YES]; // this drops down VC_B which will show VC_A

//now VC_A just came into view and the BOOL is now NO which makes the compiler skip over my IF statement

更新:删除了我的发布调用,但仍然是同样的问题。

【问题讨论】:

  • 嗯..什么?我错过了什么吗?你分配vc,然后将shouldLogin 设置为YES,然后立即通过发送release 消息释放它...
  • 抱歉,我应该提一下,我尝试了使用该版本和不使用该版本。我在发布这个问题时把它留在了那里,但它没有任何区别..它仍然无法工作。
  • 不管有没有release,它都不起作用,因为您在ViewController_B 中创建的ViewController_A 与已经实例化的ViewController_A 不同。

标签: iphone ios ios5 xcode4


【解决方案1】:

看起来您在ViewController_B 中的代码正在创建一个全新的ViewController_A,设置shouldLogin 标志,然后立即销毁ViewController_A 的实例化。我怀疑这是你打算做的。

我假设您想在先前实例化的ViewController_A 上设置shouldLogin 标志。您需要将指向ViewController_A 的指针传递给您的ViewController_B,然后使用该指针在ViewController_B 中设置标志。您可以使用ViewController_B 上的自定义init 方法来执行此操作,该方法接受指向ViewController_A 的指针并将其存储以供ViewController_B 使用。

或者,您可以只在ViewController_B 上创建一个属性,该属性可以存储指向ViewController_A 的指针,并在创建ViewController_B 后获取ViewController_A 来设置此属性。比如:

@interface ViewController_B : UIViewController

@property (nonatomic,retain) ViewController_A *originalViewController;

@end

@implementation ViewController_B

@synthesize originalViewController;

- (void)someMethod {
    originalViewController.shouldLogin = YES; 
    [self dismissModalViewControllerAnimated:YES];
}

@end

@implementation ViewController_A 

-(void)someOtherMethod {
     ViewController_B *vcB = [[ViewControllerB alloc] init];
     vcB.originalViewController = self;

     // do something with vcB
}

@end

请原谅任何错别字/错误,我实际上并没有尝试过运行它。

【讨论】:

  • 感谢大家帮助我理解这一点 - 我在这里和那里遇到了它,最后只是将 BOOL 添加到 AppDelegate。很高兴我花时间了解那里发生的事情。谢谢你的解释!
【解决方案2】:

我假设您的视图控制器 A 在您推送视图控制器 B 之前已经存在。在这种情况下,您需要引用回原始视图控制器,而不仅仅是创建一个新的。您没有在此代码中的任何地方触摸原始视图控制器,因此它不会改变是完全合理的。

【讨论】:

    【解决方案3】:

    ViewController_A 是一个类,而不是一个对象。 shouldLogin 只能由 ViewController_A 类的对象访问。

    您之前显示的 ViewController_A 的对象(或实例)与您的 ViewController_B 代码中的实例不同。您显示的代码创建了一个全新的 ViewController_A 对象,将该对象的布尔值设置为 YES,然后立即销毁该对象。在您展示 ViewController_B 实例之前,它从未更改过您拥有的 ViewController_A 实例中的任何内容,因此当您返回显示原始 ViewController_A 时,它与原样完全一样——将 shouldLogin 设置为 NO。

    由于 shouldLogin 似乎是多个视图控制器需要访问的变量,因此我会将它完全设置在另一个类中(两个视图控制器都可以访问)。对于诸如此类的变量,我倾向于创建一个 Singleton 类并在需要的区域周围共享对该对象的访问。当然,还有其他方法可以做到这一点,但我发现这是最简单的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多