context.fill()不';不显示Swift 4 Xcode 10

context.fill()不';不显示Swift 4 Xcode 10,swift,firebase,swift4,core-graphics,xcode10,Swift,Firebase,Swift4,Core Graphics,Xcode10,我正在尝试从firebase读取数据,并根据firebase中的数据绘制矩形。颜色也将根据从firebase检索到的值进行填充。我已设法从firebase检索数据并将其附加到数组中 由于Firebase是异步的,因此我添加了完成处理程序,以便仅在readMarina()完成后运行以下代码。我试图通过输入一个矩形框的简单图形来测试readMarina{}in draw()方法。一切都顺利运行,直到出现上下文?.fill(lot),出现以下错误: 线程1:EXC\u坏访问(代码=1,地址=0x7FF

我正在尝试从firebase读取数据,并根据firebase中的数据绘制矩形。颜色也将根据从firebase检索到的值进行填充。我已设法从firebase检索数据并将其附加到数组中

由于Firebase是异步的,因此我添加了完成处理程序,以便仅在readMarina()完成后运行以下代码。我试图通过输入一个矩形框的简单图形来测试readMarina{}in draw()方法。一切都顺利运行,直到出现
上下文?.fill(lot)
,出现以下错误:

线程1:EXC\u坏访问(代码=1,地址=0x7FFEG00000058)

override func draw(rect:CGRect)
{
let context=UIGraphicsGetCurrentContext()
让lot=CGRect(x:80,y:20,宽度:30,高度:60)
雷德马里纳{
上下文?.addRect(地段)
context?.setFillColor(UIColor.red.cgColor)
上下文?填充(批次)
}
}
func readMarina(uu完成:(()->Void)?){
设ref=Database.Database().reference()
让cpDB=ref.child(“停车场”)
child(“MarinaSq”).observe(.value,带:{snapshot in
让snapshotValue=snapshot.value为!字典
用于快照值中的(键,值)
{
if(self.lot.count)如draw(rect:CGRect)函数描述所示:

首次显示视图或发生使视图可见部分无效的事件时,将调用此方法。切勿自己直接调用此方法。若要使视图的一部分无效,从而导致重新绘制该部分,请调用setNeedsDisplay()或setNeedsDisplay(\)方法

draw(rect:CGRect)函数内部的闭包会干扰其执行过程,很可能会导致崩溃。要处理此问题,应删除draw(rect:CGRect)内部的readMarina函数调用。以下是一个简单的实现:

class MyView: UIView {

    var myColor: UIColor? {
        didSet {
            setNeedsDisplay()
        }
    }

    override func draw(_ rect: CGRect) {
        if let context = UIGraphicsGetCurrentContext(), let color = myColor {
            let lot = CGRect(x: bounds.midX-50, y: bounds.midY-50, width: 100, height: 100)
            context.addRect(lot)
            context.setFillColor(color.cgColor)
            context.fill(lot)
        }
    }

}
我在Main.storyboard中将视图添加到我的ViewController中,并在identity inspector中将自定义类设置为“MyView”


不要尝试使
drawRect
异步。在
observe的完成处理程序中调用
setNeedsDisplay
)您是否可以在示例代码中向我展示它?因为我对swift非常陌生,我真的不知道如何在observe的完成处理程序中调用setNeedsDisplay。很抱歉打扰您!是否有理由在绘图内部调用readMarina(rect:CGRect)?@Konstantin我想从firebase读取数据并将其附加到数组当此视图控制器加载到测试函数中时,我将从firebase读取的数据放入数组中。我遵循了您所做的操作,但框仍然没有显示。您是否已将视图添加到Main.storyboard中的GridVC,并将其自定义类设置为MyView?是的,我已经这样做了我已经将类设置为MyView,并将视图添加到GridV我可以收到你的电子邮件吗?我可以将我的整个项目发送给你
class MyView: UIView {

    var myColor: UIColor? {
        didSet {
            setNeedsDisplay()
        }
    }

    override func draw(_ rect: CGRect) {
        if let context = UIGraphicsGetCurrentContext(), let color = myColor {
            let lot = CGRect(x: bounds.midX-50, y: bounds.midY-50, width: 100, height: 100)
            context.addRect(lot)
            context.setFillColor(color.cgColor)
            context.fill(lot)
        }
    }

}
 class ViewController: UIViewController {

    @IBOutlet weak var myView: MyView!

    override func viewDidLoad() {
        super.viewDidLoad()
            testFunc {
                self.myView.myColor = UIColor.red
            }
    }

    func testFunc(completion:(() -> Void)?) {
        // test func
        completion?()
    }
}