无法将故事板中的 IBOutlet 连接到 UIView 子类

Unable to connect IBOutlet from storyboard to UIView subclass

我可以右键单击并从我的自定义 UIView 子类文件拖动到故事板元素以连接它们,但反之则无法这样做。我认为这是一个 Xcode 错误。我可以做些什么来解决这个问题吗?这不是第一次发生了,而且很烦人。

我已经尝试清理并重新启动 Xcode 几次,但都没有成功。

这不起作用(从故事板右键单击到 Swift 文件)

这有效(从 swift 文件的 IBAction 右键单击​​到故事板)

顺便说一句,我正在使用 Xcode 8.1 和 Swift 3.0.

更新:我不是在寻找有关如何连接的答案 IBOutlets/IBActions,因为正如我在上面的问题中提到的(以及在屏幕截图中),我已经能够连接它们和应用程序运行 很好。问题更多关于为什么 Xcode 不允许我从 Storyboard > Swift 文件连接,但允许我从 Swift 文件 > Storyboard 连接。如果这个问题有误导性,我很抱歉。

IBOutlet 未连接时要检查的事项:

  1. 故事板中是否定义了class?

    Select UIViewController in storyboard,然后在屏幕右侧,select identity inspector 并分配合适的 class.

  2. 您定义的插座类型是否与 storyboard 上的相符? 比如我们连接UIButton,那么插座应该是这样的,写插座的代码,然后连接到视图控制器:

    @IBOutlet weak var theButton: UIButton!
    

在 Objective-C

中创建这样的出口
@property (nonatomic, weak) IBOutlet UIView *view;

或如 swift 3

@IBOutlet weak var instruction: UILabel?

然后如图所示连接它。

有时由于子类化,连接 action 和 outlet 的正常方式不起作用。这种方式在这种情况下很方便。

另一种方法是像这样在视图控制器中手动创建按钮名称 -

@IBOutlet weak var button: UIButton!

然后通过拖动连接按钮以查看控制器,如图所示[!

PS:- 请同时清理您的派生数据。

在尝试了一些给定的解决方案后,最终起作用的是重新启动我的 macbook。这似乎是 XCode 方面的错误。好吧。

Xcode 8 以来,我们有时也会看到此问题,并假设这是一个 Xcode 错误。

解决方法:

  • 把插座写在代码里@IBOutlet weak var myUiElement: UIView!

  • Ctrl + 从您的插座拖动到 Storyboard 中的 UI 元素

它很基本,但很容易被忽视。确保将插座拖动到的视图控制器被标记为您创建的自定义 class。

我已经按照以下流程解决了我的问题。

  1. 将您的 Storyboard 视图与任何其他 ViewController 连接起来。
  2. 现在,将您想要的 ViewController 与故事板重新连接。

希望这对你有用!!

在我的例子中,我让我的 class MyViewController 与另一个视图控制器共享一个文件,该文件实际上是以另一个 viewController 命名的。一旦我将 MyViewController 移动到它自己的文件中,它就开始工作了。
如果不清楚这里是代码版本:

/*  Version one (did not work): */

// OtherViewController.swift
class OtherViewController: UIViewController {
 // stuff
}
class MyViewController: UIViewController {
 // could not control-drag view here to create IBOutlet/IBAction
}

/*  Version two (works): */

// OtherViewController.swift
class OtherViewController: UIViewController {
 // stuff
}

// MyViewController.swift
class MyViewController: UIViewController {
 // yay! now I can control-drag a view here!

}