好吧,我的错误,我以前认为我的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
答案 0 :(得分:2)
你需要的只是
- (void)toggleChromeDisplay
{
isChromeHidden_ = !isChromeHidden_;
}
(根据您的编辑)
答案 1 :(得分:2)
classTwo
在调用DetailPageViewController
之前始终实例化一个完全全新的toggleChromeDisplay
实例,然后它允许它超出范围并且可能被解除分配。您需要让它在程序中使用实际存活的实例并控制视图层次结构中的视图。
您可以向DetailPageViewController
添加classTwo
属性,然后您的-[classTwo toggleChromeDisplay]
实现如下:
- (void)toggleChromeDisplay
{
[self.detailPageController toggleChromeDisplay];
}
同样,只需确保为该属性分配实际在屏幕上的视图控制器的实例。 alloc
和init
用于创建全新的对象实例,如果它们已经加载,例如,从故事板中加载,则不会是应用程序中已存在的实例。因此,在您的应用程序中,您可能已经在屏幕上执行DetailPageViewController
实例并控制与用户的交互 - 但您的classTwo
永远无法发送消息,因为它再次创建完全独立的实例那个班。因此,您需要确定应用程序中屏幕上可见的DetailPageViewController
实例化的位置,并确保您的classTwo
实例可以获得对它的引用。
原谅我的重复性,但这是我在Stack Overflow上看到的常见错误。只要确保你理解虽然有一个Class的定义,它是定义其实例变量和方法的地方,但是可以有许多从它创建的对象的单独实例(我们经常说它们被实例化或创建,init
ed,你会看到很多术语)。这些对象中的每一个对于它们的实例变量(和属性)都可以具有不同的值,并且从内存管理的角度来看它们都有自己不同的生命周期。调用方法alloc
和init
是制作类的新实例的一种非常常见的方法,它具有自己的生命周期和实例变量。
最后,我建议您阅读并遵循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之间切换。这告诉我你发布的代码实际上是正确的,你要么错误地调用它,要么你也在其他地方设置变量。