Swift4: как решить "Неустранимая ошибка: не удается сформировать Range с upperBound <lowerBound"?(длительность задержки в пользовательском интерфейсе) - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь закрыть меню анимированно, Я решил уменьшить размер нажатия кнопки UIScrollView при уменьшении размера до желаемого значения, а затем скрыл его.

Чтобы выполнить задачу в соответствии с моим желаемым пользовательским интерфейсом, в некоторых моментах я использовал «функцию задержки» (задано 300 милисек)

все идет хорошо: если я не буду нажимать кнопку снова и снова до тех пор, пока не будет достигнут срок

Произошла ошибка: когда я снова и снова нажимаю кнопку с 300 миллисекунд

func disAppearBlanceMenu(){
    let x1 = btn_addBalance.clickableimg.frame.midX
    let y1 = btn_addBalance.clickableimg.frame.maxY

    UIView.animate(withDuration: 0.3) {
        self.BalanceMenu.scrollview.frame = CGRect(x: x1 - 150, y: y1 + 20, width: 200, height: 20)
    }
    time.delay(milliSec: 300) {
        self.BalanceMenu.triangle.isHidden = true
        self.BalanceMenu.scrollview.isHidden = true
        for i in 0...(self.BalanceMenuBtn.count - 1) {
            self.BalanceMenuBtn[i].imag.removeFromSuperview()
            self.BalanceMenuBtn[i].button.removeFromSuperview()
        }
        self.BalanceMenuBtn.removeAll()

    }
    displayBalanceMenu = true
}

Где

class time {
    static func delay(milliSec:Int, code: @escaping () -> Void ) {
        let deadline = DispatchTime.now() + .milliseconds(milliSec)
        DispatchQueue.main.asyncAfter(deadline: deadline) {
            code()
        }
    }
}

Ошибка возникает здесь:

time.delay(milliSec: 300) {

Там написано

'Поток 1: фатальная ошибка: невозможно сформировать Range с upperBound

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Похоже, вы хотите что-то сделать, когда анимация завершена. Если это так, используйте параметр completion:

UIView.animate(withDuration: 0.3, animations: { 
    self.BalanceMenu.scrollview.frame = CGRect(x: x1 - 150, y: y1 + 20, width: 200, height: 20)
}, completion: { _ in
    self.BalanceMenu.triangle.isHidden = true
    self.BalanceMenu.scrollview.isHidden = true
    for button in self.BalanceMenuBtn {
        button.imag.removeFromSuperview()
        button.button.removeFromSuperview()
    }
    self.BalanceMenuBtn.removeAll()
})

Это позволяет избежать проблем с синхронизацией, вызванных этим delay методом. Это также делает намерение более явным.


Само собой разумеется, что как только вы решите эту проблему, свойства BalanceMenu и BalanceMenuBtn должны быть переименованы, чтобы начинаться с строчных букв, например, возможно balanceMenu и balanceMenuButtons, соответственно. Также обратите внимание на использование суффикса Buttons вместо Btn, чтобы было понятно, что это массив кнопок.

0 голосов
/ 26 мая 2019

В вашем коде вы должны добавить условие перед выполнением цикла for следующим образом:

time.delay(milliSec: 300) {
            self.BalanceMenu.triangle.isHidden = true
            self.BalanceMenu.scrollview.isHidden = true
       if self.BalanceMenuBtn.count > 0 {
            for i in 0...(self.BalanceMenuBtn.count - 1) {
                self.BalanceMenuBtn[i].imag.removeFromSuperview()
                self.BalanceMenuBtn[i].button.removeFromSuperview()
            }
           self.BalanceMenuBtn.removeAll()
       }
    }

Вы получаете эту ошибку, когда в цикле for нижняя граница больше верхней границы.В вашем коде, когда в первый раз анимация будет завершена, счетчик массива будет равен 0, а во второй раз условие будет выглядеть следующим образом:

for I in 0...-1

Вот почему вы получаете сбой ипроверка состояния счета, как показано в моем ответе, не приведет к сбою.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...