xcode 如何将界面生成器中的更改链接到实际的应用程序(代码)?

Posted

技术标签:

【中文标题】xcode 如何将界面生成器中的更改链接到实际的应用程序(代码)?【英文标题】:How does xcode link changes in the interface builder to the actual app (code)? 【发布时间】:2014-05-31 18:58:55 【问题描述】:

我是 ios 开发的新手。我正在使用带有 xcode 5.1 的故事板,并使用界面生成器进行大部分设计。

首先,我想知道 xcode 是否真的将界面构建器配置转换为(目标 C)代码。如果是,是否可以(轻松)访问此类代码?

其次,xcode 究竟何时创建视图?在 initwithnibname() 之前还是在这些预定义的方法中? 实际上,我想知道例如在某个时间点再次调用 viewdidload() 时,设置为从界面构建器中隐藏的按钮是否会被隐藏?如果没有,如何以编程方式重新初始化视图?

【问题讨论】:

Good Apple ref。 Nib 在运行时由 Apple 代码加载,这很可能是 Objective-C,但与 AppKit/UIKit 的其余部分一样,您看不到它。开始回答最后一个问题,视图的未归档,因此它可以保持一些状态。但它应该是仅视图状态,而不是模型状态。 感谢史蒂夫的评论。我应该开始阅读更多 Apple 的参考文献。 【参考方案1】:

(首先)不。它将“interface builder config”翻译成instances。换句话说,nib 实例中的内容,您可以很容易地看到它们:

<tableViewCell clearsContextBeforeDrawing="NO" contentMode="scaleToFill" selectionStyle="blue" indentationWidth="10" reuseIdentifier="TrackCell" id="2" userLabel="Cell" customClass="MyCell">
    <rect key="frame" x="0.0" y="0.0"  />
    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
    <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="2" id="WVn-Ij-tEm">
        <rect key="frame" x="0.0" y="0.0"  />
        <autoresizingMask key="autoresizingMask"/>
        <subviews>
            <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" tag="1" contentMode="scaleToFill" text="Zumalama" lineBreakMode="middleTruncation" numberOfLines="10" minimumFontSize="10" preferredMaxLayoutWidth="308" translatesAutoresizingMaskIntoConstraints="NO" id="8" userLabel="LabelTag1">
                <rect key="frame" x="6" y="3"  />
                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                <constraints>
                    <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="21" id="56"/>
                    <constraint firstAttribute="height" priority="1" constant="38" id="95"/>
                </constraints>
                <fontDescription key="fontDescription" name="Georgia-Bold" family="Georgia" pointSize="14"/>
                <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
                <nil key="highlightedColor"/>
            </label>
            <!-- and so on ... -->

(其次)我假设您在谈论视图控制器的主视图。它在(即因为)它加载包含它的 nib 时创建该视图,即,当第一次需要该视图时 - 要么是因为代码直接引用它,要么(更常见的是)因为将其放入的时刻即将到来界面。所以,这是在initWithNibName: 之后的一段时间——所有 所做的只是制作和准备一个视图控制器,这是完全不同的事情。时刻本身通常由(get this)viewDidLoad 标记。

(实际上)如果再次加载 nib,您会从 nib 中获得新的实例,不受之前加载此 nib 的任何先前实例发生的任何事情的影响。因此,多次加载 nib 是获取视图的新鲜原始副本的好方法 - 例如,使用来自 nib 的 table view 单元格。但是,反过来说,如果你推送一个视图控制器,弹出它,然后再次推送它,所有的状态都会丢失,因为这是这个视图控制器及其视图的一个新实例;恢复状态(如果这是您的目标)取决于您。

【讨论】:

看看我对这个话题的完整讨论:apeth.com/iOSBook/ch07.html#_nib_loading_and_file_8217_s_owner 非常感谢您富有洞察力的回答。您提供的链接正是我想要的! @user3490458 很高兴您对此感到好奇,而不仅仅是将笔尖视为某种魔法。它们根本不是魔法,如果你想成功地使用它们,理解它们是至关重要的。不幸的是,Apple 让这个看起来像魔术一样,导致初学者陷入各种陷阱。 - 您还可以查看第 19 章,其中更详细地讨论了视图控制器和 nib 加载。

以上是关于xcode 如何将界面生成器中的更改链接到实际的应用程序(代码)?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过界面生成器更改导航项标题?

将图像添加到界面构建器中的按钮

如何在 XCode 的界面生成器中添加图像?

您可以使用界面生成器在 xcode 中制作自定义视图吗?

Xcode将集合视图单元添加到界面生成器上的集合视图

如何从 Xcode 10 和 Swift 4 中的界面构建器中解除模态序列 [重复]