如何使用户定义的运行时属性在 xcode 10.2.1 和 ios 12.2 中起作用

Posted

技术标签:

【中文标题】如何使用户定义的运行时属性在 xcode 10.2.1 和 ios 12.2 中起作用【英文标题】:How to make user defined runtime attribute functioned in xcode 10.2.1 and ios 12.2 【发布时间】:2019-04-30 13:51:55 【问题描述】:

我正在将代码转换为 Swift 5,因为 Xcode 10.2.1 将不再支持 Swift 3。

我在情节提要中有一个用户定义的运行时变量。它在 Swift 3 中有效,但在 Swift 5 中无效。

关键路径 |类型 |价值 类型 |字符串 |一个

class Mains: UITableViewController, XMLParserDelegate 
  ...    
  var type = String()
  ...

  func loadBuses()

    let url:String="http://example.com/Main.php?type="+type
    let urlToSend: URL = URL(string: url)!
    ...
  

  ...

在 Swift 3 中,它运行正常,并且 url 返回“http://example.com/Main.php?type=A”。 但在 Swift 5 中,url 的实际输出只返回“http://example.com/Main.php?type=”。

在任何替代方案中,我仍然可以在故事板中为该类使用用户定义的运行时属性?谢谢。

【问题讨论】:

尝试将type 声明为@objc 【参考方案1】:

您应该会在控制台中看到一条错误消息:

这个类不符合键类型的键值编码

此错误是问题的线索。用户定义的运行时属性通过 Objective-C / Cocoa 特性、键值编码工作。这要求 Objective-C 能够看到您尝试设置的属性。在现代 Swift 中,您可以通过使用 @objc 属性标记自定义属性来使 Objective-C 可以访问它:

@objc var type = String()

您的代码将像以前一样工作。


(但drawster的建议也不错。@IBInspectable 使用与用户定义的运行时属性相同的机制。如果您将某些内容标记为@IBInspectable,它会在引擎盖下自动标记为@objc@IBOutlet 也是如此,使用了这种机制)。Inspectable 属性在 IB 中为您提供了更好的用户界面;您可以直接在属性检查器中设置您的属性,而不是不必弄乱用户定义的运行时属性表。)

【讨论】:

【参考方案2】:

您需要执行以下操作:

@IBInspectable var type = String()

【讨论】:

以上是关于如何使用户定义的运行时属性在 xcode 10.2.1 和 ios 12.2 中起作用的主要内容,如果未能解决你的问题,请参考以下文章

未安装自定义字体 - Xcode 11 beta

Xcode 10.2 无法在 iOS < 10 的模拟器上运行应用程序

如何在代码之外使用 Xcode 4 和 iOS 4.3 将属性分配给自定义 UIControl?

使用用户定义的运行时属性让应用程序崩溃

如何让用户在核心数据xcode中创建自己的属性

如何在不捐赠意图或使用快捷方式的情况下利用 Siri 创建自定义对象?