gpt4 book ai didi

ios - 当 apple sdk 中没有任何 IBOutlets 时,为什么我必须向我的委托(delegate)添加 IBOutlet 标识符?

转载 作者:可可西里 更新时间:2023-11-01 03:31:45 29 4
gpt4 key购买 nike

我创建了以下自定义 View :

@interface TNGalleryView : UIView

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

@end

我可以在代码中分配它的委托(delegate),但是当我想在 IB 中分配委托(delegate)时,我不能。我必须将我的代码更改为:

@interface TNGalleryView : UIView

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

@end

然后我可以在 IB 中分配委托(delegate)和数据源。

为什么如果我想在 IB 中分配委托(delegate)和数据源,我必须添加 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,但是我可以在 IB 中分配数据源并委托(delegate)给它。

最佳答案

很好的问题!

用文本编辑器打开你的 Storyboard/xib,搜索“TNGalleryView”,你会找到这样的xml标签:

<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>

请注意:TNGalleryView 被包裹在一个“ View ”标签中,其属性为:customClass="TNGalleryView"

现在在storyboard/xib中添加一个UICollectionView,保存并用文本编辑器重新打开storyboard/xib,搜索“collectionView”,你会找到这样的xml标签:

<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>

现在,你会发现不同的是,collectionView 被包裹在一个“collectionView”标签中

我想这就是为什么如果不将自定义委托(delegate)设置为 IBOutlet 就无法在 IB 中分配自定义委托(delegate)的原因。

更新

没有足够的声誉来评论其他人的答案。所以我在这里说点什么:清楚地阅读问题,并在 xcode 中进行测试,你会意识到 Sergey Demchenko 的问题是什么:

首先,如果 TNGalleryViewDelegate 是这样声明的:

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

xcode 屏幕截图: enter image description here

现在如果以这种方式声明 TNGalleryViewDelegate:

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

xcode 屏幕截图: enter image description here

关于ios - 当 apple sdk 中没有任何 IBOutlets 时,为什么我必须向我的委托(delegate)添加 IBOutlet 标识符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19979169/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com