当我将XIV拖放到Xcode中的故事板时,UIView对象在哪里被实例化?当我从ViewController的类中的故事板创建一个UIView对象的插座时,我到底在做什么?创建另一个UIView实例,它也指向故事板中的对象"?因为如果我从插座更改属性,我也会更改故事板中对象的相同属性。
答案 0 :(得分:0)
好的,首先你真的需要阅读OOP指南书(特别是你想要在objective-c中编程的Objective-c)。我会去苹果开发者库开始理解iOS开发中的基本概念。
对于您的问题,UIView
的实例可以通过两种方式实例化:
1)编写[[UIView alloc] init]
时的代码(您也可以使用frame
初始化)
2)当你将UIView
拖放到ViewController
时,通过IB(StoryBoard),这个UIView将在加载ViewController
时实例化。
当您从IBOutlet
(或任何其他对象)创建UIView
时,您基本上会创建一个指针,指向您拖放到UIVIewController
的对象。如果更改IBOutlet
的任何属性,则会更改IB中该对象的属性。通过创建IBOutlet
,您根本不初始化任何对象(您放置该对象的ViewController
负责此操作),您只需为该对象创建一个pointe。 / p>
答案 1 :(得分:0)
故事板只是xml文件的视觉外观。在编译期间,故事板将被编译为.xib文件,并且在运行时代码将被执行以创建例如.xib文件。 UIButton实例并将其分配给IBOutlet属性。
当你在视图控制器中创建一个插座时(你的意思是cmd-将它拖放到vc的界面中,不是吗?),你没有实例化一个对象,这将会发生在运行时。它只是一种特殊的属性,它将被创建并连接到Interface Builder中的可见元素。特别之处在于它被归为IBOutlet。 IBOutlet表示"这是一个属性,Interface Builder中的UIView(或至少可以)附加到它上面#34;。
让我们举一个简短的例子: 您有一个带按钮的UI,它已连接到您的VC
你的vc:
#import "MyViewController.h"
@interface MyViewController ()
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
@end
在xml视图中打开故事板将显示ViewController已连接到UI元素:
<scene sceneID="s5g-Va-rCL">
<objects>
<viewController id="xkG-tv-x1p" customClass="MyViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="zM9-gD-jvN"/>
<viewControllerLayoutGuide type="bottom" id="rpt-g7-UaO"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="bJ6-Zc-BUd">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="iHE-Sb-Hes">
<rect key="frame" x="277" y="60" width="46" height="30"/>
<state key="normal" title="Button">
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
</button>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<connections>
<outlet property="myButton" destination="iHE-Sb-Hes" id="0tI-Cr-cDZ"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dWo-Es-1mt" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1092" y="628"/>
</scene>
这里最有趣的是以下一行:
<outlet property="myButton" destination="iHE-Sb-Hes" id="0tI-Cr-cDZ"/>
目的地&#34; iHE-Sb-Hes&#34;按钮的id是在上面几行声明的。这是UIViewController和UIView之间的连接定义,它将被编译成代码并在运行时实例化。
通常,您不必担心如何详细创建UI元素。当推送UIViewController时,将加载它的视图并调用viewDidLoad:并且所有UI对象都在那里。您可以编写自己的视图加载器,是的,您可以在代码中创建整个UI。 对于自定义视图加载覆盖loadView,如下所述: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html
总结:
答案 2 :(得分:0)
重点是 http://en.wikipedia.org/wiki/Serialization 。您的界面只是在XML文件(storyboard,xib或nib)中序列化。