目标c布尔总是没有

时间:2013-08-12 01:19:10

标签: objective-c ipad

好吧,我的错误,我以前认为我的ivar没有正确改变。我错了(并得到了一些downvotes)。对不起,真正的问题是我一直在调用它。我现在发布所有代码,我会让你看看它。

我的第一堂课:

classOne.h:

@interface DetailPageController : UIPageViewController
{

    BOOL isChromeHidden_;

}

- (void)toggleChromeDisplay;


@end

classOne.m:

@interface DetailPageController ()

@end

@implementation DetailPageController

- (void)toggleChromeDisplay
{
    [self toggleChrome:!isChromeHidden_];
}

- (void)toggleChrome:(BOOL)hide
{
    //Find chrome value
    isChromeHidden_ = !isChromeHidden_;
    NSLog(isChromeHidden_ ? @"YES" : @"NO");     

}

@end

根据我收到的评论,我相信这些都不是实际问题,而是在下面。

classTwo.h :(没有声明)

classTwo.m:

@interface classTwo ()


@end

@implementation classTwo

//Touches Control
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    UITouch *touch = [touches anyObject];
    if ([touch view]) {
        if ([touch tapCount] == 2) {
            NSLog(@"double touched");
            [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(toggleChromeDisplay) object:nil];
        }
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    if ([touch view]) {
        if ([touch tapCount] == 1) {
            NSLog(@"single touch");
            [self performSelector:@selector(toggleChromeDisplay) withObject:nil afterDelay:0.5];
        }
    }
}

- (void)toggleChromeDisplay
{

    DetailPageController *pageController = [[DetailPageController alloc] init];
    [pageController toggleChromeDisplay];
}

@end

再次,对于上一篇文章感到抱歉,我原本认为这是方法的一个问题,但实际上就是我调用它的方式。

我被迫做的是在控制器中实现触摸处理触摸的区域,但我有另一种方法的chrome(导航栏和工具栏)。

整体问题 为什么每次我在classTwo中调用我的toggleChromeDisplay方法时,我总是在classOne中从我的ivar获得相同的NO?

我为classTwo.h尝试了什么:

#import "DetailPageController.h"

@interface classTwo : UIViewController
{
    DetailPageController *detailPageController_;
}

@property (nonatomic, assign) DetailPageController *detailPageController;

@end

我修改过的代码:

在我的课堂上:

#import "DetailPageController.h"

@interface PhotoViewController : UIViewController
{
    DetailPageController *detailPageController_;
}



@property (nonatomic, strong) DetailPageController *detailPageController;

@end

classTwo.m:

#import "classTwo.h"

@interface classTwo ()

@end

@implementation classTwo

@synthesize detailPageController = detailPageController_;

//Touches Control
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    UITouch *touch = [touches anyObject];
    if ([touch view]) {
        if ([touch tapCount] == 2) {
            NSLog(@"double touched");
            [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(toggleChromeDisplay) object:nil];
        }
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];

    if ([touch view]) {
        if ([touch tapCount] == 1) {
            NSLog(@"single touch");
            [self performSelector:@selector(toggleChromeDisplay) withObject:nil afterDelay:0];
        }
    }
}

- (void)toggleChromeDisplay
{
    [self.detailPageController toggleChromeDisplay];
}

@end

4 个答案:

答案 0 :(得分:2)

你需要的只是

- (void)toggleChromeDisplay
{
    isChromeHidden_ = !isChromeHidden_;
}

(根据您的编辑)

答案 1 :(得分:2)

classTwo在调用DetailPageViewController之前始终实例化一个完全全新toggleChromeDisplay实例,然后它允许它超出范围并且可能被解除分配。您需要让它在程序中使用实际存活的实例并控制视图层次结构中的视图。

您可以向DetailPageViewController添加classTwo属性,然后您的-[classTwo toggleChromeDisplay]实现如下:

- (void)toggleChromeDisplay
{
    [self.detailPageController toggleChromeDisplay];
}

同样,只需确保为该属性分配实际在屏幕上的视图控制器的实例。 allocinit用于创建全新的对象实例,如果它们已经加载,例如,从故事板中加载,则不会是应用程序中已存在的实例。因此,在您的应用程序中,您可能已经在屏幕上执行DetailPageViewController实例并控制与用户的交互 - 但您的classTwo永远无法发送消息,因为它再次创建完全独立的实例那个班。因此,您需要确定应用程序中屏幕上可见的DetailPageViewController实例化的位置,并确保您的classTwo实例可以获得对它的引用。

原谅我的重复性,但这是我在Stack Overflow上看到的常见错误。只要确保你理解虽然有一个Class的定义,它是定义其实例变量和方法的地方,但是可以有许多从它创建的对象的单独实例(我们经常说它们被实例化或创建,init ed,你会看到很多术语)。这些对象中的每一个对于它们的实例变量(和属性)都可以具有不同的值,并且从内存管理的角度来看它们都有自己不同的生命周期。调用方法allocinit是制作类的新实例的一种非常常见的方法,它具有自己的生命周期和实例变量。

最后,我建议您阅读并遵循Apple的Cocoa style guide,因为您选择的方法和类名称会导致您的开发人员产生混淆。如果您开始申请,您将发现与他人的沟通更顺畅,您的问题更容易理解。

答案 2 :(得分:1)

toggleChrome:设置 isChromeHidden_变量,它不会切换它。要切换你会写:

- (void)toggleChrome
{
    isChromeHidden_ = !isChromeHidden_;

    //Find chrome value
    NSLog(isChromeHidden_ ? @"YES" : @"NO");
}

!isChromeHidden_​​是isChromeHidden _的相反值。

答案 3 :(得分:1)

我将您的确切代码复制到我的项目中,并按预期在YES和NO之间切换。这告诉我你发布的代码实际上是正确的,你要么错误地调用它,要么你也在其他地方设置变量。