Swift - 以编程方式创建视图问题,无法找到存储的属性

Posted

技术标签:

【中文标题】Swift - 以编程方式创建视图问题,无法找到存储的属性【英文标题】:Swift - Programmatically creating Views Issue, unable to find stored property 【发布时间】:2014-07-05 15:57:29 【问题描述】:

我正在尝试学习 Swift 和 ios 视图和视图控制器。

var window: UIWindow?
var rootViewController: MyCustomView?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool 
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    // Override point for customization after application launch.

    self.rootViewController = MyCustomView()
    self.rootViewController!.backgroundColor = UIColor.orangeColor()

    var rect = CGRectMake(20, 20, 100, 100)
    var label = UILabel(frame: rect)
    label.text = "Hello iOS Views"
    label.backgroundColor = UIColor.orangeColor()

    self.window!.rootViewController = self.rootViewController
    self.window!.backgroundColor = UIColor.whiteColor()
    self.window!.makeKeyAndVisible()
    return true

我在编译时遇到错误,“找不到成员 'rootViewController'” 在以下行:

self.window!.rootViewController = self.rootViewController

不知道为什么 Xcode 6 Beta 不喜欢它,但它能够找到这一行:

self.rootViewController!.backgroundColor = UIColor.orangeColor()

【问题讨论】:

听起来您对属性感到困惑。 self.window.rootViewController 和 self.rootViewController 的区别你了解吗? @CHBuckingham 无关。 为什么需要一个局部变量来保存rootViewController?你在 AppDelegate 的其他地方需要它吗? @dasdom 没有什么特别的原因,我正在学习以编程方式快速编写视图,就像我在 Objective-C 中所做的那样。 “相同”的代码在 Objective C 中有效,但在 Swift 中无效。不知道为什么编译器可能会因为它是 Beta 不确定而阻塞在该行上。 这个我没有答案,但一般来说,如果你不需要代码,删除它。代码写了一次,读了上百次。更少的代码,更少的负担。 【参考方案1】:

问题在于 MyCustomView 是一个 UIView。但是 UIWindow 的 rootViewController 需要一个 UIViewController。

通常,您通过不区分视图控制器和视图而在代码中混淆了自己。但是您确实明智地命名了 MyCustomView,这很好。它有一个backgroundColor 的事实有助于证明它是一个视图,而不是一个视图控制器(视图控制器没有背景颜色)。

【讨论】:

这里的 Swift 编译器错误消息肯定可以改进。 “尝试将 UIView 分配给 UIViewController 属性”会很好!即使是“类型不匹配”也比仅仅声称该属性丢失更好。 正确的亚光,很好的捕捉。我想我今晚编码太久了。谢谢。

以上是关于Swift - 以编程方式创建视图问题,无法找到存储的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式创建 UIImage 视图 - Swift

如何在 Swift 中以编程方式从 UIView 中删除安全区域?

无法以编程方式在 Swift 的堆栈视图中正确排列两个标签

Swift - 以编程方式向堆栈视图添加标签

如何以编程方式创建按钮?

Swift - 以编程方式创建视图时的 Lazy Var vs. Let(节省内存)