-1

わかりました、私の間違いです。以前は、ivar が正しく変更されていないと信じていました。私は間違っていました(そして、それに対していくつかの反対票がありました)。申し訳ありませんが、本当の問題は、私が間違って呼んでいることです。私は今、すべてのコードを投稿しています。それを見てみましょう。

私の最初のクラス:

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

繰り返しますが、以前の投稿で申し訳ありません。メソッドの問題だと思っていましたが、実際には私が呼び出している方法です。

私がしなければならなかったのは、タッチされた領域を処理するコントローラーにタッチを実装することですが、別の場所にクロム (ナビゲーション バーとツールバー) のメソッドがあります。

全体的な質問 classTwo で toggleChromeDisplay メソッドを呼び出すたびに、classOne の ivar から常に同じ NO を取得するのはなぜですか?

classTwo.h で試したこと:

#import "DetailPageController.h"

@interface classTwo : UIViewController
{
    DetailPageController *detailPageController_;
}

@property (nonatomic, assign) DetailPageController *detailPageController;

@end

私の変更されたコード:

私のclassTwo.hでは:

#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

4 に答える 4

2

classTwoを呼び出す前に常に の完全に新しいインスタンスをインスタンス化し、それをスコープ外に出すことを許可し、おそらく割り当てが解除されます。プログラムで実際に生きていて、ビュー階層のビューを制御するインスタンスを使用する必要があります。DetailPageViewControllertoggleChromeDisplay

DetailPageViewControllerプロパティを追加するclassTwoと、-[classTwo toggleChromeDisplay]実装は次のようになります。

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

繰り返しますが、実際に画面上にあるView Controllerのインスタンスをそのプロパティに割り当てるようにしてください。allocオブジェクトの新しいインスタンスを作成するためにinit使用されます。たとえば、ストーリーボードからロードされた場合、アプリケーションに既に存在するインスタンスではありません。したがって、アプリケーションにはDetailPageViewController、画面上で処理を行い、ユーザーとの対話を制御するインスタンスが既にある可能性がありますclassTwoが、そのクラスの完全に別のインスタンスを作成しているため、メッセージを送信することはできません。そのため、アプリケーションのどこでDetailPageViewController画面に表示されているものがインスタンス化されているかを判断し、その時点でclassTwoインスタンスがそれへの参照を取得できるようにする必要があります。

繰り返しが多いことをお許しください。ただし、これはスタック オーバーフローでよく見られる間違いです。クラスのインスタンス変数とメソッドが定義されているクラスの定義は 1 つですが、そこから作成されるオブジェクトの個別のインスタンスが多数存在する可能性があることを理解していることを確認してください (インスタンス化されている、または作成されているとよく言います)。 、inited、いくつかの用語が表示されます)。これらのオブジェクトはそれぞれ、インスタンス変数 (およびプロパティ) に異なる値を持つことができ、メモリ管理の観点からは、すべて独自の固有の寿命があります。メソッドのペアを呼び出して、クラスの新しいインスタンスを作成する非常に一般的な方法allocinit1 つは、独自の有効期間とインスタンス変数を持ちます。

最後に、Apple のCocoa スタイル ガイドを読んでそれに従うことをお勧めします。メソッドとクラスの名前の選択が他の開発者の間で混乱を引き起こしているからです。それを適用し始めると、他の人とのコミュニケーションがスムーズになり、問題が理解しやすくなります。

于 2013-08-12T02:49:23.727 に答える
2

あなたに必要なのは

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

(あなたの編集に基づく)

于 2013-08-12T01:53:57.970 に答える
1

あなたの正確なコードをプロジェクトにコピーしましたが、期待どおりにYESとNOの間で切り替わります. これは、投稿したコードが実際には正しく、それを間違って呼び出しているか、変数を別の場所にも設定していることを示しています。

于 2013-08-12T02:04:19.093 に答える