-
Notifications
You must be signed in to change notification settings - Fork 50
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
동기화 메모장 [STEP2] 호박, 아리 #84
Conversation
- CoreData의 NSManagedObject의 내부 convenience init 제거 - MemoDetailVC 내부 createMemoData 메소드 내부를 CoreData에 맞춰 리팩토링 - MemoListVC memoListInfo 프로퍼티에 didSet 추가 - Constant 타입을 추가하여 하드코딩된 부분 리팩토링 - Navigation Bar 오른쪽 버튼에 action 추가 - SplitVC 내부 memoList 프로퍼티에 didSet 추가 - updateData 메소드 추가 - updateMemoList 파라미터 중 data를 옵셔널하게 수정 - MemoDataManager 내부 update 할때마다 fetch하도록 수정 - MemoDataManager createMemo 메소드 추가
- 코어데이터 관련 Memo 타입 id 프로퍼티 추가 - MemoDataManager의 inserMemoList, setUpMemoList 메서드 추가 - MemoDataManager의 임시방편으로 deleteAll 메서드 추가 - MemoDataManager의 createMemo메서드 updateMemo로 변경 - MemoListCell의 configure 메서드 변경된 타입에 맞춰 리팩터링 - 모든 ViewController를 변경된 타입에 맞춰 전반적인 리팩터링
- fetch시 날짜를 내림차순으로 정렬 - add 버튼을 터치했을 때 데이터와 테이블뷰셀을 추가하지 않던 부분 개선 - detailVC에서 더이상 사용하지 않는 네임스페이스 프로퍼티 제거 - detailVC의 updateMemoData에서 body데이터를 trimming으로 다듬던 부분 제거
- UITableView Delegate 메소드를 추가하여 스와이프 후 Delete 버튼 터치시 코어데이터, memoList를 삭제하도록 구현 - 삭제 이후 MemoDetailViewController 내부 UTextView의 text를 지울 수 있도록 SplitViewController에 기능 추가 - MemoDataManager 내부 memoList의 요소를 삭제할 수 있는 기능 추가 - MemoListCell 내부 configure 메소드 파라미터 타입을 변경하고 메소드 내부 리팩토링 - MemoListViewController 내부 하드코딩 되어있는 문자열을 Constant 상수로 리팩토링
- popoverController를 사용하여 ipad에서도 ActivityViewController가 정상적으로 작동하도록 구현 - 기존 delete 기능을 공유기능과 함께 UIContextualAction을 사용하도록 변경
- UIViewController extension을 통해 showMemoActionSheet, showAlert 메서드 구현 - MemoDetailViewController의 setUpNavigationItem 메서드에 action 추가 - action 메서드 moreViewbuttonTapped 구현
- Array를 extension하여 배열의 요소를 새 인덱스로 이동시켜주는 move 기능을 추가 - MemoDetailViewController 내부 textViewDidChange 메소드에 currentIndex가 0이 아니라면 셀과 데이터를 맨앞으로 이동하도록 로직 추가 - SplitViewController, MemoListViewController 내부에 TableView의 셀을 이동하는 메소드 추가 - MemoDataManager 내부에도 memoList의 요소를 새 인덱스로 이동해주는 기능 추가
- UIFont extension을 통해 커스텀폰트를 다이나믹타입을 지원할 수 있도록 하는 기능 추가 - textView Delegate 메서드(shouldChangeTextIn)를 통해 설정한 폰트 적용
- 메모 데이터를 보여줄 때 UITextView의 폰트를 설정해주는 configureTextStyle 메소드 구현 - text, font, color를 전달받아 NSMutableAttributedString를 생성해주는 attributedText 메소드 추가
- insertCell 메서드에 selectRow 메서드 추가 - moveCell, updateData 메서드에 selectRow 메서드 추가 - deleteCell 메서드에 selectRow 메서드 추가, 삭제된 후 반영되도록 비동기 처리 - select 여부에 따른 셀 label의 textColor 변경 - selectedBackgroundView 추가 - SplitViewController의 tintColor 추가
- UITableView Cell을 스와이프 했을 때 단순 텍스트가 아니라 이미지가 나오도록 UIImage를 추가 - showMemoActionSheet의 shareAction, deleteAction에 titleTextAlignment 설정과 image 설정 추가
- present메서드 호출 시 0으로 하드코딩 된 매직넘버를 zero로 변경 - Array+Extension 필요없는 주석 삭제
- 하드코딩된 문자열을 상수로 선언하여 리팩토링 - 관련 메소드들을 extension과 주석을 활용하여 분리 - 접근제어 추가 - UIContextualAction 클로저 내부에 있는 로직을 별도 메소드로 분리 - 매직넘버를 상수로 리팩토링
- 하드코딩된 문자열을 상수로 리팩토링 - Constant를 private하도록 접근제어 추가 - currentIndex 매직넘버를 상수로 변경 - 메소드 순서 수정 및 MARK 주석 추가 - 메소드 호출부분 줄바꿈 컨벤션 수정
- showActivityViewController 메서드 파라미터 삭제 - 줄바꿈 및 컨벤션 수정 - SplitViewController Mark 주석 추가 및 수정
- MemoDataManager, Memo의 이름을 Notes, Note...로 리네이밍
- moveCell의 selectRow 메서드 animated를 false로 변경
- SplitViewController에서 popoverContoller 프로퍼티 추가 후 viewWillTransition 메서드 override하여 popoverContoller의 위치를 설정하는 로직 구현 - UIVIewController extension의 showActivityViewController 메서드 내부에서 SplitViewController의 popoverController 프로퍼티에 할당하는 코드 추가
@objc func moreViewbuttonTapped(_ sender: UIBarButtonItem) { | ||
guard let splitVC = self.splitViewController as? SplitViewController else { | ||
return | ||
} | ||
self.showNoteActionSheet( | ||
shareHandler: { _ in | ||
self.showActivityViewController(data: PersistentManager.shared.notes[self.currentIndex].body ?? "") | ||
}, deleteHandler: {_ in | ||
self.showAlert( | ||
message: Constant.deleteWarningMessage, | ||
actionTitle: Constant.deleteAlertActionTitle | ||
) { _ in | ||
splitVC.deleteTableViewCell( | ||
indexPath: IndexPath(row: self.currentIndex, section: .zero) | ||
) | ||
} | ||
}, barButtonItem: sender) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
함수로 정리되는지 한번 해보시고 [weak self]를 언제 사용하는지 리마인드 한번 더!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
덕분에 weak self에 대해서 다시 복기해보게 되었어요. 감사합니다 😊
@objc private func keyboardWillShow(_ notification: Notification) { | ||
guard let userInfo = notification.userInfo as NSDictionary?, | ||
var keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { | ||
return | ||
} | ||
keyboardFrame = view.convert(keyboardFrame, from: nil) | ||
var contentInset = noteDetailTextView.contentInset | ||
contentInset.bottom = keyboardFrame.size.height | ||
noteDetailTextView.contentInset = contentInset | ||
noteDetailTextView.scrollIndicatorInsets = noteDetailTextView.contentInset | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고차함수로 변경할 수 있나요? (숙제 아님)
온라인 리뷰때 말씀드린대로 고차함수 사용을 익숙하게 하는지 or 익숙하게 사용할 수 있다면 복습하는 형태로 한번 해보세요!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고차함수가 정말 좋네요... 온라인 리뷰때 감사했습니다!!!! 🤩
private func attributedText(_ text: String, font: UIFont, color: UIColor) -> NSMutableAttributedString { | ||
let string = text as NSString | ||
let attributedText = NSMutableAttributedString(string: text) | ||
let range: NSRange = string.range(of: text) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
NSRange 말고 그냥 Range 사용해서도 가능할까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
음... 구지 155라인에서 변수 생성을 하지 않고
(test as string).range(of: text)
이렇게 해도 되네요!?
guard currentIndex != .zero else { | ||
return | ||
} | ||
PersistentManager.shared.moveNotes(from: currentIndex, to: .zero) | ||
splitVC.moveTableViewCell(at: currentIndex) | ||
currentIndex = .zero |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
guard와 if문에 대해서 얘기했죠!
꼭 해당 위치에 가드문이 들어가야 한다면 함수로 내용 분리를 하는게 좋을 것 같아요!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
네! 이부분 분리하여 개선하였습니다. 덕분에 가독성이 훨씬 좋아진 것 같아요. 감사합니다 🙏🏻
func deleteCell(indexPath: IndexPath) { | ||
guard let splitVC = self.splitViewController as? SplitViewController else { | ||
return | ||
} | ||
let item = PersistentManager.shared.removeNote(at: indexPath.row) | ||
PersistentManager.shared.delete(item) | ||
splitVC.clearNoteTextView() | ||
tableView.deleteRows(at: [indexPath], with: .fade) | ||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { | ||
let index = indexPath.row == .zero ? .zero : indexPath.row - 1 | ||
let newindexPath = IndexPath(row: index, section: .zero) | ||
splitVC.present(at: index) | ||
guard self.tableView.numberOfRows(inSection: .zero) != .zero else { | ||
return | ||
} | ||
self.tableView.selectRow(at: newindexPath, animated: true, scrollPosition: .middle) | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
performBatchUpdates 한번 써보실래요?!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 부분은 setEditing 메소드를 오버라이드 해주면서 제거되었습니다.
알려주신 메소드는 궁금해서 찾아보았는데 왜 추천해주셨는지 알것 같네요.
조언 감사드립니다~! 😁
- moreViewbuttonTapped 내부에 shareHandler, deleteHandler 파라미터 부분을 개행하지 않고 메소드로 분리 - textViewDidChange 내부에 guard문 부터 분리
- selectedIndex 프로퍼티 추가하여 선택된 셀 관리 - setEditing 메서드 override 하여 셀의 편집을 시작하고 종료할 때마다 셀을 선택하도록 구현 - 셀이 추가될 때마다 selectedIndex에 새로운 인덱스 업데이트 하도록 구현 - 셀을 삭제할 때마다 selectedIndex를 변경하도록 기능 추가
- selectedIndex에 didSet을 추가하여 값이 변동될 때 마다 selectRow 메소드 호출 - insertCell 내부 selectRow 메소드 호출하는 부분 제거 - SwiftLint에 제외할 룰 추가 및 불필요한 룰 제거
안녕하세요 아리 호박~ 궁금한 부분이나 문제가 될 법한 부분들 온라인으로 리뷰 완료했고, 코드별 코멘트 달아두었습니다. 확인해주세요! 다음 리뷰때 봬요 :)
ㄴ
ㄴ
ㄴ
ㄴ
ㄴ
|
안녕하세요. 웨더! @SungPyo
호박 @hoBahk 아리 @leeari95 입니다!
STEP2 요구사항 모두 구현하여 PR 보내드립니다.
혹시 부족한 점이나 놓친 부분이 있다면 번거롭더라도 한번 더 짚어주시면 감사하겠습니다. 🙇🏻♀️
고민했던 점
1. 코어데이터를 관리하는 매니저 타입 구현
PersistentManager
구현Predicate
,Sort
등을 유연하게 할 수 있도록 파라미터 별도 구현2. 사용자 친화적인 UI를 구현
3. 제목과 본문의 폰트를 다르게 하여 구분하는 기능 구현
AttributtedString
을 사용하여 TextView의 제목과 본문의 폰트를 다르게 하여 사용자가 보기에 편하도록 구현shouldChangeTextIn
)와 textView의typingAttributes
프로퍼티를 사용하여 입력중에도 제목과 본문에 맞는 폰트가 적용되도록 구현궁금했던 것 / 조언이 필요한 점
1. 본문에 title에서 줄바꿈하면 커서가 커지는 현상
같을 경우
else문을 타고 textView의 typingAttributes을headerAttributes
로 할당하는 부분 때문에 해당 문제가 발생하는 것 같습니다.2. UIContextualAction의 handler의 completeHandeler는 어떤 역할을 하는 것일까요?
complitionHandler(true)
를 사용하는 예제를 많이 접했습니다.작업의 수행 결과를 전달해주는 역할
을 하는걸까요? 이에 대한 웨더의 조언이 필요합니다!3. Name Space 관리
4. PersistentManager에 대하여
5. NSFetchRequest - returnsObjectsAsFaults 속성은 어떤 역할을 하는 것일까요?
이번 피드백도 잘 부탁드리겠습니다~ 😁🙏🏻