¿Por qué tengo que agregar el identificador IBOutlet a mi delegado cuando dentro de apple sdk no hay ningún IBOutlets?

He creado la siguiente vista personalizada:

@interface TNGalleryView : UIView @property (assign, nonatomic) id <TNGalleryViewDelegate> delegate; @property (assign, nonatomic) id <TNGalleryViewDataSource> dataSource; @end 

Puedo asignar delegado de él en código, pero cuando quiero asignar delegado en IB, no puedo. Tengo que cambiar mi código para:

 @interface TNGalleryView : UIView @property (assign, nonatomic) IBOutlet id <TNGalleryViewDelegate> delegate; @property (assign, nonatomic) IBOutlet id <TNGalleryViewDataSource> dataSource; @end 

y luego puedo asignar delegate y dataSource en IB.

¿Por qué si quisiera asignar delegate y dataSource en IB tengo que agregar el identificador IBOutlet, pero dentro de apple sdk no hay ningún IBOutlet? Por ejemplo, esta parte de la statement de 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; 

No hay ningún IBOutlet, sin embargo, puedo asignar dataSource y delegarle en IB.

¡Una buena pregunta!

Abre tu storyboard / xib con el editor de text, busca "TNGalleryView", encontrarás la label xml como esta:

 <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ke7-rk-01e" customClass="TNGalleryView"> <rect key="frame" x="86" y="309" width="160" height="252"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> </view> 

Tenga en count que: TNGalleryView se envolvió en una label de "vista" con una propiedad: customClass = "TNGalleryView"

Ahora agregue UICollectionView en storyboard / xib, guarde y reopne storyboard / xib con editor de text, busque "collectionView", encontrará la label xml como esta:

 <collectionView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" minimumZoomScale="0.0" maximumZoomScale="0.0" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="ouM-xa-T6a"> <rect key="frame" x="93" y="72" width="160" height="252"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="Cv0-O7-zGY"> <size key="itemSize" width="50" height="50"/> <size key="headerReferenceSize" width="0.0" height="0.0"/> <size key="footerReferenceSize" width="0.0" height="0.0"/> <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/> </collectionViewFlowLayout> </collectionView> 

Ahora, encontrará los diferentes, collectionView está envuelto en una label "collectionView"

Supongo que esa fue la razón por la que no se puede asignar delegado personalizado en IB sin establecer que el delegado personalizado sea un IBOutlet.

ACTUALIZAR

No hay reputación suficiente para comentar la respuesta de otra persona. Así que digo algo aquí: lea la pregunta claramente y haga una testing en xcode, se dará count de qué es la pregunta de Sergey Demchenko:

Primero, si TNGalleryViewDelegate se declara de esta manera:

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

La captura de pantalla de xcode: introduzca la descripción de la imagen aquí

Ahora, si TNGalleryViewDelegate se declara de esta manera:

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

La captura de pantalla de xcode: introduzca la descripción de la imagen aquí

El decorador de IBOutlet debe permitir que el constructor de la Interfaz sepa que puede conectarse a la propiedad. Es solo una sugerencia que no produce ningún código.

Solo las properties que se conectarán a los elementos de la Interfaz necesitarán IBOutlet. Estos son los objects a los que se conecta arrastrando entre el object GUI y el código. Es una sugerencia para el generador de la Interfaz a la que se puede conectar una propiedad en el código.

En realidad, esta es una muy buena pregunta. Como Xcode y IB son opacos, lo que significa que nadie más que Apple tiene la fuente, todo lo que podemos hacer es adivinar. Mi conjetura es que dada la cantidad relativamente pequeña de subclasss UIView que toman delegates y fonts de datos, Apple acaba de codificar el conocimiento en IB.

Una razón para esto sería que IB no quiere analizar cada una de esas subclasss UIView cada vez que se cambia a una vista Storyboard o NIB.

En cualquier caso, todo lo que podemos hacer es especular. No es tan difícil agregar la palabra key IBOutlet a su propio file.

Las salidas no necesariamente están expuestas en el file de encabezado. Puede hacer lo mismo en sus propias classs al definir los puntos de venta dentro de su file .m.