iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
0
自我挑戰組

打造專案管理 iOS App 系列 第 8

安能取熊掌而舍魚? Swift 純 Code 之 view 與 controller分離

  • 分享至 

  • xImage
  •  

安能取熊掌而舍魚? Swift 純 Code 之 view 與 controller分離

在寫swift你應該不難發現,ViewController裡的程式碼非常肥大,這是不意外的,因為

view與controller,全部都混在一起

這是非常糟糕的,因為程式碼在維護上會有更大的成本。更非常不利於協作專案。
因此利用純code的方式,把view從controller分離出來。現在我們可以更加容易的閱讀程式碼。
首先我們實例化一個view:

let userInformationView = UserInfoView()

並在loadView的funtion裡利用實例化取代自己的view:

override func loadView() {
        #warning("get")
        super .loadView()
        self.view = userInformationView
    }

loadView 這個Funtion 是viewController 生成的其中一個生命週期,在view 正在生成時會進入這個生命週期,因此我們會在生成view 時取代他。

如果view 有委託代理(delegate或是datasource)可以在取代view 前,運行代理:

photoController.delegate = self
        photoController.sourceType = .photoLibrary

在這邊運用UIImagePickerController 供大家參考一下:

UIImagePickerController 純code 生成

首先要在view 裡面實例化一個按鈕(UIButton)

private var albumButton:UIButton = {
        var button = UIButton(frame: CGRect(
            x: 0,
            y: 0,
            width: ScreenSize.width.value * 0.1,
            height: ScreenSize.width.value * 0.1))
        button.setImage(UIImage(systemName: "camera"), for: .normal)
        button.layer.cornerRadius = button.frame.height * 0.5
        button.addTarget(self, action: #selector(SetInfoVC.takeImage), for: .touchDown)
        button.backgroundColor = .gray
        return button
    }()

我在view 的class 裡,生成一個物件名為albumButton,製作一個開啟相簿的按鈕。

你會發現後面一個閉包,閉包提供裡初始會的資訊,這邊需要注意一個地方,addTarget設定了一個屬性,他指定了button的觸發對象,觸發事件,觸發對象。

觸發事件

    @objc func takeImage() {
        let photoController = UIImagePickerController()
        photoController.delegate = self
        photoController.sourceType = .photoLibrary
        present(photoController, animated: true, completion: nil)
    }

當按下按鈕時,會觸發這個事件,這個事件可以指定photoController的delegate,也可以指定他的sourceType,
我這邊要使用的是相簿的功能,因此我指定.photoLibrary
,接著present出來。

Extension delegate

我在代理的延展裡,使用了一個funtion
在didFinishPickingMediaWithInfo,我選取了相簿裡的一個對象要觸發的運用。

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[.originalImage] as? UIImage{
            setInfoView.setPhoto(userImage: image)
        }

        self.view = setInfoView
        dismiss(animated: true, completion: nil)
    }

Controller與View分明

這是非常重要的架構,由於delegate是屬於邏輯方面的運用,我會讓他在controller代理。另外dataSource是利用資料來源做成畫面,所以我會把它放在view的類別裡面。


上一篇
安能取熊掌而舍魚? 簡易工廠
下一篇
安能取熊掌而捨魚 SnapKit
系列文
打造專案管理 iOS App 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言