我正在尝试从firebase读取数据并根据firebase中的数据绘制矩形。颜色也将相应地填充从firebase中检索到的值。我已设法从firebase检索数据并将它们附加到数组中。
由于Firebase是异步的,我添加了完成处理程序,只在readMarina()完成后运行以下代码。我试图通过输入矩形框的简单绘图来测试draw()方法中的readMarina {}。一切顺利,直到context?.fill(lot)
,它给出了一个错误:
“线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x7ffe00000058)”
override func draw(_ rect: CGRect)
{
let context = UIGraphicsGetCurrentContext()
let lot = CGRect(x: 80,y: 20,width: 30,height: 60)
readMarina{
context?.addRect(lot)
context?.setFillColor(UIColor.red.cgColor)
context?.fill(lot)
}
}
func readMarina (_ completion: (() -> Void)?){
let ref = Database.database().reference()
let cpDB = ref.child("CarPark")
cpDB.child("MarinaSq").observe(.value, with: {snapshot in
let snapshotValue = snapshot.value as! Dictionary<String, AnyObject>
for (key, value) in snapshotValue
{
if (self.lot.count)<((snapshotValue.count)){
let v = value as! String
let k = key
self.lot.append(k)
self.status.append(v)
}
}
completion?()
})
}
我试图调试,当我徘徊在“上下文”和“上下文?”时,它们都显示出一个值。当我在“lot”上盘旋时,还会解析值。我的代码有什么问题以及为什么我的矩形框没有出现在我的View上?
正如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添加了一个View,并在身份检查器中将自定义类设置为“MyView”。
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?()
}
}