swift: 递归动画

swift: recursive animation

在我的应用程序中,我想为一组字符串设置动画以向用户提供一些说明。我的期望是第一个字符串淡入,保持几秒钟然后淡出,然后从数组中删除第一个字符串,然后显示下一个字符串,依此类推,直到数组变空。我的实现有问题,但是很难调试(似乎程序不会逐行执行),这是我的代码:

var text = [Text.text1, Text.text2]
@IBOutlet weak var paragraph: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()
    paragraph.alpha = 0
    showText(text: text)
}

private func showText(text: [String]) {
    if text.first == nil {
        return
    } else {
        paragraph.text = text.first
        UIView.animate(withDuration: 1.5, delay: 1.5, options: .curveEaseInOut, animations: {
            self.paragraph.alpha = 1
        }, completion: { (_) in
            UIView.animate(withDuration: 1.5, delay: 0.5, options: .curveEaseInOut, animations: {
                self.paragraph.alpha = 0
            }, completion: { (_) in
                self.text.remove(at: 0)
                self.showText(text: text)
            })
        })
    }
}

问题是第一个字符串显示了 3 次,然后出现索引超出范围错误。当我尝试设置断点并单击 step over 时,它会跳过动画和完成块,而且我不知道如何调试以块作为参数的函数。而且即使我有

paragraph.text = text.first

第一轮过后,paragraph.text已经是第二串了,但还是显示第一串。 同样,我的终止条件似乎不起作用:经过两次迭代,我注意到 self.text 数组的计数已变为 0,但函数没有 return,它转到 else ...

if text.count == 0 {
            return
        } else { ... }

我是新手,不知道如何调试块...

问题很微妙,都在第二个完成块中。你有:

self.text.remove(at: 0)
self.showText(text: text)

您更新了 text 属性 但您随后传递了未更改的本地 text 参数。

更改第 2 行以传递 self.text 而不是仅传递 text

但是在 showText 中引用 self.text 甚至不需要 text 参数。要么写 showText 只使用 class 的 text 属性 或者更好,只引用 text 参数。后者的优点是不修改 属性.

要实现后一个选项,请将第二个完成块中的两行更改为:

self.text.remove(at: 0)
self.showText(text: text)

只是:

self.showText(text: Array(text[1...]))