iOS ํํธ : YB ๋ฅ์ธํ, YB ์ต์ธ์
ํ๋ก์ ํธ ๊ธฐ๊ฐ : 2020.6.27 ~ 2020.7.18
View | Git Branch | ๋ด๋น์ |
---|---|---|
CalendarView | calendar_branch | ์ธํ |
AlertView | alert_branch | ์ธํ |
JournalView | journal_branch | ์ธ์ |
MyPageView | mypage_branch | ์ธ์ |
SplashView | splash_branch | ์ธ์ |
LoginSignUpView | login_branch | ์ธํ |
- ์ํฌํ๋ก์ฐ : master(์ต์ข ๋ณธ) - dev(ํตํฉ๊ด๋ฆฌ) - ๊ฐ ๊ธฐ๋ฅ๋ณ ๋ธ๋์น(๋ด๋น์๊ฐ ๊ด๋ฆฌ)
- readme ์์ฑ์ ๋ํด์
- ๊ฒฐ๋ก : ํํํ ์ต๋ํ ์์ธํ ์ ๊ธฐ (๋์ค์ ์ ๋ฆฌ)
- ๋ฏธ๋ฃจ์ง ๋ง๊ณ ์์ ํ ๋๋ง๋ค ๊ธฐ๋กํด๋์! (๊ธฐ๋กํ๋ ์ต๊ด ์์ง๋ง๊ธฉ!)
- Git commit message ํ์ ํต์ผ
- Message๋ 3๊ฐ์ง ๋ผ๋ฒจ๋ง ์ฌ์ฉ
- Add : ์์ ์๋ก์ด ํ์ผ(swift, storyboard, VC ํ์ผ ๋ฑ) ์ถ๊ฐ
- Update : ๊ธฐ์กด ํ์ผ์ ๊ธฐ๋ฅ, UI์์ ์ถ๊ฐ
- Fix : ๊ธฐ์กด ๊ธฐ๋ฅ ์์ ์ด๋ ์๋ฌ ํด๊ฒฐ ๋ฑ
- Format : ๋ผ๋ฒจ + commit comment
- Message๋ 3๊ฐ์ง ๋ผ๋ฒจ๋ง ์ฌ์ฉ
- ์ฐ๋ฆฌ์ Git Workflow ์ต์ข ์ ๋ฆฌ ๋ ธ์ ๋งํฌ ๐ฅ
- view controller : Upper Camel Case ํญ ์ด๋ฆ + VC
- eg.
CalendarVC
,NotesVC
- UI ์์ ๋ค์ด๋ฐ : Upper Camel Case UI์์ ์ด๋ฆ + View Cell
- eg.
CalendarCollectionViewCell
- Xib ํ์ผ์ ViewCell ํ์ผ์ด๋ ๋๊ฐ์ด ๋ค์ด๋ฐ
- eg.
- ๋ณ์๋ช
, ์์๋ช
: Lower Camel Case
// ๋ณ์๋ช var dropDownButton: UIButton! // ์์๋ช let headerView = JournalDateHeaderView(frame: CGRect(x:0, y:0, width: 375, height: 16))
- ํจ์๋ช
: Lower Camel Case
- Action ํจ์ ๋ค์ด๋ฐ: '์ฃผ์ด+๋์ฌ+๋ชฉ์ ์ด'
func backButtonDidTap() { // ... }
- Extension ์ด๋ฆ : Extensions+ํ์ฅํด๋์ค
- eg.
Extensions+String
- eg.
- Optional์ gaurd let ์ผ๋ก ์ ์ธํ๊ธฐ
์ ์ฒด ์คํ ํ๋ฉด ๋ฐ ์๋ก ์๊ฒ๋ ๊ฒ๋ค๊ณผ ์ด๋ ค์ ๋ ๊ธฐ๋ฅ๋ค ์๊ฐ
Lottie ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ animationView()๋ฅผ ์ฌ์ฉํ์ฌ frame ํฌ๊ธฐ์ aniamteion JSONํ์ผ์ ์ง์ ํด์ค ์ ์๋ค. ๋ฐ๋ณตํ ํ์๋ฅผ ํ๋ฒ์ผ๋ก ์ง์ ํ์ฌ ์ฌ์ํ๋๋ก setupํจ์๋ฅผ ์์ฑํ์๋ค.
let animationView = AnimationView()
func setup(){ //lottie ๋ฒ์
animationView.frame = view.bounds //animationView ํฌ๊ธฐ๊ฐ view์ ๊ฐ๊ฒ
animationView.animation = Animation.named("data2") //์ด๋ค jsonvํ์ผ์ ์ธ์ง
animationView.contentMode = .scaleAspectFill //ํ๋ฉด์ ์ ํฉํ๊ฒ
animationView.loopMode = .playOnce //view์์ Subview๋ก ๋ฃ์ด์ค๋ค,
view.addSubview(animationView)
animationView.play() //์ฌ์
}
์คํ๋์ํ๋ฉด์์ ์ง์ ๋ ์๊ฐ(์ด)์ด ์ง๋ ํ ์๋์ผ๋ก ํ๋ฉด์ด ์ ํ๋๋๋ก ๊ตฌํํ์๋ค. asyncAfter ๋ฉ์๋์ seconds ํ๋ผ๋ฏธํฐ์ ์๊ฐ ์ด๋ฅผ ์ง์ ํด์ฃผ๊ณ ํจ์ ๋ธ๋ก ์์ ์ ํ๋ ๋ทฐ๋ฅผ ์ ์ํ๋ฉด ํด๋น ์๊ฐ์ด ์ง๋ ํ ์๋์ผ๋ก ํ๋ฉด์ ํ์ด ์ด๋ฃจ์ด์ง๋ค.
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: { //Code }
์ค๋ฅธ์ชฝ / ์ผ์ชฝ์ผ๋ก ์ค์์ดํ ์ ์ค์ณ์ ๋ฐ๋ผ ํธ์ถ๋๋ ํจ์์ ์ด๋ฏธ์ง ๋ฐฐ์ด์ ์๋ ์จ๋ณด๋ฉ ์ด๋ฏธ์ง 4๊ฐ์ index ๊ฐ์ ๊ณ์ฐํ์ฌ ๊ฐ index์ ํด๋นํ๋ ์ด๋ฏธ์ง ์ด๋ฆ์ ์ด๋ฏธ์ง ๋ทฐ์ ์ ์ฉํด์ฃผ์๊ณ , ์ถ๊ฐ๋ก ์ด๋ฏธ์ง ์ ํ ํจ๊ณผ๋ฅผ ์ฃผ์๋ค.
@objc func respondToSwipeGesture(_ gesture: UIGestureRecognizer) {
if let swipeGesture = gesture as? UISwipeGestureRecognizer
if swipeGesture.direction == UISwipeGestureRecognizer.Direction.left
//imege ๋ฐฐ์ด ์ธ๋ฑ์ค ์กฐ์ ํ์ฌ ์ด๋ฏธ์ง ์ ํ & ์ํ๊ฐ ์กฐ์ ์ ๋๋ฉ์ด์
์ฝ๋
else if swipeGesture.direction == UISwipeGestureRecognizer.Direction.right
//imege ๋ฐฐ์ด ์ธ๋ฑ์ค ์กฐ์ ํ์ฌ ์ด๋ฏธ์ง ์ ํ & ์ํ๊ฐ ์กฐ์ ์ ๋๋ฉ์ด์
์ฝ๋
}
์์ดํฐ 8 ์ฒ๋ผ ํ๋ฉด์ด ์๊ฑฐ๋ ํ ์คํธ ํ๋๊ฐ ๋ทฐ์ ๋ฐ์ ์์นํด์์ ๊ฒฝ์ฐ ํค๋ณด๋๊ฐ ์ด๋ ธ์ ๋ ํ ์คํธ ํ๋๊ฐ ๊ฐ๋ ค์ง๋ค. ๊ทธ๋ด๋ ํ์ํ ๊ธฐ๋ฅ ๋๊ฐ์ง์ธ 1. ๋ทฐ์ ์๋ฌด๊ณณ์ด๋ ํฐ์นํ์ ๋ ํค๋ณด๋ ๋ซํ๊ธฐ 2. ํ ์คํธํ๋ ์๋ก ๋ฐ๋ฆฌ๊ธฐ ๊ธฐ๋ฅ๋ค์ ๋ก๊ทธ์ธ, ํ์๊ฐ์ ํ๋ฉด์ ์ถ๊ฐํ๋ค!
// ํญํ์ ๋ ํค๋ณด๋ action
func initGestureRecognizer() { //
let textFieldTap = UITapGestureRecognizer(target: self, action: #selector(handleTapTextField(_:)))
textFieldTap.delegate = self
self.view.addGestureRecognizer(textFieldTap)
}
// ๋ค๋ฅธ ์์น ํญํ์ ๋ ํค๋ณด๋ ์์ด์ง๊ธฐ
@objc func handleTapTextField(_ sender: UITapGestureRecognizer) { //
self.emailTextField.resignFirstResponder()
self.passWordTextField.resignFirstResponder()
}
// ํค๋ณด๋๊ฐ ์๊ธธ ๋ ํ
์คํธ ํ๋ ์๋ก ๋ฐ๊ธฐ
@objc func keyboardWillShow(_ notification: NSNotification) {
guard let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double else { return }
guard let curve = notification.userInfo?[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt else { return }
guard let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardHeight: CGFloat // ํค๋ณด๋์ ๋์ด
if #available(iOS 11.0, *) {
keyboardHeight = keyboardFrame.cgRectValue.height - self.view.safeAreaInsets.bottom
} else {
keyboardHeight = keyboardFrame.cgRectValue.height
}
UIView.animate(withDuration: duration, delay: 0.0, options: .init(rawValue: curve), animations: {
self.imageView.alpha = 0 // ์ด๋ฏธ์ง๋ทฐ ์จ๊ธฐ๊ธฐ
self.imageToTextHeightConstraint.constant = 0 // constraint ์กฐ์
self.bottomViewConstraint.constant = +keyboardHeight/2 + 100 // constraint ์กฐ์
})
self.view.layoutIfNeeded()
}
CalendarCollectionView (๋ฌ๋ ฅ ๋ทฐ)์ TutorCollectionView (ํ๋จ์ ์ผ์ ๋ทฐ)์ ๋์์ ๋ฐ์๋์ด์ผ ํ๋ ๊ธฐ๋ฅ๋ค์ด ๋ง์ ๋ก์ง์ ์ง๋ ๊ฒ์ด ๋งค์ฐ ์ด๋ ค์ ๋ค..! ํ๋จ์ ๊ธฐ๋ฅ๋ค์ด ์บ๋ฆฐ๋ ํญ์ ๋ค์ด๊ฐ์ผ ํ๋ ์ฃผ์ ๊ธฐ๋ฅ๋ค์ด๋ค.
- ์บ๋ฆฐ๋์ ์ : ์ด๋ฒ ๋ฌ ์ซ์๋ ๊ฒ์ ์์ผ๋ก ํ์, ์ด์ ๋ฌ, ๋ค์๋ฌ ์ซ์๋ ํ์์ผ๋ก ํ์
- ๋ทฐ ์ฒ์ ๋ก๋์ ์บ๋ฆฐ๋์ ๋ ์ง์ ์ผ์ ์ด ์กด์ฌํ๋ฉด ์๊น ์ ์ผ๋ก ํ์
- ๋ทฐ ์ฒ์ ๋ก๋์ ์บ๋ฆฐ๋์ ๋ํดํธ๋ก ์ค๋ ๋ ์ง ์ ํ
- ์บ๋ฆฐ๋์ ๋ ์ง ์ ํ์ ๋ฐ์ ๋ทฐ์ ํด๋น ๋ ์ง์ ์ผ์ ํ์
- ์๋จ์ ํ ๊ธ(์์ ์ผ์ )์ ๋ฐ๋ผ ์บ๋ฆฐ๋๋ทฐ์ ์์ธ ์ผ์ ์ด ์ ํ๋์ด์ผ ํจ
๋ค์ด์ค๋ ์ ์ฒด ์์ ๋ฐ์ดํฐ classList2๋ฅผ CalendarData๋ผ๋ ๊ตฌ์กฐ์ฒด์ ์ ์ฅํด์ฃผ์๋ค. classList2[i]์ ๋ ์ง ์คํธ๋ง ๊ฐ์ ๊ฐ๊ฐ ์, ์ผ๋ก ํ์ฑํด์ฃผ๊ณ ์บ๋ฆฐ๋ ์ ์ ์ผ์๋ฐ์ดํฐ์ ์ ์ฒด ์บ๋ฆฐ๋์ ํ์ฌ ์๊ฐ๊ณผ ์ผ์นํ ๋ classDateList๋ผ๋ ์ ๋ฆฌ์คํธ์ ์ ์ฅํด์ค ํ ํด๋น ๋ฆฌ์คํธ๋ฅผ TutorCollectionView์ cellForItem์ ์ฌ์ฉํด์ฃผ์๋ค.
// CalendarCollectionView
for index in 0..<classList2.count {
print(classList2[index].classDate)
let dateMonthInt = currentMonthIndex + 1
let date2 = Int(date)
let dayMove = String(format: "%02d", arguments: [dateMonthInt])
let dayMove2 = String(format: "%02d", date2 as! CVarArg)
if classList2[index].classDate == "\(currentYear)-\(dayMove)-\(dayMove2)" {
classDateList.append(classList2[index])
tutorCollectionView.reloadData()
}}
//TutorCollectionView
tutorInfoCell.infoView.frame.size.width = tutorInfoCell.frame.size.width/2
tutorInfoCell.set(classDateList[indexPath.row])
for i in 0..<self.classDateList.count {
let hourTimes = "\(self.classDateList[i].times)ํ์ฐจ, \(self.classDateList[i].hour)์๊ฐ"
tutorInfoCell.classHourLabel.text = hourTimes}
return tutorInfoCell
// CalendarCollectionView
if classDateMonthZeros == dayMove && classDateDay == todaysDate {
let imageName = classList2[i].color
if calendarCell.image1.image == UIImage(named: "") {
calendarCell.image1.image = UIImage(named: imageName)
} else if calendarCell.image2.image == UIImage(named: "") {
calendarCell.image2.image = UIImage(named: imageName)
} else {
calendarCell.image3.image = UIImage(named: imageName)
}
}
์๋ฒ์์ ํด๋น ์ฌ์ฉ์๊ฐ ์ฐ๊ฒฐ๋์ด์๋ ์์ ๋ฆฌ์คํธ๋ฅผ ๋ฐ์์ dropDown.DataSource ๋ฆฌ์คํธ์ ์ ์ฅํด์ฃผ์๋ค. ํด๋น ์คํธ๋ง ๊ฐ์ ์ ํํ ์ ์คํธ๋ง๊ฐ๊ณผ ์์ ์ด๋ฆ์ด ์ผ์นํ๋ ๋ฐ์ดํฐ๋ฅผ classListToggle์ appendํด์ฃผ๊ณ classList2์ classListToggle๋ฅผ ๋ณต์ฌํด CalendarCollectionView์ TutorCollectionView์ ๋ฟ๋ ค์คฌ๋ค.
// ๋๋กญ๋ฐ์ค ๋ชฉ๋ก ๋ด์ญ
dropDownButton.addTarget(self, action: #selector(dropDownToggleButton), for: .touchUpInside)
self.dateCollectionView.reloadData()
self.tutorCollectionView.reloadData()
// ๋๋กญ๋ฐ์ค ์์
์ ๋ชฉ ์ ํํ ๋ ์บ๋ฆฐ๋ ์ปฌ๋ ์
๋ทฐ, ํํฐ ์ปฌ๋ ์
๋ทฐ ๋ฐ์ดํฐ ๋ฐ๊ฟ์ฃผ๊ธฐ
dropDown?.selectionAction = { [unowned self] (index: Int, item: String) in
self.dropDownLabelButton.setTitle(item, for: .normal)
self.classListToggle.removeAll()
self.tutorCollectionView.reloadData()
// ์ ์ฒด ์ ํ์
if self.dropDownLabelButton.title(for: .normal) == "์ ์ฒด" {
self.classList2 = self.classList2Copy
print(self.classList2)
self.dateCollectionView.reloadData()
self.tutorCollectionView.reloadData()
} else {
// ์์
๋ฆฌ์คํธ ์ ํ์
self.classList2 = self.classList2Copy
for i in 0..<self.classList2.count {
if self.dropDownLabelButton.title(for: .normal) == self.classList2[i].lectureName {
self.classListToggle.append(self.classList2[i])
}
print("์ ๋ฆฌ์คํธ", self.classListToggle)
}
self.classList2.removeAll()
self.classList2 = self.classListToggle
self.dateCollectionView.reloadData()
self.tutorCollectionView.reloadData()
}
}
CollectionView, TableView๋ฅผ ์ฌ์ฉํ ๋ ํด๋น ์์์ ๋ทฐ์ ๋ด๊ฐ ํ ์์ ์ด ๋ฐ์๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๊ผญ ๊ทธ ํจ์๊ฐ ์คํ๋๋ ๊ณณ์์ collectionView.reloadData()๋ฅผ ์คํ์์ผ์ค์ผ ์์ ์ฌํญ์ด ๋ฐ์๋๋ค!
๋ฐ์ ์ฝ๋์์๋ classList2์ append๋ฅผ ํด์ค๋ ์ปฌ๋ ์ ๋ทฐ๋ค์ ๋ฆฌ์คํธ๊ฐ ์ ๋ฐ์ดํธ ๋์ง ์์๋๋ฐ for ๋ฌธ์ด ๋๋ ํ reloadData๋ฅผ ํด์ฃผ์๋๋ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์๋๋ค!
// ์๋ฒ ํต์ : ์บ๋ฆฐ๋ ์ ์ฒด ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
func getClassList() {
ClassInfoService.classInfoServiceShared.getAllClassInfo() { networkResult in
switch networkResult {
case .success(let resultData):
print("successssss")
//guard let data = resultData as? [CalendarData] else { return }
guard let data = resultData as? [CalendarData] else { return print(Error.self) }
print("try")
for index in 0..<data.count {
let item = CalendarData(classId: data[index].classId, lectureName: data[index].lectureName, color: data[index].color, times: data[index].times, hour: data[index].hour, location: data[index].location, classDate: data[index].classDate, startTime: data[index].startTime, endTime: data[index].endTime)
self.classList2.append(item)
self.classList2Copy = self.classList2
}
self.dateCollectionView.reloadData()
self.tutorCollectionView.reloadData()
self.nextDate = 0
case .pathErr : print("Patherr")
case .serverErr : print("ServerErr")
case .requestErr(let message) : print(message)
case .networkFail:
print("networkFail")
}
}
}
BottomOffset๋ก ์๋์ชฝ์ ํผ์ณ์ง๋ ๋๋กญ๋ฐ์ค์ ์์น๋ฅผ ์ง์ ์ง์ ํ ์ ์๋ค. (๋ ์ธ๋ฐํ๊ฒ ์ปจํธ๋กค ๊ฐ๋ฅ!) y์ถ์ ์๋ ์ฝ๋๋ฅผ ์ฐ๋ฉด ๋ฒํผ ๋์ด ๋งํผ offset์ด ์ง์ ๋์ด ๋ฐ๋ก ์๋์ชฝ์์ ๋๋กญ๋ฐ์ค๊ฐ ํผ์ณ์ง๊ฒ ๋๋๋ฐ ์กฐ๊ธ ์ฌ์ ๋ฅผ ๋๊ณ ํผ์ณ์ง ์ ์๋๋ก +6(pt)์ ํด์ฃผ์๋ค.
dropDown?.bottomOffset = CGPoint(x: 0, y:(dropDown?.anchorView?.plainView.bounds.height)!+6)
์์ ์ผ์ง ๋ทฐ์์ ๊ณผ์ธ๋ฅผ ์ ํํ์๋๋ง Progress View๊ฐ ๋์ค๊ณ ์ ํํ์ง ์์ผ๋ฉด Progress View๋ฅผ ์จ๊ธฐ๋ ๊ธฐ๋ฅ์ ๊ตฌํ์ด ํ์ํ๋ค. ์คํ๋ทฐ์ ํด๋น view๋ฅผ hidden ์ํค๊ณ Constranints height๋ฅผ 0์ผ๋ก ์กฐ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก View๋ฅผ ์จ๊ธฐ๊ณ , ๋ณด์ผ ์ ์๋๋ก ํ์๋ค.
func classHeaderHidden(_ ishide: Bool){
progressViewWrap.subviews[0].isHidden = ishide
if ishide //true(์๋ณด์ผ๋)
tableViewTopMargin.constant = 191-117
else //false (๋ณด์ผ๋)
tableViewTopMargin.constant = 191
}
์๋ฆผ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ค์์ดํํด์ ์๋ก์ด ์๋ฆผ์ ํ์ธ์ฒดํฌํ ์ ์๊ณ , ์ญ์ ๋ ํ ์ ์๋ค.
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let delete = UIContextualAction(style: .destructive, title: "์ญ์ ") { (action, sourceView, completionHandler) in
self.noticeList.remove(at: indexPath.row)
self.noticeTableView.reloadData()
print(self.noticeList.count)
//completionHandler(true)
}
let confirm = UIContextualAction(style: .normal, title: "ํ์ธ") { (action, sourceView, completionHandler) in
print("index path of edit: \(indexPath)")
self.noticeList[indexPath.row].newNotice = false
self.noticeTableView.reloadData()
completionHandler(true)
}
let swipeActionConfig = UISwipeActionsConfiguration(actions: [delete, confirm])
swipeActionConfig.performsFirstActionWithFullSwipe = false
return swipeActionConfig
}
๋ง์ดํ์ด์ง์์ ์ ๊ท ์์ ์๊ฐ์ ์ ๋ ฅํ๋ ๋ถ๋ถ์ ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ํ ์คํธ ํ๋๊ฐ ์์ฑ๋๋๋ก ํ๊ธฐ ์ํด tableView๋ก ๊ตฌํํ์๋๋ฐ, ํ ์ด๋ธ ๋ทฐ ์ ๋ด์์ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ VC๋ก ์ ๋ฌํ๋ ๋ถ๋ถ์์ ์ด๋ ค์์ด ์์๋ค. ๋ณ์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ํ ๋นํด๋ณด๊ณ , ๋ฆฌ์คํธ์ append๋ฅผ ํด๋ด๋ VC๋ด ๋ค๋ฅธ ํจ์์์ ๋ฐ์ดํฐ๋ฅผ ํธ์ถํ๋ ค๊ณ ํ๋ฉด nil ๊ฐ์ด ์ถ๋ ฅ๋์๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ํด cell์ protocol์ ์ ์ํ๊ณ delegate๋ฅผ ์ค์ ํด์ฃผ์๋ค.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
cell.delegate = self // ๋งค์ฐ์ค์!! tableView cellForRowAt ํจ์ ๋ด๋ถ์ delegate ์ ์ธ
}
// Cell ํ์ผ ๋ด๋ถ์ protocol ์ ์ธ
protocol AddRegularClassTimeCellDelegate: class {
func setScheduler(_ date: String, _ start: String, _ end: String)
}
// Cell ํ์ผ์ delegate ๋ณ์ ์ ์ธ ๋ฐ ํจ์ ํธ์ถ
var delegate: AddRegularClassTimeCellDelegate?
if let delegate = delegate {
delegate.setScheduler(days, startTime, endTime)
}
// ํด๋น VC์ extention์ผ๋ก ์
ํ์ผ protocol์ ์ ์๋ ํจ์๋ถ๋ฅผ ๊ตฌํํ๋ค.
extension MyClassAddVC: AddRegularClassTimeCellDelegate {
func setScheduler(_ date: String, _ start: String, _ end: String) {
let newSchedule = Schedules(day: date, orgStartTime: start, orgEndTime: end)
schedule.append(newSchedule)
}
}
VC๋ด์ ๋น ๋ฆฌ์คํธ regularClassTime์ ๋๊ณ ๋ฒํผ์ ๋๋ ์ ๋ ๋ฆฌ์คํธ์ append๋ฅผ ํด์ ๊ฐ์๋ฅผ ๋๋ ค ์ค ๋ค์ tableView.reloadData()๋ฅผ ํด์ฃผ๋ฉด (ํ ์ด๋ธ row ๊ฐ์๋ ๋ฆฌ์คํธ regularClassTime.count์ด๋ค) cell์ด ๋์ ์ผ๋ก ์ฆ๊ฐ๋๋ค.
@IBAction func regularClassAddButton(_ sender: Any) {
regularClassTime.append("์
์ถ๊ฐ")
tableView.reloadData()
}
ํ ์คํธ ํ๋์ ํค๋ณด๋ ๋์ ํผ์ปค๋ทฐ๋ก ์ ๋ ฅ์ ๋ฐ์ผ๋ฉฐ, toolbar์ bar button๋ค๊ณผ ํผ์ปค๋ทฐ ๋ชฉ๋ก์ ์ปค์คํ ํ์ฌ ์ ๊ท ์์ ์๊ฐ์ ์ ๋ ฅ ๋ฐ๋๋ก ํ๋ค. ๋ํ ์์์๊ฐ์ ์ ๋ ฅํ์ ๋, ๋ ์๊ฐ์ด ์๋์ผ๋ก ์์์๊ฐ๊ณผ ๋ง์ถฐ์ง๋๋ก didSelectRow ํจ์ ๋ด์ ์๋ ์์ค์ฝ๋๋ฅผ ๊ตฌํํ๋ค.
pickerView.delegate = self
pickerView.dataSource = self
// ์ดํ delegate ์ detaSource ํจ์๋ฅผ extention์ผ๋ก ์ปดํฌ๋จผํธ ๊ฐ์ ์ง์ ๋ฐ ๋ชฉ๋ก ๋ฐ์ดํฐ ๋ฆฌ์คํธ ์ ์ฉ
if startHours[pickerView.selectedRow(inComponent: 1)] != "00" { //์์์๊ฐ์ด ์
๋ ฅ๋์์ผ๋ฉด ๋๋๋ ์๊ฐ๋ ์์์๊ฐ๊ณผ ๋์ผํ๋๋ก ์๋์ผ๋ก ํด๋น component์ wheel์ด ๋์๊ฐ๋ฉด์ ์ค์ ๋จ
startH = startHours[pickerView.selectedRow(inComponent: 1)]
startrow = row
pickerView.selectRow(startrow, inComponent: 3, animated: true)
endH = endHours[pickerView.selectedRow(inComponent: 3)]
}
๊ธฐ๋ฅ ์ด๋ฆ | ์ฐ์ ์์ | ๋ด๋น์ | ๋ทฐ | ๊ตฌํ ์ฌ๋ถ |
---|---|---|---|---|
์คํ๋์ | P1 |
์ธ์ | ์คํ๋์ | O |
์คํ๋์ ์ ๋๋ฉ์ด์ | P3 |
์ธ์ | ์คํ๋์ | O |
์ฑ ์ค๋ช ์จ๋ณด๋ฉ | P2 |
์ธ์ | ํ์๊ฐ์ & ๋ก๊ทธ์ธ | O |
ํ์๊ฐ์ & ์ญํ ์ ํ | P1 |
์ธํ | ํ์๊ฐ์ & ๋ก๊ทธ์ธ | O |
์ด์ฉ์ฝ๊ด, ๊ฐ์ธ์ ๋ณด๋ณดํธ์ ์ฑ | P3 |
์ธํ | ํ์๊ฐ์ & ๋ก๊ทธ์ธ | O |
๋ก๊ทธ์ธ | P1 |
์ธํ | ํ์๊ฐ์ & ๋ก๊ทธ์ธ | O |
์๋ ๋ก๊ทธ์ธ | P3 |
์ธํ | ํ์๊ฐ์ & ๋ก๊ทธ์ธ | O |
ํ์๊ฐ์ /๋ก๊ทธ์ธ ์๋ฒ ์ฐ๋ | P3 |
์ธํ | ํ์๊ฐ์ & ๋ก๊ทธ์ธ | O |
์บ๋ฆฐ๋ํ ๊ธ | P1 |
์ธํ | ์บ๋ฆฐ๋ | O |
์บ๋ฆฐ๋ ์ ๋ณ๊ฒฝ (์ข์ฐ ํ์ดํ) | P1 |
์ธํ | ์บ๋ฆฐ๋ | O |
์บ๋ฆฐ๋์ ์์ ์ผ์ ํ์ | P1 |
์ธํ | ์บ๋ฆฐ๋ | O |
์ ํ ๋ ์ง์ ์ผ์ ํ์ | P1 |
์ธํ | ์บ๋ฆฐ๋ | O |
ํ๋กํ ๋ฒํผ + | P1 |
์ธํ | ์บ๋ฆฐ๋ | O |
์ผ์ ์ ๋ณด ํ๋ฉด | P1 |
์ธํ | ์บ๋ฆฐ๋ | O |
์ผ์ ํธ์ง/์ญ์ | P2 |
์ธํ | ์บ๋ฆฐ๋ | O |
์ผ์ ์ถ๊ฐ | P1 |
์ธํ | ์บ๋ฆฐ๋ | O |
์บ๋ฆฐ๋ ์๋ฒ ์ฐ๋ | P3 |
์ธํ | ์บ๋ฆฐ๋ | O |
์์ ์ผ์งํ ๊ธ | P1 |
์ธ์ | ์์ ์ผ์ง | O |
์์ ์ผ์ง (์ ๋จ์) | P1 |
์ธ์ | ์์ ์ผ์ง | โณ |
์์ ์ผ์ง ์์ (์ ๋ ฅ) | P1 |
์ธ์ | ์์ ์ผ์ง | O |
์์ ์ผ์ง ์ ๋ณ๊ฒฝ (์ข์ฐ ํ์ดํ) | P3 |
์ธ์ | ์์ ์ผ์ง | O |
๊ณผ์ธ ์๊ฐ ๋ฌ์ฑ๋ฅ (๋ง๋๊ทธ๋ํ) | P2 |
์ธ์ | ์์ ์ผ์ง | O |
ํํฐ ์ผ์ง ํธ์ง ๋ฐฉ์ง | P3 |
์ธ์ | ์์ ์ผ์ง | O |
์์ ์ผ์ง ์๋ฒ ์ฐ๋ | P3 |
์ธ์ | ์์ ์ผ์ง | |
์๋ฆผํ ๊ธ | P1 |
์ธํ | ์๋ฆผ | O |
์๋ฆผ | P1 |
์ธํ | ์๋ฆผ | O |
์๋ฆผ ์ญ์ , ํ์ธ ๊ธฐ๋ฅ | P2 |
์ธํ | ์๋ฆผ | O |
๋ฐ์ดํฐ์ ๋ฐ๋ฅธ ์๋ฆผ ๋ฉ์์ง | P2 |
์ธํ | ์๋ฆผ | |
๊ฐํธ ํ๋กํ | P1 |
์ธ์ | ๋ด์ ๋ณด | O |
ํ๋กํ ํธ์ง | P2 |
์ธ์ | ๋ด์ ๋ณด | O |
์์ ๋ฒํผ | P1 |
์ธ์ | ๋ด์ ๋ณด | O |
์์ ๋ฒํผ์ ํ๋กํ | P2 |
์ธ์ | ๋ด์ ๋ณด | O |
์์ ์ถ๊ฐ | P1 |
์ธ์ | ๋ด์ ๋ณด | O |
์์ ์ด๋ | P1 |
์ธ์ | ๋ด์ ๋ณด | O |
์ด๋ ์ฝ๋ | P1 |
์ธ์ | ๋ด์ ๋ณด | โณ |
์์ ์ ๋ณด | P1 |
์ธ์ | ๋ด์ ๋ณด | O |
์์ ์ ๋ณด ํธ์ง | P2 |
์ธ์ | ๋ด์ ๋ณด | O |
๊ณ์ข ์ ๋ณด ๋ณต์ฌ ๋ฒํผ | P2 |
์ธ์ | ๋ด์ ๋ณด | O |
๋ด์ ๋ณด ์๋ฒ ์ฐ๋ | P3 |
์ธ์ | ๋ด์ ๋ณด | |
๋ฒ์ ์ ๋ณด | P3 |
์ธ์ | ๋ด์ ๋ณด | O |
๊ฐ๋ฐ์ ์ ๋ณด | P3 |
์ธ์ | ๋ด์ ๋ณด | O |
๋ก๊ทธ์์ | P3 |
์ธ์ | ๋ด์ ๋ณด | O |
๐ฐ26๊ธฐ iOSํํธ YB ๋ฅ์ธํ SehwaRyu | @soonsophu
๐ฑ26๊ธฐ iOSํํธ YB ์ต์ธ์ InjeongChoi | @leanjeong