6

カスタム UIView クラス GestureView があります。このクラスの前方宣言があり、それは以下のデリゲートです。GestureView.h を .m ファイルにインポートしました。これは正常に動作しますが、iOS は「GestureViewDelegate のプロトコル定義が見つかりません」という警告メッセージを表示します。前方宣言を削除すると、エラーと同じ警告メッセージが表示されます。通常は.mファイルにインポートするため、ContainerViewController.hからGestureView.hをインポートしたくありません。誰かが次のクラス構造の何が問題なのか説明してもらえますか?

ContainerViewController.h

#import <UIKit/UIKit.h>

@class DividerView;
@class GestureView;
@protocol GestureViewDelegate;

@interface ContainerViewController : UIViewController<GestureViewDelegate>
   @property (strong, nonatomic) IBOutlet GestureView *topContentView;
@end

GestureView.h

#import <UIKit/UIKit.h>

@protocol GestureViewDelegate;

@interface GestureView : UIView
    - (void)initialiseGestures:(id)delegate;
@end

@protocol GestureViewDelegate <NSObject>
@required
- (void)GestureView:(GestureView*)view handleSignleTap:(UITapGestureRecognizer*)recognizer;
@end
4

2 に答える 2

22

ヘッダーファイルへのインポートを避けようとしているのが好きです。非常に良い習慣です。ただし、バグを修正するには、コードをさらに改善することができます。私の意見では、ContainerViewControllerクラスがプロトコルをサポートしていることを外部から宣言する必要はないGestureViewDelegateので、これを実装ファイルに移動する必要があります。そのようです:

GestureView.h

#import <UIKit/UIKit.h>


@protocol GestureViewDelegate;

@interface GestureView : UIView

- (void)initialiseGestures:(id <GestureViewDelegate>)delegate;

@end


@protocol GestureViewDelegate <NSObject>
@required

- (void)gestureView:(GestureView *)view handleSingleTap:(UITapGestureRecognizer *)recognizer;

@end

ContainerViewController.h

#import <UIKit/UIKit.h>


@class GestureView;

@interface CollectionViewController : UIViewController

// this property is declared as readonly because external classes don't need to modify the value (I guessed seen as it was an IBOutlet)
@property (strong, nonatomic, readonly) GestureView *topContentView;

@end

ContainerViewController.m

#import "ContainerViewController.h"
#import "GestureView.h"


// this private interface declares that GestureViewDelegate is supported
@interface CollectionViewController () <GestureViewDelegate>

// the view is redeclared in the implementation file as readwrite and IBOutlet
@property (strong, nonatomic) IBOutlet GestureView *topContentView;

@end


@implementation ContainerViewController

// your implementation code goes here

@end
于 2012-10-15T20:48:40.537 に答える
0

この方法を試してみて、うまくいくかどうか返信してください。

GestureView.h

#import <UIKit/UIKit.h>

@protocol GestureViewDelegate <NSObject>
@required
- (void)GestureView:(GestureView*)view handleSignleTap:(UITapGestureRecognizer*)recognizer;
@end

@interface GestureView : UIView
    - (void)initialiseGestures:(id)delegate;
@end

ContainerView.h

#import <UIKit/UIKit.h>

@class DividerView;
@class GestureView;
/*@protocol GestureViewDelegate;*/ //NO NEED TO WRITE THIS

@interface ContainerViewController : UIViewController<GestureViewDelegate>
   @property (strong, nonatomic) IBOutlet GestureView *topContentView;
@end
于 2012-10-15T12:22:43.120 に答える