7

次のカスタム ビューを作成しました。

@interface TNGalleryView : UIView

@property (assign, nonatomic) id <TNGalleryViewDelegate> delegate;
@property (assign, nonatomic) id <TNGalleryViewDataSource> dataSource;

@end

コードでデリゲートを割り当てることはできますが、IB でデリゲートを割り当てたい場合はできません。コードを次のように変更する必要があります。

@interface TNGalleryView : UIView

@property (assign, nonatomic) IBOutlet id <TNGalleryViewDelegate> delegate;
@property (assign, nonatomic) IBOutlet id <TNGalleryViewDataSource> dataSource;

@end

そして、IB でデリゲートとデータソースを割り当てることができます。

IB でデリゲートとデータソースを割り当てたい場合、IBOutlet 識別子を追加する必要があるのに、Apple SDK 内に IBOutlets がないのはなぜですか? たとえば、UICollectionView 宣言のこの部分:

NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionView : UIScrollView

- (id)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout; // the designated initializer

@property (nonatomic, retain) UICollectionViewLayout *collectionViewLayout;
@property (nonatomic, assign) id <UICollectionViewDelegate> delegate;
@property (nonatomic, assign) id <UICollectionViewDataSource> dataSource;

IBOutlet はありませんが、dataSource を割り当てて IB に委譲できます。

4

4 に答える 4

1

実際、これはかなり良い質問です。Xcode と IB は不透明であるため、Apple 以外にソースがないことを意味するため、推測するしかありません。私の推測では、デリゲートとデータ ソースを受け取る UIView サブクラスの数が比較的少ないため、Apple はその知識を IB にハードコーディングしただけです。

この理由の 1 つは、ストーリーボードまたは NIB ビューに切り替えるたびに、IB がこれらの UIView サブクラスのすべてを解析したくないためです。

いずれにせよ、推測するしかありません。自分のファイルに IBOutlet キーワードを追加するのはそれほど難しくありません。

于 2013-11-14T13:59:15.170 に答える
0

アウトレットは、必ずしもヘッダー ファイルで公開されるとは限りません。.m ファイル内でアウトレットを定義することにより、独自のクラスで同じことを行うことができます。

于 2013-11-14T13:53:56.963 に答える