context.fill () не отображается Swift 4 Xcode 10 - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь прочитать данные из firebase и нарисовать прямоугольники в соответствии с данными в firebase.Цвет также будет заполнен в соответствии со значением, полученным из базы данных.Мне удалось извлечь данные из базы данных и добавить их в массивы.

Поскольку Firebase асинхронный, я добавил обработчик завершения, чтобы запускать следующий код только после завершения readMarina ().Я пытаюсь проверить метод readMarina {} в draw (), введя простой чертеж прямоугольной рамки.Все работало гладко до context?.fill(lot), где выдавалось сообщение об ошибке:

"Поток 1: EXC_BAD_ACCESS (code = 1, address = 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?()
     }) 
}

Я пытался отлаживать, и когда я зависал над «контекстом» и «контекстом», все они показывали значение.Когда я нахожусь над «партией», в нем также анализируется значение. Что не так с моим кодом и почему мое прямоугольное окно не появилось в моем представлении?

Изображение сообщения об ошибке

1 Ответ

0 голосов
/ 28 февраля 2019

Как показано в описании функции draw (_ rect: CGRect):

Этот метод вызывается при первом отображении представления или при возникновении события, которое делает недействительной видимую часть представления.Вы не должны никогда не вызывать этот метод напрямую.Чтобы сделать недействительной часть вашего представления и, таким образом, перерисовать ее, вызовите метод setNeedsDisplay () или setNeedsDisplay (_ :) вместо этого.

Ваше закрытие внутри рисования(_ rect: CGRect) - это функция, которая создает помехи в процессе выполнения и, скорее всего, вызывает сбой.Для этого вы должны удалить вызов функции readMarina изнутри отрисовки (_ rect: CGRect).Вот простая реализация:

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

}

Я добавил View в свой ViewController в Main.storyboard, а в инспекторе идентичности установил пользовательский класс на «MyView».

I added a View to my ViewController in Main.storyboard, and in attributes inspector I've set custom class to

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

enter image description here

...