【发布时间】:2020-02-19 08:21:56
【问题描述】:
我是 Swift 新手,正在尝试实现一个简单的测试单视图应用程序:运行时,它应该自动在 UITextView 中附加文本行。
但是,我得到的只是一个空白屏幕,其中包含以下代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var m_logView: UITextView!
private let m_log = Log()
override func viewDidLoad() {
super.viewDidLoad()
addLog(msg: "Hello World!")
while true {
m_log.requestLog{ [weak self] (data: String) in
self?.consumeLog(log: data)
}
}
}
func consumeLog(log: String) {
addLog(msg: log)
}
func addLog(msg: String) {
m_logView.text += msg + "\n"
}
}
class Log {
func requestLog(consume: (_ log: String) -> Void) {
let log = "Data from wherever"
consume(log)
}
}
我怀疑我试图在错误的地方更新UITextView。上面的代码只是阻止viewDidLoad() 完成自身并显示UITextView。
所以我找到了viewDidAppear,但这次它卡在那里并且只显示“Hello World!”在视图中。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var m_logView: UITextView!
private let m_log = Log()
override func viewDidLoad() {
super.viewDidLoad()
addLog(msg: "Hello World!")
}
override func viewDidAppear(_ animated: Bool) {
while true {
m_log.requestLog{ [weak self] (data: String) in
self?.consumeLog(log: data)
}
}
}
func consumeLog(log: String) {
addLog(msg: log)
}
func addLog(msg: String) {
m_logView.text += msg + "\n"
}
}
class Log {
func requestLog(consume: (_ log: String) -> Void) {
let log = "Data from wherever"
consume(log)
}
}
我发现的大多数 iOS MVC 教程都教授如何实现用户交互,但远离如何通过以编程方式从后端更改模型来更新视图。
我可能正在寻找一个回调/委托,我可以在数据更改时刷新与其数据模型链接的UITextView,但它在哪里?
【问题讨论】:
-
尝试调试时看到了什么?你试过可视化调试器吗?
-
@Lu_ 它只是永远卡在while循环中,一遍又一遍地调用
requestLog。 -
所以请记住第一件事,您应该将 UI 更新放在主线程上,其次,当您在文本视图中添加空行时,您希望在屏幕上看到什么? :D
-
@Lu_ 嗯,你是说我现在在单独的线程上做事吗?如果我在 viewDidLoad() 中调用 addLog(text),我确实会在屏幕上看到文本。 “空行”是什么意思?
-
您的应用程序卡住了,因为您正在运行一个永无止境的无限循环并且您的应用程序被冻结。应该有行数限制。
标签: ios swift model-view-controller