在寫swift你應該不難發現,ViewController裡的程式碼非常肥大,這是不意外的,因為
這是非常糟糕的,因為程式碼在維護上會有更大的成本。更非常不利於協作專案。
因此利用純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 供大家參考一下:
首先要在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出來。
我在代理的延展裡,使用了一個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)
}
這是非常重要的架構,由於delegate是屬於邏輯方面的運用,我會讓他在controller代理。另外dataSource是利用資料來源做成畫面,所以我會把它放在view的類別裡面。