【问题标题】:How to display a programatic view inside a completion handler?如何在完成处理程序中显示编程视图?
【发布时间】:2017-05-10 03:19:56
【问题描述】:

我不知道如何从完成块内显示视图。如果我在完成块之外使用相同的代码,则会显示视图。我确定该块正在执行,并且我在 didSet 中也有 setNeedsDisplay 用于我在块内使用的数组。那我错过了什么?

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)
            }
        }
    }
}

【问题讨论】:

  • 您的问题不清楚;您正在展示什么样的视图?一个数组往往会指示一个 tableView,在这种情况下,您需要从主队列调用 reloadData。邮政编码。
  • 我需要屏幕有一些正方形,所以我使用 CGRect,除了显示它们之外,我将它们存储在一个数组中,并且该数组有 didSet 和 setNeedsDisplay
  • 你能添加你目前拥有的代码吗?
  • 你是怎么画这些方块的? CAShapeLayer, UIView 自动布局, UIView 手动框架, UIView.drawRect()?
  • 您好,我刚刚输入了代码(由于小于字符,循环不显示完整)

标签: swift view completion


【解决方案1】:

首先,setNeedsDisplay 标记需要重绘的视图。这在内部调用drawRect。仅当您使用自己的自定义实现覆盖 UIView 子类中的 drawRect 时才应该调用它。我相信您正在发出异步 API 请求,并且您正在完成块内添加视图。 UI 更新应该只在主线程上完成。需要在主线程中添加子视图

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

此外,由于您是在循环中添加视图,因此您可能会查看此answer。它对 UI 更新遇到瓶颈有很好的解释。

我注意到的另一件事是,

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

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

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

【讨论】:

  • 谢谢哥们,它解决了我的问题,感谢关于 UI 瓶颈的建议,我要检查一下
猜你喜欢
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 2020-02-20
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多