iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0
自我挑戰組

來寫看看app好了! Swift探索之旅系列 第 6

Day#06 新增

前言

昨天已經在storyboard上將tableView連結上程式中的table,不過並沒有解釋到比較仔細原理的部分。今天回歸到controller程式面,因此會稍加解釋想要加上tableView的流程,與畫面/程式兩邊的邏輯。

ViewController

Table

@IBOutlet var table: UITableView!

這是在一開始我們就先寫在ViewController裡的。
其中的驚嘆號,回顧一下第2天的swift 101有討論到強制取值,這邊表示table在之後邏輯中,不需要再額外加上!就會自動取值。

而前綴@IBOutlet與待會使用到的@IBAction則是有以下的功能 :arrow_down:
IBOutlet:建立一個變數(Var),來存取或修改畫面上的元件(Object)。 IBAction:建立事件發生時所要執行的Function。不是每一個元件(Object)都可以拉Action,只有繼承UIControl的元件(Object)才可以建立Action,例如Label就無法建立,因為Label只是用來顯示,並不會有任何觸發動作
因此,我們昨天才可以將tableView跟viewController中的table bind起來。

Button

@IBAction func didTapAddButton()

那此時我們新增一個方法,希望點下右上方加號的時候可以進行新增的動作。

回到storyboard,如上,一樣的邏輯,我們可以右鍵點選畫面上方左邊的變數設定選項,進而將button與action連結。

more viewControllers: editing, deleting

除了新增,還有瀏覽、以及刪除的功能,因此我們再來新增兩個view controller。找到後直接拖拉到畫面中,或是click兩下/按下enter也可以。

相對應的,我們也要新增兩個view controller
可使用以下路徑去新增

File > New > > File > Cocoa Touch Class > Subclass of UIViewController

分別取名為如下

  • EntryViewController
  • ViewViewController

EntryViewController

import RealmSwift
import UIKit

class EntryViewController: UIViewController, UITextFieldDelegate {

除了繼承UIViewController,我們也加上UITextFieldDelegate,以使得text的委派對象成為自己。如此一來,當按下return鍵的時候,就可以離開鍵盤。

    var textField: UITextField!
    @IBOutlet var datePicker: UIDatePicker!
    
    private let realm = try! Realm()
    public var completionHandler: (() -> Void)?

接下來根據realm提供的官方方法進行default連線,拿到資料庫的reference
completionHandler要做的事是新增後讓list知道新增了一個item,然後重新拿資料。

    override func viewDidLoad() {
        super.viewDidLoad()

        textField.becomeFirstResponder()
        textField.delegate = self
    }

因為我們希望一新增的時候可以直接將游標指定到第一欄,因此在載入的時候就把textField設定為first responder。
也就是說,如果有多個textField,可以設定離開時將下一個textField指定為first responder。

接著,必須再實作一個方法textFieldShouldReturn,並resign first responder,當結束輸入的時候把keyboard拿掉。

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        
        return true
    }
    
    @IBAction func didTapSaveButton() {
        
    }
    
}

當然,也先把按下儲存按鈕的方法框寫起來。

結語

寫了約莫一週,原先以為一個簡單的to-do list兩天就可以做完XD
結果到了開發第5天連個基本的CRUD都還沒做出來,哈哈~
覺得mobile很多的工具我都不熟悉,因此現在只能看一個學一個,不知道如果當初選obj-c會發生什麼事情XDDD

明天會再回到storyboard,如果有任何文章上的建議,不管是我個人學習或開發上的,都歡迎留言給我。謝謝~(•͈⌔•͈⑅)

參考資源

  1. 『簡易說明Xcode』IBOutlet 和 IBAction,用 Text Field、Segmented Control與Switch說明示範
  2. #44 利用 becomeFirstResponder 練習鍵盤的顯示

上一篇
Day#05 Storyboard
下一篇
Day#07 新增(2)
系列文
來寫看看app好了! Swift探索之旅30

尚未有邦友留言

立即登入留言