gpt4 book ai didi

swift - 如何在完成处理程序中显示编程 View ?

转载 作者:行者123 更新时间:2023-11-30 12:28:29 24 4
gpt4 key购买 nike

我陷入了如何从完成 block 内部显示 View 的困境。如果我在完成 block 之外使用相同的代码,则会显示 View 。我确信该 block 正在执行,并且我在 didSet 中也有 setNeedsDisplay ,用于在 block 内使用的数组。那么我错过了什么?

private var storeViews = [UIView](){ didSet{self.view.setNeedsDisplay()}}

hrd.requestData(from: "somepage.php"){[weak self] (status:Bool,items:[[String:String]]?) in
if status
{
for var i in (0..<items!.count)
{
if let item = items?[i]
{
var shape = CGRect()
shape.size = CGSize(width: 50,height: 30)

let xPosStr = item["xPosition"]
let yPosStr = item["yPosition"]

let position = CGPoint(x: (self?.stringToFloat(xPosStr!))!,y: (self?.stringToFloat(yPosStr!))!)

shape.origin = position
let someView = UIView()
someView.frame = shape
someView.backgroundColor = UIColor.red

self?.view.addSubview(someView)
self?.someViews.append(someView)
}
}
}
}

最佳答案

首先,setNeedsDisplay标记 View 需要重绘。这会在内部调用drawRect。仅当您使用自己的自定义实现重写 UIView 子类中的 drawRect 时,才应调用此函数。我相信您正在发出异步 API 请求,并且正在完成 block 内添加 View 。 UI 更新只能在主线程上完成。需要在主线程中添加 subview

DispatchQueue.main.async {
self?.view.addSubview(someView)
}

此外,由于您要在循环中添加 View ,因此您可能会查看此 answer 。它对 UI 更新遇到瓶颈有一个非常好的解释。

我注意到的另一件事是,

for var i in (0..<items!.count)

如果items为零,您的代码将会崩溃。您可以使用条件绑定(bind)来确保它不会崩溃。

if let items = items{
for item in items{
//Do your stuff
}
}

关于swift - 如何在完成处理程序中显示编程 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43883076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com