[Swift] 便利な機能拡張 UIViewController編

iOS

Swiftでのアプリ開発で使える、便利な機能拡張をご紹介させて頂きます。

今回はUIViewController編です。

エラー表示

UIAlertControllerを使用して、1行でエラーなどのメッセージを表示させることができます。

コード

extension UIViewController {
	func showError(_ title: String, message: String) {
		let alert: UIAlertController = UIAlertController(title: title, message: message, preferredStyle: .alert)
		
		let close = UIAlertAction(title: "閉じる", style: .default)
		
		alert.addAction(close)
		
		self.present(alert, animated: true, completion: {})
	}
}

使い方

self.showError("エラー", message: "読み込みに失敗しました。")

読み込みインジケーターの表示

データの読み込み処理中などに、他の操作ができないよう、読み込み中の画面を表示します。

コード

extension UIViewController {
	func showIndicator() {
		//黒い半透明の背景
		let viewBG = UIView(frame: self.view.frame)
		viewBG.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5)
		viewBG.tag = 99999 //タグが他のViewとかぶらないように注意!!
		
		viewBG.translatesAutoresizingMaskIntoConstraints = false
		
		self.view.addSubview(viewBG)
		
		//背景をViewControllerのViewのサイズに合わせる
		viewBG.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
		viewBG.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
		viewBG.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
		viewBG.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
		
		//インジケーター
		let indicator = UIActivityIndicatorView()
		
		if #available(iOS 13.0, *) {
			//iOS13以上の場合
			indicator.style = .large
			indicator.color = .white
		} else {
			//iOS12以下の場合
			indicator.style = .whiteLarge
		}
		
		indicator.translatesAutoresizingMaskIntoConstraints = false

		viewBG.addSubview(indicator)
	
		//インジケーターを画面中央に配置
		indicator.centerXAnchor.constraint(equalTo: viewBG.centerXAnchor).isActive = true
		indicator.centerYAnchor.constraint(equalTo: viewBG.centerYAnchor).isActive = true
		
		indicator.startAnimating()
	}
	
	func removeIndicator() {
		//設定したtagを元に読み込み画面を削除
		if let view = self.view.viewWithTag(99999) {
			view.removeFromSuperview()
		}
	}
}

使い方

func onStartLoading() {
		//読み込みを開始
		self.showIndicator()
		
		//読み込みの処理などを記載
		DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
			//読み込み終了
			self.removeIndicator()
		}
}

その他随時追加予定…

タイトルとURLをコピーしました