拖放视图如何在Xcode中以编程方式更改?

时间:2015-02-25 19:59:45

标签: ios xcode

当我将XIV拖放到Xcode中的故事板时,UIView对象在哪里被实例化?当我从ViewController的类中的故事板创建一个UIView对象的插座时,我到底在做什么?创建另一个UIView实例,它也指向故事板中的对象"?因为如果我从插座更改属性,我也会更改故事板中对象的相同属性。

3 个答案:

答案 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 enter image description here

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

总结:

  • 虽然我在这里引用了XML,但通常不要触及故事板的xml,因为它是由IB编辑的。 git合并很好,但不会像在Android或Windows XAML上那样开始在纯xml中编写UI视图
  • 运行时将生成您在IB中定义的所有视图对象,这应该是o.k.对于99.99%,您应该开始使用生命周期钩子中的代码,例如viewDidLoad:或viewWillAppear:
  • 如果您对默认的UIView加载不满意,请覆盖UIViewController的loadView,但只有非常罕见的情况需要这样做

答案 2 :(得分:0)

重点是 http://en.wikipedia.org/wiki/Serialization 。您的界面只是在XML文件(storyboard,xib或nib)中序列化。