tec*_*irl 6 null uilabel ios swift3
我已经阅读了这个问题的几个答案,并尝试了所有建议但没有成功.我是swift的新手,正在使用Swift,PHP和MySQL构建应用程序.我在用户登录到应用程序后收到错误,系统应该通过标签显示用户名UILabel.text.在为UILabel.text变量设置值时发生错误.我的代码包含在下面.我试图在其他页面上硬编码值,并在整个项目中遇到此错误.
import UIKit
class HomeViewController: UITabBarController {
@IBOutlet var usernameLbl: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// set global variables
let username = (user!["username"] as AnyObject).uppercased
// label values
print(usernameLbl ?? username!)
usernameLbl.text = username
}
}
Run Code Online (Sandbox Code Playgroud)
我正在以编程方式访问HomeViewController.该应用程序使用标签栏,它的第一页是主页.代码来自我正在接受Udemy的课程.以下是我访问Home的方式:
// func to pass to home page or to tabBar
func login() {
// refer to our Main.storyboard
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// store our tabBar Object from Main.storyboard in tabBar var
let tabBar = storyboard.instantiateViewController(withIdentifier: "tabBar")
// present tabBar that is storing in tabBar var
window?.rootViewController = tabBar
}
Run Code Online (Sandbox Code Playgroud)
您可能希望遵循最佳实践并!尽可能避免使用.
当您尝试访问存储在不包含任何值的可选项(即,它nil)中的值或引用时,会发生错误.
在你的情况下,如果usernameLbl是nil,usernameLbl.text将崩溃你的应用程序(在Java中思考"空指针异常",也许?).
将outlests定义为:
@IBOutlet weak var label: UILabel!
Run Code Online (Sandbox Code Playgroud)
......而不是更安全:
@IBOutlet weak var label: UILabel?
Run Code Online (Sandbox Code Playgroud)
...因为第一个允许您在不使用?(即label.textvs. label?.text)的情况下访问其属性.但是有一个隐含的假设,标签不是零:!它本身没有阻止这一点(它只是使编译器静音,告诉它"我知道我在做什么,相信我!").
这不应该是一个问题,只要你只能访问它后 viewDidLoad() 和你的店铺都在Interface Builder proerly连接/分镜,因为在这种情况下,将保证不会nil.
我的猜测是你忘了把插座连接到你的标签上.
这是一个关于故事板的教程,以防它有用.
出口需要被定义为选项(隐式展开!或"标准" ?)的全部原因是,在Swift中,所有属性必须在实例初始化时具有值(实际上,甚至在调用超类初始化器之前,如果适用) .
对于视图控制器,实例初始化发生在子视图可以初始化并分配给属性/出口之前.这种情况发生在方法中loadView(),这种方法被称为懒惰(仅在实际需要显示视图之前).因此,通过使所有子视图可选(和变量,而不是常量),它们可以具有nil初始化程序完成执行时的临时"值" (从而满足Swift的规则).
编辑:如果您的插座仍nil处于运行时,即使它已在界面构建器中连接,您至少可以尝试拦截任何重置它的代码,并使用属性观察器查看正在发生的事情:
@IBOutlet weak var label: UILabel! {
didSet {
if label == nil {
print("Label set to nil!")
// ^ SET A BREAKPOINT IN THIS LINE
}
}
}
Run Code Online (Sandbox Code Playgroud)
看到一个@IBOutlet在UITabBarController十分可疑.您通常有一个标签栏控制器,它显示子UIViewController子类,并在这些子视图控制器上放置标签,而不是标签栏控制器.标签栏控制器通常没有IBOutlet引用.子视图控制器会有它们.
仔细检查您已连接到哪个类,@IBOutlet并确认它是否是UIViewController或的子类UITabBarController.
| 归档时间: |
|
| 查看次数: |
7761 次 |
| 最近记录: |