๊ธฐ์กด ํ๋ก์ ํธ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๋ฉด์, ํ๋ก์ ํธ ๋ฐ ํด๋๋ช ์ ๋ฐ๊ฟ์ผ ํ ์ง ๊ณ ๋ฏผ
ํ๊ฒ
ContactManagerUI
์ ์๋ก ์ถ๊ฐํ๋ค๋ ๊ฒ์ ํ๋ก์ ํธ์ ๋ณ๋์ ์ ํ์ ๋ง๋ ๋ค๋ ๊ฒ์ด๋ฏ๋ก, ์คํ๋ ค ์ด๋ฆ์ ๊ฐ๊ฒ ๋ง์ถ๋ ค ํ ํ์๊ฐ ์์์ ๊นจ๋ฌ์ ํ๋ก์ ํธ ๋ฐ ํด๋๋ช ์ ์ง
Target
ํ๋์ ํ๊ฒ์ ํ๋์ ํ๋ก๋ํธ์ด๋ฉฐ, ํ๋ก์ ํธ ๋ด์ ์ฌ๋ฌ ๊ฐ์(= ๋ณ๊ฐ์) ํ๊ฒ(ํ๋ก๋ํธ)์ด ์กด์ฌํ ์ ์๋ค.
๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ Model์ธ
ContactManageSystem
์ ๋ฃ์์ง,ViewController
์ ๊ตฌํ ํด์ผํ ์ง์ ๋ํ ๊ณ ๋ฏผ
๋ฆฌ๋ทฐ์ด ์๊ฒฌ ๐ถ
๋๋ฏธ ๋ฐ์ดํฐ ์์ฒด๋ฅผ ์์์ฒ๋ผ ๋ง๋ค์ด์ ViewController์์ ์ฒ๋ฆฌํ๋๊ฒ ์ ๋ ๋ ๊น๋ํ ๊ฒ ๊ฐ์์! ์์์ฒ๋ผ ์ฐ๊ณ ๋์ค์ ์ ๊ฑฐํ๋ฉด ๋๋๊น์!โ ViewController
์ dummyData
๋ฅผ ์์๋ก ์ ์ธํ์ฌ ํด๊ฒฐ
MVC ํด๋์ ๋ฃ๊ธฐ ์ ๋งคํ ํ์ผ๋ค ์ฒ๋ฆฌ
๋ฆฌ๋ทฐ์ด ์๊ฒฌ ๐ถ
์ด ๋ถ๋ถ์ ์ ํด์ ธ์๋ ๋ต์ ์์ผ๋, ํ ๋ด์์ ์ฝ์ํด์ ํด๋๋ก ์ ๋ฆฌํด๋ ๊ด์ฐฎ์ต๋๋ค.MVC ํด๋ ๋ฐ์ผ๋ก ๋นผ๋๋ ๊ฒ๋ ์ข์ต๋๋ค.
LaunchScreen์ ๋ฐ๋ก ํด๋๋ก ๋ง๋๋ ๊ฒฝ์ฐ๋ ์๊ณ , AppConfiguration๊ณผ ๊ฐ์ด ํด๋๋ฅผ ๋ง๋ค์ด์ AppDelegate, SceneDelegate ํ์ผ์ ๋ฃ๊ธฐ๋ํฉ๋๋ค.
์ ๊ฐ ๋ง์๋๋ฆฐ ๋ถ๋ถ์ ์ฐธ๊ณ ๋งํ์๊ณ ํ์๊ณผ ๊ฐ์ด ์ด์ผ๊ธฐํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค:)
โ ์๋์ ๊ฐ์ด ํด๋๋ง ์งํ
- ๋๋ฏธ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ค๋ฉด ์ํ๋ ์์ ์ ์ญ์ ๊ฐ ํธํ๋๋ก ์์๋ก ๊ตฌํ
- ํด๋๋ง์ ์ ํด์ง ๊ฒ ์๊ธฐ ๋๋ฌธ์ ํ์๊ณผ ์์ํด์ ์ ํ๊ธฐ
.phonePad
๋ -์ ๋ ฅ์ ์ง์ํ์ง ์์ โ ์์ดํฐ ๊ธฐ๋ณธ์ฑ์ฒ๋ผ, ํ ์คํธํ๋์ ๊ฐ์ด ์ ๋ ฅ๋ ๋๋ง๋ค-
๊ฐ ์ ์ ํ ์์น์ ์ฝ์ ๋๊ฒ๋ ์๋๋ณํ ํด์ฃผ๋ ๋ก์ง์ ์ถ๊ฐ๋ก ๊ตฌํํ ํ์๊ฐ ์๊น
textField(_:shouldChangeCharactersIn:replacementString:)
๋ฉ์๋
AddProfileViewController๊ฐ
UITextFieldDelegate
ํ๋กํ ์ฝ์ ์ฑํtextField(_:shouldChangeCharactersIn:replacementString:)
๋ฉ์๋๋ก ์๋ก์ด ์ ๋ ฅ์ ์ข ๋ฅ์ ๋ฐ๋ผ- ์ฐ๋ฝ์ฒ ํ ์คํธํ๋์์์ ์ ๋ ฅ์ ํ์ฉํ๊ฑฐ๋,
- ๋๋ ์์์ ๋ง์ถ ๋ณํ๊ฐ์ผ๋ก ๋์ฒดํ์ฌ ์ง์ ํ ๋น(์ ๋ ฅ ๊ฑฐ์ )
PhoneNumberRegularExpressions
์ด๊ฑฐํ์ผ๋ก ์๋ฆฟ์๋ณ ๋ณํ ๋ฐฉ์์ ์ ์
Delegate์ ์ ์๋
์์ํ๋ค
, ๊ฐ์ธ์ ์ผ๋ก Delegate Pattern์ด๋์ฑ ์์-๋๋ฆฌ์ ํจํด
์ด๋ผ๊ณ ์ดํด
AddProfileViewController
(์ดํ AddVC)๋ ์ฑ ์์ListProfileViewController
(์ดํ ListVC)๋AddProfileViewControllerDelegate
(์ดํ AddVCDelegate) ์๊ฒฉ์ฆ์ ๊ฐ์งListVC
๋ ์๋ก์ด ๋ทฐ(AddV
)๋ฅผ ์ฌ๋ฆด ๋ ๋ณธ์ธ(self)์ ๊ทธ ๋ทฐ์ปจํธ๋กค๋ฌ(AddVC
)์ ๋๋ฆฌ์(Delegate)๋ก ์ง์ ํ์ฌ ํจ๊ป ๋ณด๋ด์ง๊ณ ,AddVC.delegate: AddVCDelegate = self //self: ListVC(AddVCDelegate๋ก์์ ListVC)
- ๋๋ฆฌ์๋ ์ฑ
์์(AddVC) ๋ด์ ๋จธ๋ฌผ๋ฉฐ(= .delegate๋ณ์์ ํ ๋น๋ ์ฑ)
๋๋ฆฌ์๋ก์ ์๊ตฌ๋ฐ์ ๋์(ํ๋กํ ์ฝ ํ์๊ตฌํ ๋ฉ์๋)์ ์ ์ ํ ์์ ์ ์ํ
// ๊ทธ ๋์์ AddProfileViewController์์ 'Save๋ฒํผ์ด ๋๋ ์ ๋' ํธ์ถ๋์ด, // (๊ฒ์ฆ ์๋ฃ๋) ์๋ก์ด ์ด๋ฆยท๋์ดยท์ฐ๋ฝ์ฒ ์ ๋ณด๋ฅผ ์กฐํฉํ์ฌ ํ๋กํ์ ์์ฑ(= ์๊ตฌ๋ฐ์ ๋์) delegate?.updateProfile(name: name, age: age, tel: tel) dismiss()
AddV
๊ฐ ๋ด๋ ค๊ฐ๋ฉด ๋๋ฆฌ์ ์ญํ ์ ๋ง๋ฌด๋ฆฌํ๊ณ ๋์์จListVC
๋ ๊ทธ ๋ฐ์ดํฐ(์ ํ๋กํ)๋ฅผ ๋ฐ์ ํ์ํ ์์ (profiles์ ์ ํ๋กํ์ ๋ฑ๋ก)์ ์ด์ด์ ์ํ
๊ฒ์๊ฒฐ๊ณผ ํ๋ฉด์์๋ ์ฌ๋ฐ๋ฅธ ์ ์ด ์ญ์ ๋๋๋ก ํ๊ธฐ
์ผํญ์ฐ์ฐ์๋ฅผ ํ์ฉํ์ฌ, isSearching
์ ๋ฐ๋ผ
index๋ก ์ ๊ทผํ ํ๋กํ ๋ฐฐ์ด์ด profiles
/ filteredProfiles
์ค ์ด๋์ชฝ์ธ์ง ๊ฒฐ์ ํ๋ ๋ก์ง์ ์ถ๊ฐ
let profile = isSearching ? profileSearchResults[indexPath.row] : profiles[indexPath.row]
๋๋ช ์ด์ธ์ด ์์ด๋ ์ ํํ ์ญ์ ๋๋๋ก ํ๊ธฐ
- ์ด๋ฐ์ profiles์์
name
์ด ์ผ์นํ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ์ง๋ง, ๋๋ช ์ด์ธ์ด ๋์ ์ญ์ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ - Model์ธ
Profile
์ด Hashableํ๋กํ ์ฝ(= ์ฆ Equatable๋ ์ฑํํจ)์ ์ฑํํ์ผ๋ฏ๋ก ์ปค์คํ ์ดํญ์ฐ์ฐ์๋ฅผ ๊ตฌํํด๋ณด๋ ค๋ค๊ฐ ์๋์ ๊ฐ์ ๋ฐ์์ด ๋ ์ฌ๋ผ ๋ณด๋ฅ tableView(_:cellForRowAt:)
๋ฉ์๋์์indexPath.row
๋กprofile
์ ๋ถ๋ฌ์์ผ๋ฏ๋ก, ์ญ์ผ๋ก ํด๋น index์ profile์ ๊บผ๋ด์ด ์ญ์ ํ๋ฉด ํด๋น ์ ์ profile์ด ์ญ์ ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๊ณ ๊ตฌํ
์ด๋ฆ์ ๋์๋ฌธ์๊ฐ ์์ฌ ์์ ๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฌ๋์ง ์๊ณ ๊ฒ์์ด ๋์ง ์์
์ค๋ฆ์ฐจ์ ์ ๋ ฌ ์ lowercased()
๋ฉ์๋๋ฅผ ์ ์ฉํ์ฌ ๋์๋ฌธ์ ๊ตฌ๋ถ์์ด sort๋๋๋ก ํจ
UISearchBar์ UISearchController์ ์ฐจ์ด
- VC.navigationItem.searchController:
UISearchController
- UISearchController().searchBar:
UISearchBar
UITableViewDataSource
ํ๋กํ ์ฝ ๋ด์ ์๋tableView(_:commit:forRowAt:)
๋ฉ์๋ ์ฌ์ฉ