2015-08-20 28 views
0

我有一小段代码是为了取一个字符串,在一个库中找到单词,并将它们从其他单词的随机数组中取代。出于某种原因,当我按下按钮时,没有任何反应!我在操场上工作,所以我做错了什么?为什么UITextView的文本没有被替换?

应用代码:

import UIKit 

extension Array { 
    func randomItem() -> T { 
     let index = Int(arc4random_uniform(UInt32(self.count))) 
     return self[index] 
    } 
} 

extension String { 
    func replace(target: String, withString: String) -> String 
    { 
     return self.stringByReplacingOccurrencesOfString(target, withString: withString, options: NSStringCompareOptions.LiteralSearch, range: nil) 
    } 
} 

class ViewController: UIViewController { 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     maintext.text = "The Dog Chases the Ball" 
     self.submit.setTitle("Change It", forState: UIControlState.Normal) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBOutlet var maintext: UITextView! 

    @IBOutlet var submit: UIButton! 
    @IBAction func submitTapped(sender: UIButton) { 
     self.submit.setTitle("Again", forState: UIControlState.Normal) 

     var AllWords = maintext.text 

     var WordsArray = AllWords.componentsSeparatedByString(" ") 
     var Dog = ["Pup", "Canine", "Wolf"] 
     var Ball = ["Frisbee", "Stick", "Car"] 


     AllWords.replace("Dog", withString: Dog.randomItem()).replace("Ball", withString: Ball.randomItem()) 
    } 

} 

玩的理由:

import UIKit 
import Foundation 

extension Array { 
    func randomItem() -> T { 
     let index = Int(arc4random_uniform(UInt32(self.count))) 
     return self[index] 
    } 
} 

extension String 
{ 
    func replace(target: String, withString: String) -> String 
    { 
     return self.stringByReplacingOccurrencesOfString(target, withString: withString, options: NSStringCompareOptions.LiteralSearch, range: nil) 
    } 
} 

var Text = "The Dog Loves to Chase the Ball" 


    //: Old Text Loaded as an array 
    var AllWords = Text.componentsSeparatedByString(" ") 

    //: New Word Library 
    let Dog = ["Pup", "Canine", "Wolf"] 
    let Ball = ["Frisbee", "Stick", "Car"] 


for element in AllWords { 
    Text.replace(element, withString: Dog.randomItem()) 
    Text.replace(element, withString: Ball.randomItem()) 

} 

Text.replace("Dog", withString: Dog.randomItem()).replace("Ball", withString: Ball.randomItem()) 

谢谢!

回答

0

您正在将maintext.text复制到AllWords,然后替换AllWords中的文本。 AllText现在有maintext.text中的内容的副本,但未指向textview的text属性。在AllWords替换文本后,应先分配AllWordsmaintext.text

var AllWords = maintext.text 

var WordsArray = AllWords.componentsSeparatedByString(" ") 
var Dog = ["Pup", "Canine", "Wolf"] 
var Ball = ["Frisbee", "Stick", "Car"] 


AllWords.replace("Dog", withString: Dog.randomItem()).replace("Ball", withString: Ball.randomItem()) 

maintext.text = AllWords // You need set the textview's text here 

如果还是失败,尝试设置文本时,在主线程跳回:

dispatch_async(dispatch_get_main_queue(), {() -> Void in 
    maintext.text = AllWords 
}) 
+0

谢谢!变量这有帮助。不幸的是,当我按下按钮时,我仍然没有收到任何新的文本。 –

+0

打印'AllWords'。它是否包含您期望的价值?唯一能够想到的其他想法是将'maintext.text = AllWords'行包装在'dispatch_async'块中,以防您离开主线程。 – JAL

+0

查看我的答案更新并尝试'dispatch_async'块。 – JAL

0

类型String斯威夫特是一种值类型,意味着任何更改都会创建String的新实例。

文本视图的字符串保持不变。

打完更换任务,您必须将值重新分配给文本视图

maintext.text = AllWords 

PS:请写明与第一小写字母

相关问题