๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
๋ฌธ์
๋์ ํ๋ฉด์ '๋ฉ์ธํ๋ฉด'๊ณผ '์์ ํ๋ฉด' ๋ ๊ฐ๋ก ๋ง๋ ๋ค. ๋ํ '๋ฉ์ธํ๋ฉด'์์ '์์ ํ๋ฉด'์ผ๋ก, '์์ ํ๋ฉด'์์ '๋ฉ์ธํ๋ฉด'์ผ๋ก ๋ฉ์์ง(๋ฐ์ดํฐ)๋ฅผ ์ ๋ฌํ ์ ์๊ฒ ํ๊ณ ์ด๋ฏธ์ง์ ํ๋ ์ฌ๋ถ๋ฅผ '์์ ํ๋ฉด'์์ ์ ์ดํ ์ ์๋๋ก ํ๋ค.
๊ตฌํ ์์
- ๋ด๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ ์ถ๊ฐ
- '๋ฉ์ธํ๋ฉด' ๋ ์ด์์ ๊ตฌ์ฑ
- '์์ ํ๋ฉด' ์ถ๊ฐ ๋ฐ ๋ ์ด์์ ๊ตฌ์ฑ
- ๋ทฐ ์ ํ๊ณผ ํจ๊ป ๋ฉ์์ง ์ ๋ฌํ๊ธฐ
- '์์ ํ๋ฉด'์์ '๋ฉ์ธํ๋ฉด'์ ์ด๋ฏธ์ง ์ ์ดํ๊ธฐ
์ต์ข ๊ฒฐ๊ณผ
4. ๋ทฐ ์ ํ๊ณผ ํจ๊ป ๋ฉ์์ง ์ ๋ฌํ๊ธฐ
4.1. ์์ธ๋ ๋ณ์์ ์ก์ ํจ์ ์ถ๊ฐํ๊ธฐ
'๋ฉ์ธํ๋ฉด'
@IBOutlet var txMessage: UITextField!
@IBOutlet var imgView: UIImageView!
- Text Field์ ์ ํ ๋ฉ์์ง๋ฅผ ํ์ธ ๋ฐ ์ค์ ํ๊ธฐ ์ํ text ์์ฑ ์ฌ์ฉ ์์
- imageView์ ํ๋ ๋ฐ ์ถ์ ์์ฑ ์ ์ด ๋ชฉ์
'์์ ํ๋ฉด'
@IBOutlet var txMessage: UITextField!
@IBOutlet var swIsOn: UISwitch!
...
@IBAction func btnDone(_ sender: UIButton) {
}
- Text Field์ ์ ํ ๋ฉ์์ง๋ฅผ ํ์ธ ๋ฐ ์ค์ ํ๊ธฐ ์ํ text ์์ฑ ์ฌ์ฉ ์์
- switch ์ํ ํ์ธ ๋ฐ ์ค์ ๋ชฉ์
- '์๋ฃ' ๋ฒํผ ํด๋ฆญ์ ํ๋ฉด ์ ํ ๋ฐ ๋ฐ์ดํฐ ์ ๋ฌ ๋ชฉ์
4.2 '๋ฉ์ธํ๋ฉด' -> '์์ ํ๋ฉด' ๋ฐ์ดํฐ ์ ๋ฌ
'๋ฉ์ธํ๋ฉด'์์ prepareํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ EditMissionViewController, ์ฆ '์์ ํ๋ฉด'์ ๋์ฐฉ ์ธ๊ทธ์จ์ด๋ก ์ค์ ํ๋ค.
๊ทธ ํ '๋ฉ์ธํ๋ฉด'์ Text Field์ ๊ฐ์ '์์ ํ๋ฉด'์ ๋ณ์์ ํ ๋นํ๋ค. '์์ ํ๋ฉด'์์๋ ๋ณ์์ ๊ฐ์ Text Field์ ํ ๋นํ๋ค.
EditMissionViewController
'๋ฉ์ธํ๋ฉด'์์ Text Field์ text๋ฅผ ์ง์ ์ ์ดํ ์ ์์ผ๋ฏ๋ก ๋ณ์๋ฅผ ์์ฑํด '๋ฉ์ธํ๋ฉด'์์ ํด๋น ๋ณ์๋ฅผ ์ ์ดํ ์ ์๋๋ก ํ๋ค.
class EditMissionViewController: UIViewController {
var textMessage: String = ""
//'๋ฉ์ธํ๋ฉด'์์ Text Field์ text๋ฅผ ์ง์ ์ ์ดํ ์ ์์ผ๋ฏ๋ก ๋ณ์๋ฅผ ์์ฑํด
//'๋ฉ์ธํ๋ฉด'์์ ํด๋น ๋ณ์๋ฅผ ์ ์ดํ ์ ์๋๋ก ํ๋ค.
...
}
'๋ฉ์ธํ๋ฉด'์์ '์์ ํ๋ฉด'์ผ๋ก์ ํ๋ฉด ์ ํ๊ณผ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํด prepare ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ๋ค.
prepare ํจ์ : ํด๋น ์ธ๊ทธ์จ์ด๊ฐ ํด๋น ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก ์ ํ๋๊ธฐ ์ง์ ์ ํธ์ถ๋๋ ํจ์์ด๋ฉฐ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํด ์ฌ์ฉํ๋ค.
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
์คํ ๋ฆฌ๋ณด๋์์ ํ๋ฉด ์ ํ ์ , ์์ ์ค๋น๋ฅผ ์ํ ๊ฒ์ด๋ค.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
segue.destination๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ฐ์ ธ์จ๋ค. ๋ทฐ ์ ํ
// Pass the selected object to the new view controller.
์ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก ์ ํ๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ค. ๋ฐ์ดํฐ ์ ๋ฌ
}
//ํด๋น ์ธ๊ทธ์จ์ด๊ฐ ํด๋น ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก ์ ํ๋๊ธฐ ์ง์ ์ ํธ์ถ๋๋ ํจ์์ด๋ฉฐ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํด ์ฌ์ฉํ๋ค.
//'๋ฉ์ธํ๋ฉด'-> '์์ ํ๋ฉด' ํ๋ฉด ์ ํ ๋ฐ ๋ฐ์ดํฐ ์ ๋ฌ
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let editMissionViewController = segue.destination as! EditMissionViewController
//์ธ๊ทธ์จ์ด์ ๋์ฐฉ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ EditMissionViewController๋ก ํ๋ค.
editMissionViewController.textMessage = txMessage.text!
}
4.3 '์์ ํ๋ฉด' -> '๋ฉ์ธํ๋ฉด' ํ๋ฉด ์ ํ ๋ฐ ๋ฐ์ดํฐ ์ ๋ฌ
ํ๋กํ ์ฝ ํํ์ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ถ๊ฐํ์ฌ ๋ฐ์ดํฐ ์ ๋ฌ์ ํด๋ณด์
didMessageEditDone ํจ์๋ '์์ ํ๋ฉด'์์ ๋ฉ์์ง๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ํ์ฌ ํจ์๋ฅผ ํธ์ถํ๋ฉด '๋ฉ์ธํ๋ฉด'์ ๊ตฌํ๋์ด ์๋ didMessageEditDone ํจ์๊ฐ ์๋ตํ์ฌ ์ด ๋ฉ์์ง์ ๋ฌธ์์ด ๊ฐ์ '๋ฉ์ธํ๋ฉด'์ ํ ์คํธ ํ๋์ ํ ์คํธ๋ก ๋ณด์ฌ์ค๋ค.
์ฆ, '์์ ํ๋ฉด'์์ '๋ฉ์ธํ๋ฉด'์ผ๋ก ๋ฐ์ดํฐ ์ ๋ฌํ๋ค.
import UIKit
protocol EditMissionDelegate {
//EditViewController์์ ํจ์๋ฅผ ํธ์ถํ๋ฉฐ ๋ฉ์์ง๋ฅผ ์ ๋ฌํด ์ฃผ๋๋ฐ, ์ด ๋ฉ์์ง์ ๋ฌธ์์ด ๊ฐ์ '๋ฉ์ธํ๋ฉด'์ ํ
์คํธ ํ๋์ ํ
์คํธ๋ก ๋ณด์ฌ์ค๋ค.
//์ฆ, '์์ ํ๋ฉด'์์ '๋ฉ์ธํ๋ฉด'์ผ๋ก ๋ฐ์ดํฐ ์ ๋ฌ
func didMessageEditDone(_ controller: EditMissionViewController, message: String)
}
class EditMissionViewController: UIViewController {
...
}
'๋ฉ์ธํ๋ฉด'์ didMessageEditDone ํจ์๋ฅผ ๊ตฌํํ๊ธฐ ์ , EditMissionDelegate ํ๋กํ ์ฝ์ ๋จผ์ ์ฑํํ๋ค. ๊ทธ ํ didMessageEditDone ํจ์์ Text Field์ text์ ์ ๋ฌ ์ธ์๋ฅผ ํ ๋นํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
class NavigationMissionViewController: UIViewController, EditMissionDelegate {
...
func didMessageEditDone(_ controller: EditMissionViewController, message: String) {
txMessage.text = message
}
...
}
+ ํ๋กํ ์ฝ์ ๋ํ ๊ฐ๋จํ ์ค๋ช
https://88yhtserof.tistory.com/23?category=954886
'๋ฉ์ธํ๋ฉด'์ ๊ตฌํ๋์ด ์๋ didMessageEditDoneํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด prepare ํจ์์์ ๋์ฐฉ ์ธ๊ทธ์จ์ด, ์ฆ editMissionVieController('์์ ํ๋ฉด')์ ์ ์ธ๋ ๋ณ์ delegate์ self๋ฅผ ํ ๋นํ๋ค. ๊ทธ ๋ง์ NavigationMissionViewController('๋ฉ์ธํ๋ฉด')๋ฅผ ํ ๋นํ๋ค๋ ๋ง์ด๋ค.
class NavigationMissionViewController: UIViewController, EditMissionDelegate {
...
//ํด๋น ์ธ๊ทธ์จ์ด๊ฐ ํด๋น ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก ์ ํ๋๊ธฐ ์ง์ ์ ํธ์ถ๋๋ ํจ์์ด๋ฉฐ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํด ์ฌ์ฉํ๋ค.
//'๋ฉ์ธํ๋ฉด'-> '์์ ํ๋ฉด' ํ๋ฉด ์ ํ ๋ฐ ๋ฐ์ดํฐ ์ ๋ฌ
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let editMissionViewController = segue.destination as! EditMissionViewController //์ธ๊ทธ์จ์ด์ ๋์ฐฉ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ EditMissionViewController๋ก ํ๋ค.
editMissionViewController.textMessage = txMessage.text!
editMissionViewController.delegate = self
}
...
}
'๋ฉ์ธํ๋ฉด'์์ '์์ ํ๋ฉด'์ผ๋ก ํ๋ฉด ์ ํ์ ํ ๋, delegate๋ฅผ NavigationMissionViewController('๋ฉ์ธํ๋ฉด')๋ฅผ ํ ๋นํ๊ธฐ ๋๋ฌธ์ '์์ ํ๋ฉด'์์ '๋ฉ์ธํ๋ฉด'์ ๊ตฌํ๋ didMessageEditDoneํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
'์์ ํ๋ฉด'์์ '์๋ฃ' ๋ฒํผ ํด๋ฆญ ์ '๋ฉ์ธํ๋ฉด'์ผ๋ก ์ ํํ๋๊น, '์๋ฃ' ๋ฒํผ์ ์ก์ ํจ์์ธ btnDone์ didMessageEditDoneํจ์๋ฅผ ์ฌ์ฉํ๋ค.
class EditMissionViewController: UIViewController {
var textMessage: String = "" //'๋ฉ์ธํ๋ฉด'์์ Text Fielf์ text๋ฅผ ์ง์ ์ ์ดํ ์ ์์ผ๋ฏ๋ก ๋ณ์๋ฅผ ์์ฑํด '๋ฉ์ธํ๋ฉด'์์ ํด๋น ๋ณ์๋ฅผ ์ ์ดํ ์ ์๋๋ก ํ๋ค.
var delegate:EditMissionDelegate?
@IBOutlet var txMessage: UITextField!
@IBOutlet var swIsOn: UISwitch!
...
@IBAction func btnDone(_ sender: UIButton) {
if delegate != nil {
delegate!.didMessageEditDone(self, message: txMessage.text!)
}
_ = navigationController?.popViewController(animated: true)
//๋ด๋น๊ฒ์ด์
์คํ์์ top ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ญ์ ํ ๋ฐํํ๋ค(pop). ๊ทธ๋ฆฌ๊ณ ํ๋ฉด์ ๊ฐฑ์ ํ๋ค.
//์์ผ๋ ์นด๋ ์๋ณ์๋ ๋ฐํ๊ฐ์ ์์ง๋ง ์ฌ์ฉํ์ง ์์ ๋ ์ฌ์ฉํ๋ค
}
...
}
'์์ ํ๋ฉด'์์ '๋ฉ์ธํ๋ฉด'์ผ๋ก์ ์ ํ์ ์ํด navigationController?.popViewController()๋ฅผ ์ฌ์ฉํ๋ค.
func popViewController(animated: Bool) -> UIViewController?
->> Pops the top view controller from the navigation stack and updates the display.
๋ด๋น๊ฒ์ด์ ์คํ์์ top ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ญ์ ํ ๋ฐํํ๋ค(pop). ๊ทธ๋ฆฌ๊ณ ํ๋ฉด์ ๊ฐฑ์ ํ๋ค.
์ฌ๊ธฐ์ ์์ผ๋ ์นด๋ ์๋ณ์๋ ๋ฐํ๊ฐ์ ์์ง๋ง ๊ทธ ๋ฐํ๊ฐ์ ์ฌ์ฉํ์ง ์์ ๋ ์ฌ์ฉํ๋ค.
5. '์์ ํ๋ฉด'์์ '๋ฉ์ธํ๋ฉด'์ ์ด๋ฏธ์ง ์ ์ดํ๊ธฐ
5.1 '๋ฉ์ธํ๋ฉด'์์์ ์ด๋ฏธ์ง ์ํ๋ฅผ '์์ ํ๋ฉด'์ ์ ๋ฌํ๊ธฐ
'๋ฉ์ธํ๋ฉด'์์ '์์ ํ๋ฉด'์ switch๋ฅผ ์ง์ ์ ์ผ๋ก ์ ์ดํ ์ ์์ผ๋ฏ๋ก, '์์ ํ๋ฉด'์ switch ์ํ ์ฌ๋ถ๋ฅผ ์ ์ฅํ 'isZoom' ๋ณ์๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ viewDidLoad()ํจ์์์ switch.isOn์ 'isZoom' ๋ณ์๋ฅผ ํ ๋นํ๋ค.
class EditMissionViewController: UIViewController {
...
var isZoom: Bool = false //'๋ฉ์ธํ๋ฉด'์์ '์์ ํ๋ฉด'์ switch๋ฅผ ์ง์ ์ ์ดํ ์ ์์ผ๋ฏ๋ก ๋ณ์๋ฅผ ์์ฑํด '๋ฉ์ธํ๋ฉด'์์ ํด๋น ๋ณ์๋ฅผ ์ ์ดํ ์ ์๋๋ก ํ๋ค.
@IBOutlet var txMessage: UITextField!
@IBOutlet var swIsOn: UISwitch!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
txMessage.text = textMessage//๋ณ์ message๊ฐ์ txMessage์ text์ ํ ๋นํด ์ถ๋ ฅ๋๋๋ก ํ๋ค.
swIsOn.isOn = isZoom
}
...
}
๊ทธ ํ '๋ฉ์ธํ๋ฉด'์์๋ 'isZoom' ๋ณ์๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ prepare ํจ์์์, '๋ฉ์ธํ๋ฉด'์ 'isZoom' ๋ณ์๊ฐ์ '์์ ํ๋ฉด'์ 'isZoom'์ ํ ๋นํ๋ค.
class NavigationMissionViewController: UIViewController, EditMissionDelegate {
let scale: CGFloat = 2.0
var newWidth: CGFloat = 0.0
var newHeight: CGFloat = 0.0
var isZoom:Bool = false
@IBOutlet var txMessage: UITextField!
@IBOutlet var imgView: UIImageView!
...
//ํด๋น ์ธ๊ทธ์จ์ด๊ฐ ํด๋น ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก ์ ํ๋๊ธฐ ์ง์ ์ ํธ์ถ๋๋ ํจ์์ด๋ฉฐ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํด ์ฌ์ฉํ๋ค.
//'๋ฉ์ธํ๋ฉด'-> '์์ ํ๋ฉด' ํ๋ฉด ์ ํ ๋ฐ ๋ฐ์ดํฐ ์ ๋ฌ
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let editMissionViewController = segue.destination as! EditMissionViewController //์ธ๊ทธ์จ์ด์ ๋์ฐฉ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ EditMissionViewController๋ก ํ๋ค.
editMissionViewController.textMessage = txMessage.text!
editMissionViewController.isZoom = isZoom
editMissionViewController.delegate = self
}
...
}
5.2 '์์ ํ๋ฉด'์์์ ์ด๋ฏธ์ง ์ํ๋ฅผ '๋ฉ์ธํ๋ฉด'์ ์ ๋ฌํ๊ธฐ
'์์ ํ๋ฉด'์์ '๋ฉ์ธํ๋ฉด'๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ธฐ ์ํด ํ๋กํ ์ฝ ํํ์ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์์ฑํ๋ค. (didImageZoomDone)
didImageZoomDone ํจ์๋ ์ด๋ฏธ์ง์ ํ๋ ์ฌ๋ถ๋ฅผ ๋ํ๋ผ isZoom์ ๋งค๊ฐ๋ณ์๋ก ๊ฐ๋๋ค.
import UIKit
protocol EditMissionDelegate {
//์์ ํ๋ฉด'์์ '๋ฉ์ธํ๋ฉด'์ผ๋ก ๋ฐ์ดํฐ ์ ๋ฌ
func didMessageEditDone(_ controller: EditMissionViewController, message: String)
func didImageZoomDone(_ controller: EditMissionViewController, isZoom: Bool)
}
class EditMissionViewController: UIViewController {
...
}
'๋ฉ์ธํ๋ฉด'์ didImageZoomDone ํจ์๋ฅผ ๊ตฌํํ๋ค. isZoom ์ ๋ฌ ์ธ์๋ฅผ '๋ฉ์ธํ๋ฉด'์ ๋ณ์์ธ isZoom์ ํ ๋นํ๋ค. ์ฆ, '์์ ํ๋ฉด'์์ '๋ฉ์ธํ๋ฉด'์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๊ฒ์ด๋ค.
์ ๋ฌ์ธ์ isZoom์ด true์ธ ๊ฒฝ์ฐ ํ๋๋ฅผ, false์ธ ๊ฒฝ์ฐ ์ถ์๋ฅผ ํ๋ค.
class NavigationMissionViewController: UIViewController, EditMissionDelegate {
let scale: CGFloat = 2.0
var newWidth: CGFloat = 0.0
var newHeight: CGFloat = 0.0
var isZoom:Bool = true
...
func didImageZoomDone(_ controller: EditMissionViewController, isZoom: Bool) {
//'๋ฉ์ธํ๋ฉด'์ ๋ณ์์ธ isZoom์ ์ ๋ฌ์ธ์ isZoom์ ํ ๋น
if isZoom {
newWidth = imgView.frame.width*scale
newHeight = imgView.frame.height*scale
self.isZoom = true
}else {
newWidth = imgView.frame.width/scale
newHeight = imgView.frame.height/scale
self.isZoom = false
}
imgView.frame.size = CGSize(width: newWidth, height: newHeight)
}
...
}
'์์ ํ๋ฉด'์์, switch ์ก์ ํจ์์ OnOff์ ๋ฐ๋ผ isZoom ๋ณ์์ ๊ฐ์ด ๊ฒฐ์ ๋๊ฒ ํ๋ค.
class EditMissionViewController: UIViewController {
...
@IBAction func swImageZoom(_ sender: UISwitch) {
if sender.isOn {
isZoom = true
}else {
isZoom = false
}
}
...
}
'์์ ํ๋ฉด'์์ '๋ฉ์ธํ๋ฉด'์ผ๋ก ๋์ด๊ฐ๋ ๋ฒํผ์ธ '์๋ฃ' ๋ฒํผ์ ์ก์ ํจ์์ didImageZoomDone ํจ์๋ฅผ ํธ์ถํ๋ค.
class EditMissionViewController: UIViewController {
...
@IBAction func btnDone(_ sender: UIButton) {
//์ฌ๊ธฐ์ delegate๋ '๋ฉ์ธํ๋ฉด'์ ์๋ฏธ
if delegate != nil {
delegate?.didMessageEditDone(self, message: txMessage.text!)
delegate?.didImageZoomDone(self, isZoom: isZoom)
}
_ = navigationController?.popViewController(animated: true)
//๋ด๋น๊ฒ์ด์
์คํ์์ top ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์ญ์ ํ ๋ฐํํ๋ค(pop). ๊ทธ๋ฆฌ๊ณ ํ๋ฉด์ ๊ฐฑ์ ํ๋ค.
//์์ผ๋ ์นด๋ ์๋ณ์๋ ๋ฐํ๊ฐ์ ์์ง๋ง ์ฌ์ฉํ์ง ์์ ๋ ์ฌ์ฉํ๋ค
}
...
}
๊ณต๋ถ ์๋ฃ
Do It! ์ค์ํํธ๋ก ์์ดํฐ ์ฑ ๋ง๋ค๊ธฐ ๊ฐ์ 5ํ
SWIFT ๋ฌธ์