iOS HW結合圖片、文字、button 的 UIKit IBAction 練習題-故事喵喵0831

本周作業練習:

1.使用IBAction與IBOutlet

2.加入TextField讓可以讀取TextField內的文字

3.結合之前教的,念出上面的故事

4.清除文字

5.讓鍵盤消失

6.運用if判斷是否有輸入文字

傳說中的《一千零一夜》,又稱《天方夜譚》,是一部以阿拉伯語編纂的中東民間故事,所以我希望能藉由這個程式,能自動產生1001個不同的故事,滿足給愛聽故事的小朋友、大朋友。

於是發想了這個架構,設定男主角、女主角、場景、動作1和動作2,來做為本次的架構。

先來看成果-故事喵喵:

如果剛好都沒填資料的話,會出現紅字提醒。

先請AI幫忙寫故事劇本

關鍵字:小飛俠、小紅帽、森林、游泳、購物,大約產生150字內的劇本,文字再做一些精簡。

程式碼參考:

  1. 拉6個IBOoutlet,其中5個是TextField、另1個是顯示故事劇本的TextView。
  2. 加上收起鍵盤、停止語言的指令。
  3. 在IBAction設定裡面每一個內容,把它結合故事劇本。
  4. 加上之前學的發聲器,雖然才剛學完,等到寫程式又會小小的忘記一下。要記得寫在class下,不要寫在func裡面。
import UIKit
import AVKit
import AVFoundation
import AVFAudio

class ViewController: UIViewController {
//建立發聲器不能在函數裡面
let synthesizer = AVSpeechSynthesizer()


@IBOutlet weak var storyTextView: UITextView!
@IBOutlet weak var do2TextField: UITextField!
@IBOutlet weak var doTextField: UITextField!
@IBOutlet weak var spaceTextField: UITextField!
@IBOutlet weak var girlTextField: UITextField!
@IBOutlet weak var boyTextField: UITextField!


//收起鍵盤
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}



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


//停止語音
func stopSpeak(){
synthesizer.stopSpeaking(at: .immediate)
}

@IBAction func speak(_ sender: Any) {

if boyTextField.text == ""{
boyTextField.text = "你不輸入帥帥的男主角嗎?"
boyTextField.textColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1)
}

if girlTextField.text == ""{
girlTextField.text = "幫美美的女主角命名吧"
girlTextField.textColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1)
print(girlTextField.text!)
}


if spaceTextField.text == ""{
spaceTextField.text = "請輸入天馬行空的場景"
spaceTextField.textColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1)
print(spaceTextField.text!)
}
if doTextField.text == ""{
doTextField.text = "要有動作1才能編故事"
doTextField.textColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1)
print(doTextField.text!)
}
if do2TextField.text == ""{
do2TextField.text = "動作2可以延續故事內容"
do2TextField.textColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1)
print(do2TextField.text!)
}
else {
stopSpeak()
let storyText = ( "\(boyTextField.text!)在森林中散步,遇到了\(girlTextField.text!)。她正準備前往外婆家,却迷路。\(boyTextField.text!)决定幫助她,提議用小飛機載她去。然而,突然發現一個隱藏的\(spaceTextField.text!)。兩人忍不住跳入\(spaceTextField.text!)中\(doTextField.text!),享受著美麗的風景。之後,他們在\(spaceTextField.text!)邊緣發現了市集,裡面賣各種美味點心和有趣小物。他們開心的\(do2TextField.text!),最後也順利地飛到\(girlTextField.text!)的外婆家。")

storyTextView.text = storyText
print(storyText)

//語音
let utterence = AVSpeechUtterance(string:storyText)
utterence.voice = AVSpeechSynthesisVoice(language: "zh-TW")
utterence.rate = 0.5
synthesizer.speak(utterence)

}

}
@IBAction func clean(_ sender: Any) {
//清除
stopSpeak()
storyTextView.text = ""
print("")
boyTextField.text = ""
girlTextField.text = ""
spaceTextField.text = ""
doTextField.text = ""
do2TextField.text = ""

}

}

心得

  1. 平常看老師教的、同學做的案例感覺都很簡單,但是…等到自己做的時候,又發現真的問題一堆,時常程式哪裡有問題或是效果怎麼沒出來,真的自己動手做學得比較快,做中學。
  2. 每一個作業仔細做的話,其實都有一點像是一個小專案,從規劃發想、程式設計、美術風格…等,都還蠻有挑戰性的,做完也很有心得,也會挑戰希望下次可以做得更好。
  3. 這次花一天的時間,終於做完,下午寫程式、晚上做美編,美編的部分有花一點心思希望有達成自以為的視覺美感,也或許免強有做到,哈。
  4. 後來發現每次寫作業的時候,我設定的Project和Playground都是以日期來區分,包括資料夾設定也是,後來發現這樣不好,因為要找過去做過的專案時,會搞不清楚哪一個是哪一個,搞得很頭大,後續還是要設定一個英文名稱比較好,再加上日期,做好檔案的分類,不然花一堆時間要找之前寫過的某段程式碼會很累。

--

--