使用字符串变量调用 uilabel 动画 swift

Calling uilabel animation with string variables swift

我正在尝试构建 UILabel 动画。我想在函数中添加一个变量字符串,以便我可以将它与变量一起调用。

我尝试使用下面的代码,但它给我错误消息。

@IBOutlet weak var Text1: UILabel!

    let myText = Array("Hello World !!!".characters)
    var myCounter = 0
    var timer:NSTimer?
    func fireTimer(){
        timer = NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector: "typeLetter", userInfo: nil, repeats: true)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
fireTimer()
        // Do any additional setup after loading the view.
    }


    func typeLetter(myText  :String){
        if myCounter < myText.count {
            Text1.text = Text1.text! + String(myText[myCounter])
            let randomInterval = Double((arc4random_uniform(8)+1))/20
            timer?.invalidate()
            timer = NSTimer.scheduledTimerWithTimeInterval(randomInterval, target: self, selector: "typeLetter", userInfo: nil, repeats: false)
        } else {
            timer?.invalidate()
        }
        myCounter++
    }

报错信息如下图

请问问题出在哪里以及如何解决?谢谢

问题是您需要为方法参数选择不同的名称。在该方法中,您无法访问数组计数,因为您的文本参数具有相同的名称。

要获取字符数,您需要使用

myText.characters.count

解决下标错误,可以试试

myText[myText.startIndex.advancedBy(myCounter)]

您的代码存在各种问题。

正如@luk2302 所指出的,您的函数typeLetter 采用字符串类型的参数,但字符串没有计数属性。您需要使用 string.characters 将其转换为单字符数组。数组确实有一个计数 属性.

正如@LeoDabus 指出的那样,您有 2 个不同的变量 myText。一个是(我认为)视图控制器 class 的实例变量(类型 [Character]),另一个是 typeLetter 函数的参数(类型 String)。 typeLetter 函数的参数 myText 将隐藏实例变量 myText 所以你不能使用它。

一个更大的问题是,您已将 typeLetter 函数声明为采用 String 类型的参数,但您是从计时器调用它。计时器传递给函数的唯一参数是计时器本身。您不能将任意参数传递给计时器函数。

如果重写 typeLetter 函数以将计时器作为参数,则可以解决所有这些问题。

func typeLetter(timer: NSTimer)
{
    if myCounter < myText.count {
        Text1.text = Text1.text! + String(myText[myCounter])
        let randomInterval = Double((arc4random_uniform(8)+1))/20
        timer?.invalidate()
        timer = NSTimer.scheduledTimerWithTimeInterval(randomInterval,
          target: self, 
          selector: "typeLetter", 
          userInfo: nil, 
          repeats: false)
    } 
    else 
    {
        timer?.invalidate()
    }
    myCounter++
}

当您这样做时,实例变量 myText 不再被同名参数隐藏,并且实例变量 myText 是正确的类型 [unichar]