使用字符串变量调用 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]
。
我正在尝试构建 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]
。