iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
0

還記得第一個頁面右下角的橘色十字按鈕嗎?忘記了就算了,剛好回頭再看看我的文章幫我刷刷點閱率!!
今天開始實作這顆十字按鈕的功能,我想你要知道,這顆按鈕按下去之後的行為,來人!上圖!
按下新增按鈕後的動作


就如你所看到的動圖,按下新增按鈕後看似簡單的行為,背後隱藏著許多秘密,咱們來一一拆分。

  • 1.首先跳出提示視窗(UIAlertController)
  • 2.UIAlertController內有兩個文字輸入框(UITextField)
  • 3.有兩個按鈕(UIAlertAction),分別是取消與確認
  • 4.點擊確認後,資料被顯示在表格上,表格昨天已經做出來了,萬事俱備,只欠資料。

提示視窗需要使用程式碼產生,由於我們是因為點擊新增按鈕才跳出視窗,所以照理來說應該寫在新增按鈕的程式碼內,就是你第一天拉@IBAction的程式碼區塊

 @IBAction func addList(_ sender: UIButton) {

    }

如果你覺得addList這個名字不好,不吉利,那你可以改成你喜歡的名字,但是最好一開始設定時就設定好,因為更改很容易出錯,如果真的要改,按著command鍵,點擊你要改的那個名字,選Rename,就可以改了。

但是由於我的提示視窗內有兩個文字框,兩個按鈕,很多吶,我不想要這些東西塞滿我的addList的func,所以我另外寫一個func來包這些東西。

 func creatAlert(alertTitle: String, alertMessage: String, actionTitle: String, cancleTitle: String, indexPath: IndexPath?)
    {
    }

這是我定義的func,之後只要有人想要產生一個擁有兩個文字框兩個按鈕的UIAlertController,只要呼叫這個方法就好,當然是樣子長這樣,內部的詳細程式碼等我娓娓道來。


首先說明各個參數是幹什麼東西的:

  • alertTitle: UIAlertController的標題
  • alertMessage: UIAlertController的顯示訊息
  • actionTitle: 確認按鈕的文字
  • cancleTitle: 取消按鈕的文字
  • indexPath: 我用來儲存索引值屬性,主要是為了插入資料時會使用到。

所以當我在呼叫這個creatAlert方法時,如果要有下圖顯示的樣子,呼叫的程式碼會長這樣子。
https://ithelp.ithome.com.tw/upload/images/20200820/20129144rMUBokoQfx.png

@IBAction func addList(_ sender: UIButton) {
        creatAlert(alertTitle: "新增", alertMessage: "要幹啥子?", actionTitle: "確認", cancleTitle: "取消", indexPath: nil)
    }

你可能會問,文字框裡面怎麼會有顏色較淡的字,褪色嗎? 不! 那是提示字元(placeholder),就是跟使用者說這個文字框要你輸入什麼資料,至於怎麼做,那就是creatAlert方法內部要實作的事情了,接著往下看。


接著開始creatAlert內部實作。

回到我一開始講的需要哪些實作,首先你要有一個UIAlertController,到creatAlert方法內輸入以下程式碼:

    let alert = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .alert)
    //style為cancel的Action,不論添加順序怎樣,都是在最下面或最左面,不能改
    let cancleAction = UIAlertAction(title: cancleTitle, style: .cancel, handler: nil)
    let okAction = UIAlertAction(title: actionTitle, style: .destructive, handler: nil)
     alert.addTextField { (titleTF) in
            titleTF.placeholder = "想幹點啥??"
        }
     alert.addTextField { (subtitleTF) in
            subtitleTF.placeholder = "啥時去做??"
        }
     alert.addAction(okAction)
     alert.addAction(cancleAction)
     present(alert, animated: true, completion: nil)

現在你的creatAlert方法應該長得要像這樣子,如果沒有,找找看從哪裡開始長歪了。

 func creatAlert(alertTitle: String, alertMessage: String, actionTitle: String, cancleTitle: String, indexPath: IndexPath?)
    {
        let alert = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .alert)
        //style為cancel的Action,不論添加順序怎樣,都是在最下面或最左面,不能改
        let cancleAction = UIAlertAction(title: cancleTitle, style: .cancel, handler: nil)
        
        let okAction = UIAlertAction(title: actionTitle, style: .destructive){ (action) in
        }
        
        //初始化一個文字框,並且加入到提示控制器
        alert.addTextField { (titleTF) in
            titleTF.placeholder = "想幹點啥??"
        }
        alert.addTextField { (subtitleTF) in
            subtitleTF.placeholder = "啥時去做??"
        }
        //剛剛一開始做的UIAlertAction也要加入到UIAlertController內
        alert.addAction(okAction)
        alert.addAction(cancleAction)
        //UIAlertController所需的元件都加完之後,還要把UIAlertController推送出來,這樣才是你看到的那個彈出視窗。
        present(alert, animated: true, completion: nil)
    }

這個時候開啟模擬器,run一下,點選新增按鈕,你會發現什麼事都沒發生,因為按鈕做好了,方法也做好了,但是按鈕並沒有跟方法連結啊,點選新增按鈕並沒有呼叫方法,當然沒反應,現在讓按鈕呼叫creatAlert方法:

 @IBAction func addList(_ sender: UIButton) {
        creatAlert(alertTitle: "新增", alertMessage: "要幹啥子?", actionTitle: "確認", cancleTitle: "取消", indexPath: nil)
    }

此時完成目標1-3了,點選按鈕就有一個UIAlertController了,並且帶有兩個文字輸入框與兩個按鈕,但是由於我只是把介面做出來,目前點選確認,是不會有任何反應的。
https://ithelp.ithome.com.tw/upload/images/20200821/20129144h5dVKQUc6I.png


我們開始來做確認按鈕按下去之後的事情吧,目前先做點選確認把資料儲存到資料模型,表格才有資料可以顯示。

把一開始打輸入的okAction刪除,並且重新輸入一次,當你打到圖片上這個地方時,按下enter。
https://ithelp.ithome.com.tw/upload/images/20200821/20129144XHAdjoeyT3.png


你會發現程式碼變成這樣,這是一個閉包,閉包的概念較為複雜,大致上來講就是裡面包含了當你按下這個okAction時所要執行的程式碼,如果想對閉包有更深的了解,網路上有許多大神的教學,都可以參考看看。
https://ithelp.ithome.com.tw/upload/images/20200821/20129144LyDKCRNpFY.png


首先我想要取得兩個textField輸入文字的資料,並且儲存到一開始創建的資料模型內,並且在之後將目前新增的資料顯示在表格:

 if let text0 = alert.textFields?[0].text, let text1 = alert.textFields?[1].text
            {
                let totalText = ListModel(title: text0, subtitle: text1)
                if alertTitle == "新增"
                {
                    self.listDatas.insert(totalText, at: 0)
                    self.toDoListTableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .top)
                }
            }

我想你對於這行程式碼可能看不懂,沒關係,這行主要用意是將我新增的資料,插入在第0個段落的第0筆資料,也就是表格的最上面。

self.toDoListTableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .top)

現在點選新增按鈕,並且輸入資料點下確認後,你的表格應該要有資料了。
按下新增按鈕後可以顯示資料了
恭喜你完成到現在的階段,也恭喜我撐到第三天了!!


上一篇
Day2-建立資料模型並實作表格清單
下一篇
Day4-實作To-Do-List之刪除、插入
系列文
想知道自己iOS具現化系能力有多強嗎?實作幾個App就知道了30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言