Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何从外部访问for循环并使其在swift中停止_Ios_Swift - Fatal编程技术网

Ios 如何从外部访问for循环并使其在swift中停止

Ios 如何从外部访问for循环并使其在swift中停止,ios,swift,Ios,Swift,我正在使用此函数使文本逐字书写: extension SKLabelNode { func setTextWithTypeAnimation(typedText: String, characterInterval: NSTimeInterval = 0.05) { text = "" self.fontName = "PressStart2P" dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERA

我正在使用此函数使文本逐字书写:

extension SKLabelNode {

func setTextWithTypeAnimation(typedText: String, characterInterval: NSTimeInterval = 0.05) {
    text = ""
    self.fontName = "PressStart2P"
    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)) {
        for character in typedText.characters {
            dispatch_async(dispatch_get_main_queue()) {
                self.text = self.text! + String(character)
            }
            NSThread.sleepForTimeInterval(characterInterval)
        }
    }
}

而且,如果用户单击屏幕,我希望使for循环停止并立即显示完整的文本。

我会这样做:

var ignoreSleeper = false    

@IBAction func pressButton(sender: UIButton) {
        ignoreSleeper = true
}

extension SKLabelNode {

func setTextWithTypeAnimation(typedText: String, characterInterval: NSTimeInterval = 0.05) {
    text = ""
    self.fontName = "PressStart2P"
    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)) {
        for character in typedText.characters {
            dispatch_async(dispatch_get_main_queue()) {
                self.text = self.text! + String(character)
            }
            if(!ignoreSleeper){
            NSThread.sleepForTimeInterval(characterInterval)
            }
        }
    }
}

编辑:就像@Breek已经提到的那样

我建议实现一个微型的
NSTimer
,带有一个计数器,用于显示字符数。用重复计数
typedText.characters.count
和所需的延迟启动计时器,就可以开始了(使用一个线程)。增加每个计时器循环上的字符数计数器。您可以随时通过在计时器上调用
invalidate
按钮来停止此计时器

示例

var timer: NSTimer?
var numberOfCharsToPrint = 1
let text = "Hello, this is a test."

func updateLabel() {
    if numberOfCharsToPrint == text.characters.count {
        welcomeLabel.text = text
        timer?.invalidate()
    }

    let index = text.startIndex.advancedBy(numberOfCharsToPrint)
    welcomeLabel.text = text.substringToIndex(index)

    numberOfCharsToPrint++;
}
然后在希望动画开始时初始化计时器

timer = NSTimer.scheduledTimerWithTimeInterval(0.25, target: self, selector: "updateLabel", userInfo: nil, repeats: true)

您可以在任何给定时间使用
timer?.invalidate()

当用户触摸屏幕并在循环中放入checking if语句时,设置为某个值的
布尔标志如何?此代码启动一个新线程,该线程启动
count(typedText)
线程。我称这种方法为“通过胸部进入眼睛”。我想实现一个小型的
计时器
,带有一个计数器,用于显示字符数。启动
计时器
,重复计数
计数(typedText)
和所需的延迟,就可以开始了(使用一个线程)。您可以随时按下按钮停止此计时器。写这篇文章我意识到这应该是一个答案而不是评论…是的,也许这会是更好的解决方案是的,当然。我的Mac电脑在工作。在家里我有一台电脑,所以你得等几个小时。