ios – 在Swift中使用XIB自定义UIView子类

ios – 在Swift中使用XIB自定义UIView子类,第1张

概述我正在使用 Swift和Xcode 6.4来获得它的价值. 所以我有一个视图控制器,它将包含一些UILabels和UIImageViews.我想将UILabel-UIImageView对放入自定义UIView中,因此我可以在上述视图控制器中重复使用相同的结构. (我知道这可以翻译成UITableView,但为了〜学习〜请耐心等待我).事实证明这是一个比我想象的更复杂的过程,我无法找到使这一切在IB 我正在使用 Swift和Xcode 6.4来获得它的价值.

所以我有一个视图控制器,它将包含一些UILabels和UIImageVIEws.我想将UILabel-UIImageVIEw对放入自定义UIVIEw中,因此我可以在上述视图控制器中重复使用相同的结构. (我知道这可以翻译成UItableVIEw,但为了〜学习〜请耐心等待我).事实证明这是一个比我想象的更复杂的过程,我无法找到使这一切在IB工作的“正确”方法.

目前我一直在使用UIVIEw子类和相应的XIB,重写init(frame :)和init(编码器),从nib加载视图并将其添加为子视图.这是我到目前为止在互联网上看到/阅读的内容. (这大约是:http://iphonedev.tv/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6).

这给了我在init(编码器)和从bundle加载nib之间引起无限循环的问题.奇怪的是,这些文章或之前关于堆栈溢出的答案都没有提到这一点!

好的,我在init(编码器)中检查是否已经添加了子视图.这似乎是“解决了”.但是当我尝试为它们分配值时,我开始遇到一个问题,我的自定义视图出口是零.

我做了一个dIDSet并添加了一个断点来看看……它们肯定是在某一点设置的,但是当我尝试修改标签的textcolor时,该标签是nil.
我有点在这里撕扯我的头发.

可重用的组件看起来像软件设计101,但我觉得Apple正在密谋反对我.我应该在这里使用集装箱风险投资吗?我应该只是在我的主要VC中嵌套视图并拥有一个愚蠢的大量插座吗?为什么这么复杂?为什么每个人的例子都不适合我?

期望的结果(假装整个事情是VC,盒子是我想要的自定义uivIEws):

谢谢阅读.

以下是我的自定义UIVIEw子类.在我的主要故事板中,我将UIVIEws与子类设置为他们的类.

class StageCardVIEw: UIVIEw {@IBOutlet weak private var stageLabel: UILabel! {    dIDSet {        NSLog("I will murder you %@",stageLabel)    }}@IBOutlet weak private var stageImage: UIImageVIEw!var stagename : String? {    dIDSet {        self.stageLabel.text = stagename    }}var imagename : String? {    dIDSet {        self.stageImage.image = UIImage(named: imagename!)    }}var textcolor : UIcolor? {    dIDSet {        self.stageLabel.textcolor = textcolor    }}var splatcolor : UIcolor? {    dIDSet {        let splatimage = UIImage(named: "backsplat")?.tintedImageWithcolor(splatcolor!)        self.backgroundcolor = UIcolor(patternImage: splatimage!)    }}// MARK: initrequired init(coder aDecoder: NSCoder) {    super.init(coder: aDecoder)    if self.subvIEws.count == 0 {        setup()    }}overrIDe init(frame: CGRect) {    super.init(frame: frame)    setup()}func setup() {    if let vIEw = NSBundle.mainBundle().loadNibnamed("StageCardVIEw",owner: self,options: nil).first as? StageCardVIEw {        vIEw.frame = bounds        vIEw.autoresizingMask = UIVIEwautoresizing.FlexibleWIDth | UIVIEwautoresizing.FlexibleHeight        addSubvIEw(vIEw)    }}/*// Only overrIDe drawRect: if you perform custom drawing.// An empty implementation adversely affects performance during animation.overrIDe func drawRect(rect: CGRect) {    // Drawing code}*/}

编辑:这是我迄今为止所能得到的……

厦门国际银行:

结果:

问题:尝试访问标签或图像插座时,它们是零.在检查所述访问的断点时,标签和图像子视图在那里,视图层次结构与预期一致.

我可以在代码中完成这一切,如果这就是它需要的东西,但我并不是很擅长在代码中进行autolayout,所以如果有办法避免它,我宁愿不要!

编辑/问题转移:

我想出了如何让出口停止为零.

这个SO答案的灵感:Loaded nib but the view outlet was not set – new to InterfaceBuilder,除了指定视图插座我分配了各个组件插座.

现在,这就是我只是在墙上乱扔东西,看看它是否坚持.有谁知道我为什么要这样做?这是什么样的黑暗魔法?

解决方法 关于视图重用的一般建议

你是对的,可重用和可组合的元素是软件101.Interface Builder不是很擅长.

具体来说,xib和storyboard是通过重用代码中定义的视图来定义视图的好方法.但它们不适合定义您自己希望在xib和storyboard中重用的视图. (可以这样做,但这是一项高级练习.)

所以,这是一个经验法则.如果要定义要从代码中重复使用的视图,请根据需要对其进行定义.但是,如果您要定义一个您希望能够在故事板中重用的视图,那么请在代码中定义该视图.

因此,在您的情况下,如果您尝试定义要从故事板重用的自定义视图,我会在代码中执行此 *** 作.如果您已经决定通过xib定义视图,那么我将在代码中定义一个视图,并在其初始化程序中初始化您的xib定义视图并将其配置为子视图.

在这种情况下的建议

以下是您在代码中定义视图的大致方式:

class StageCardVIEw: UIVIEw {  var stageLabel = UILabel(frame:CGRectZero)  var stageImage = UIImageVIEw(frame:CGRectZero)  overrIDe init(frame:CGRect) {   super.init(frame:frame)   setup()  }  required init(coder aDecoder:NSCoder) {    super.init(coder:aDecoder)     setup()  }  private func setup() {    stageImage.image = UIImage(named:"backsplat")    self.addSubvIEw(stageLabel)    self.addSubvIEw(stageImage)    // configure the initial layout of your subvIEws here.  }}

您现在可以在代码中或通过故事板实例化它,尽管您不会在Interface Builder中获得实时预览.

或者,通过在代码定义的视图中嵌入xib定义的视图,大致如何定义基于xib的可重用视图:

class StageCardVIEw: UIVIEw {  var embeddedVIEw:EmbeddedVIEw!  overrIDe init(frame:CGRect) {   super.init(frame:frame)   setup()  }  required init(coder aDecoder:NSCoder) {    super.init(coder:aDecoder)     setup()  }  private func setup() {    self.embeddedVIEw = NSBundle.mainBundle().loadNibnamed("EmbeddedVIEw",owner:self,options:nil).lastObject as! UIVIEw    self.addSubvIEw(self.embeddedVIEw)    self.embeddedVIEw.frame = self.bounds    self.embeddedVIEw.autoresizingMask = .FlexibleHeight | .FlexibleWIDth  }}

现在,您可以使用故事板或代码中的代码定义视图,它将加载其nib定义的子视图(并且在IB中仍然没有实时预览).

总结

以上是内存溢出为你收集整理的ios – 在Swift中使用XIB自定义UIView子类全部内容,希望文章能够帮你解决ios – 在Swift中使用XIB自定义UIView子类所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1105435.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存