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 如何将界面生成器中的更改链接到实际的应用程序(代码)?的主要内容,如果未能解决你的问题,请参考以下文章