不知道如何使用 Swift 将 UIView 类连接到 IB 中的视图

Posted

技术标签:

【中文标题】不知道如何使用 Swift 将 UIView 类连接到 IB 中的视图【英文标题】:Can't figure how to to hook up a UIView class to a View in IB using Swift 【发布时间】:2014-08-30 01:17:13 【问题描述】:

** 已更新 ** 我正在 Swift 中研究一个想法,但似乎无法弄清楚如何将视图连接到视图类。

我在 IB 中有一个 UIViewController 和一个与 IB 中的 UIViewController 关联的 UIViewController 类。在 IB 的 UIView 中的 UIViewController 和药物里面。我想给那个 UIView 它自己的类。我在视图中有一个文本字段,我希望 UIView 类处理该文本字段的所有设置代码。我能够创建 UIView 类,但我也能够将其设置为 IB 中视图的 bast 类。我不是 100% 确定的是如何初始化这个类,以便我可以在 UIView 类中创建变量并控制将它们拖到我在 IB 中的文本字段,

* 更新 * 这是我目前的代码。它似乎至少在做点什么,但我收到了胎儿错误打印消息

import UIKit

class AddPlayerView: UIView
    @IBOutlet weak var inputPlayerOne: UITextField!
    @IBOutlet weak var addPlayerOne: UIButton!

    override init(frame: CGRect) 
        super.init(frame: frame)
        // Initialization code

        println("init add player")

    

    required init(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

我把这个打印出来

致命错误:init(coder:) 尚未实现:

【问题讨论】:

您有没有想过使用点击手势识别器来关闭键盘?使用 resignFirstResponder? 您永远无法从 nib/storyboard 中的某些内容“直接拖动”到 UIControl 类。斯威夫特在这里无关紧要。你想建立什么样的联系?没有什么是有意义的,所以 Xcode 没有什么明显的事情要做。您期望或尝试做的事情远非显而易见。 嘿马特,也许我没有正确解释自己。在 IB 中,我创建了一个视图,并在视图内放置了一个文本字段。我认为创建了一个 UIControl 类。之后,从自定义类下拉列表中,我将选择我刚刚创建的 UIControl 类。这样我的 UIControl 类现在链接到我在 IB 中的视图。然后,我将创建一个 IBOutlet 并将其连接到 IB 视图中的某些内容。我这样做是为了将所有文本输入代码与 viewController 代码分开。我想我不明白的是如何自己使用 UIControl 类。 【参考方案1】:

我只是不明白你的问题。使用 IB 初始化视图将触发 init(coder aDecoder: NSCoder) 而不是 init(frame: CGRect) ,这是标准的。现在,如果您关心的是访问一些未初始化的变量,那么只需覆盖 func awakeFromNib()。并仅使用 super 实现所需的初始化程序

required init(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)


override awakeFromNib()
    // Initialization code

这有意义吗?

【讨论】:

【参考方案2】:

您可以按照以下步骤创建 Outlet(使用 Xcode6-Beta6 + Swift 测试):

    在 Xcode 中激活 Assistant 编辑器(您应该在屏幕左侧显示 Storyboard,在右侧显示 Swift 代码) 在左侧选择一个视图(现在右侧应该有与该视图相关的 Swift 控制器) 在左侧右键单击 UI 元素(例如视图中的 UIButton) UI 元素上方将出现一个深色透明面板 左键单击项目附近的“圆圈/加号”按钮新参考出口 按住左键并拖动一条线到 Swift 控制器(例如,您要声明实例属性的位置)。 松开左键 Xcode 会要求您为 Outlet 命名,输入类似“按钮”的内容 点击连接

完成。现在,在您的 swift 类中,您有一个对 UIButton 的引用。

class ViewController: UIViewController 

    @IBOutlet weak var button: UIButton!
    ...

希望这会有所帮助。

【讨论】:

谢谢 Appz...我更新了我的问题,因为我认为我没有正确解释我的问题。【参考方案3】:

Storyboard 使用它自己的初始化器:init(coder:) 来初始化它的 xib。这也意味着如果你重写一个初始化器,你也必须重写storyboard的required初始化器(前面提到的coder)。看起来好像您这样做了,但是由于某种原因,您将fatalError("init(coder:) has not been implemented") as your code 放入了required init(coder aDecoder: NSCoder)。 这意味着每次初始化视图时,都会调用该方法,当然它会引发致命错误并使您的应用程序崩溃。 我们必须替换该代码。确保在方法的开头调用super.init(coder: aDecoder),然后放置其余的初始化程序代码。 您可能还会发现这个 Stack Overflow 答案很有用:Fatal error: use of unimplemented initializer 'init(coder:)' for class 如果您还有其他问题,请告诉我。祝你好运!

【讨论】:

以上是关于不知道如何使用 Swift 将 UIView 类连接到 IB 中的视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在标签中打印uiview(swift3)

Swift:如何将 MapView 放入 UIView(?)

如何移动 UIView 并使用 Swift 以编程方式放置新的 UIView?

如何使用自动布局在 Swift 中为可重用的 UIView 设置约束?

如何转移UIView并使用Swift以编程方式添加新的UIView?

Swift - 以编程方式在 UIView 中定位项目