1

2 つのプロジェクトを含むワークスペースがあります。最初のプロジェクトは、本質的にはテストと開発のプロジェクトであり、実際にすべてを結びつけることを心配する前に、物事を機能させました。2 番目のプロジェクトでは、個別に開発したすべてのビュー コントローラーをストーリーボードにまとめます。

ビュー コントローラーの 1 つで、読みやすくするために適切にフォーマットされたかなりの数の UIView アニメーション呼び出しを含むスワイプ ジェスチャが多数あるため、多くのスペースを占有します。私はそれらをカテゴリから除外することにしました。

問題は、コンパイラがメイン ヘッダー ファイル内のインスタンス変数宣言を認識していないことです。

私が髪を引っ張っているのは、最初のプロジェクトでこれを行い、すべて正常に機能したことです。そのため、2 番目のプロジェクトの内容を最初のプロジェクトと注意深く比較していますが、違いはありません。

ここに、私が物事を定義する方法/場所を示すのに役立ついくつかのファイル スニペットと、それらにアクセスしようとしているカテゴリ ファイル内のコード スニペットがあります。

GSBViewController.h

@interface GSBViewController : UIViewController

@property (strong, nonatomic) IBOutlet UISegmentedControl *roundPicker;
@property (strong, nonatomic) IBOutlet UIView *roundsSectionView;

GSBViewController.m

#import "GSBViewController+Swipe.h"

@interface GSBGameBuilderViewController ()
{
    UIBarButtonItem *rightGatherBarButton;

    NSInteger previousRound;
}
@end

@implementation GSBViewController
@synthesize roundPicker;
@synthesize roundsSectionView;

GSBViewController+Swipe.h

#import "GSBViewController.h"

@interface GSBViewController (Swipe)

- (void)establishSwipeGestures;

@end

GSBViewController+Swipe.m

#import "GSBViewController+Swipe.h"

@implementation GSBViewController (Swipe)

- (void)establishSwipeGestures
{
    UISwipeGestureRecognizer *swipeLeft = 
       [[UISwipeGestureRecognizer alloc] 
           initWithTarget:self 
                   action:@selector(roundsSectionLeft:)];

    [swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft];
    [swipeLeft setNumberOfTouchesRequired:1];
    [roundsSectionView addGestureRecognizer:swipeLeft];
// bunch-o-code snipped -- for the time being it's actually all commented out
// as a test and because the LLVM compiler was giving up after too many errors
// and I wanted to see if there was more it would like to tell me about this first --
// and very representative -- problem.
}
@end

コンパイラからの苦情は、「宣言されていない識別子 'roundsSectionView' の使用」です。

ジェスチャ認識エンジンを追加しているコード行で roundsSectionView の使用をオプションクリックすると、ポップアップは GSBViewController.h で宣言されているようにそれを正しく説明します

だから私は困惑しています。

含まれているファイルが何であるかを確認するために、Xcode (この投稿の時点で 4.3.2 :-) でできることはありますか? または、カテゴリを拡張しているクラスに結び付けるために必要なファイルベース以外のものはありますか? そのようなものが以前に必要だったのを覚えていません。実際、このカテゴリのファイルを生成する方法は、Xcode の File -> New File... Objective-C カテゴリ テンプレートを使用することでした。次に、古い ...+Swipe.h および ...+Swipe.m ファイルの内容をコピーして、新しいプロジェクトのそれぞれのファイルに貼り付けました。

4

2 に答える 2

2

合成された ivar は非公開です。@implementationコンパイラは、それが作成されたブロック内を除いて、どこにでもアクセスすることを許可しません。カテゴリもサブクラスも ivar に直接アクセスできません。プロパティを使用する必要があります: [self roundsSectionView]

以前の Clangs が合成された ivar をプライベートにしなかった可能性がわずかにあります。それか、以前のプロジェクトでまったく同じことをしていなかったかのどちらかです。

于 2012-05-29T06:53:41.757 に答える
1

@ジャック・クストーの言うことは正しいです。

プロパティを定義したばかりでバッキング ivar がないため、カテゴリはそれにアクセスできません。使用self.roundsSectionViewすると、プロパティ用に生成された getter メソッドが使用されるため、機能します。

または、インターフェースでバッキング変数を定義することもできます

@interface GSBViewController : UIViewController
{
    UIBarButtonItem *roundsSectionView;
}

この場合、カテゴリは変数にアクセスできます。しかし、他のクラスではありません。

于 2012-05-29T07:05:44.060 に答える