您的混淆点是在代码中创建 UI 对象与使用界面生成器/情节提要以图形方式创建它们之间。
一条线索是您使用了预处理器提示“IBOutlet”。IB 用于 Interface Builder == 图形创建(使用故事板或 xib 文件)。
如果在情节提要中创建...
IBOutlet 的全部目的是为您提供故事板场景中可以在代码中使用的项目的引用。
你不需要这样做:
[self.view addSubview : view];
因为它已经创建并添加到您的故事板中。确保它在视图层次结构中的位置与您期望的一样。
如果在代码中创建...
在 @interface 中声明一个属性
@property (nonatomic, strong) UIView *main;
(不需要,IBOutlet
因为您没有在情节提要中将其链接起来。声明为“强”而不是“弱”,以防您不立即将其分配给视图层次结构)。
在添加此行之前
[self.view addSubview : view];
您需要考虑:您是否添加了故事板/xib 中不存在的新视图?如果是这样,则在创建之前无法添加它。(在情节提要中添加 IS 视图没有意义,因为它已经存在于情节提要场景中)。
因此 - 正如您似乎在代码中执行此操作一样 - 您需要在添加视图之前创建视图。
UIView* myView = [[UIView alloc] init];
设置它的 frame 属性,以便我们知道当您将它添加到视图层次结构时它会出现在哪里
myView.frame = CGRectMake (CGFloat x, CGFloat y, CGFloat width, CGFloat height);
将新创建的视图分配给属性
self.main = myView;
将其添加到您的视图层次结构中
[self.view addSubview : myView];
现在您可以使用 self.main 在代码中引用它。这就像您将它添加到 IB/storyboard 中并且 CRTL 将参考链接拖到您的 IBOutlet 中一样。
如果您在代码中创建视图并立即将其添加到视图层次结构中,则声明属性的替代方法是在视图上设置(数字)标记属性,然后您可以使用它的超级视图viewWithTag:
方法来引用视图
您不能做的一件事是在代码中创建视图,然后使用情节提要对其进行操作。
我希望这一切都是有用的,我担心我可能会进一步混淆你!