해결된 질문
작성
·
376
·
수정됨
0
강의를 여러번 다시 들으니 MVVM에 대해 조금 더 이해하게 된것 같습니다.
다만 강의를 여러번 다시 들었는데도 응용하기가 조금 어려워서 질문드립니다.
PostViewController와 PostViewModel 처럼 뷰컨트롤러나 하위뷰 들도 그저 내용만 표시하는것이라면 강의내용을 따라서 잘 응용하고있습니다.
하지만 하위 뷰들에서 input과 output이 추가된다면 어떻게 응용해야할지 잘 모르겠습니다.
예를 들어 예제의 PostTableViewCell 에서는 titleLabel과 detailsLabel 밖에 없지만 PostTableViewCell에 textFeild와 같은 input이 추가되고 셀에서 입력한것이 상위뷰인 PostViewController에 표시된다고 했을 때
제가 생각했을 때는 PostTableViewCell에서 상위뷰로 데이터를 전달하려면 PostViewModel을 알아야할것 같은데 제가 생각하기엔 이렇게 하는 방법밖에 없는것 같은데
final class PostsViewModel: ViewModelType {
...
let postTableViewCellInput = PublishSubject<String>()
...
}
final class PostTableViewCell: UITableViewCell {
...
@IBOutlet weak var textField: UITextField
func bind(_ viewModel: PostsViewModel) {
viewModel.postTableViewCellInput
.bind(to: textField.rx.text)
.disposed(by: disposeBag)
}
}
이렇게 코드를 짜면 PostTableViewCell이 상위 뷰모델을 받고 PostsViewModel도 하위 뷰의 데이터를 직접 전달받기 때문에 올바른 방법이 아닌것 같아 PostItemViewModel에 Input Output을 받는것으로 수정해보려 했지만 PostItemViewModel의 Intput output을 어떻게 설정해야 PostViewModel에서 하위뷰에서 입력한 데이터를 상위뷰에서 사용할 수 있을지 감이 안잡혀서 질문드립니다
답변 1
0
iOS에서 일반적으로 하위뷰에서 상위뷰로 데이터를 전달할 때는 Delegate 패턴을 사용합니다.
PostsViewController에 PostTableViewCellDelegate 프로토콜을 만들어 뷰 간에 처리할 작업을 함수로 명시하고(ex. did~ 처리할 작업을 잘 나타내는 함수명으로 지으시면 됩니다)
PostsViewController가 이 프로토콜을 구현하도록 만들고
PostTableViewCell에 delegate라는 프로퍼티를 PostTableViewCellDelegate 타입으로 만든 뒤
PostsViewController에서 PostTableViewCell을 생성할 때 PostTableViewCell이 가진 delegate 프로퍼티에 자신의 참조(self)를 넘겨주고
PostTableViewCell에서 어떤 입력이 발생했을 때 delegate의 메서드를 사용해서 동기화하면 되지 않을까 합니다.
이렇게하면 하위뷰인 PostTableViewCell이 상위뷰인 PostsViewController를 직접 참조하거나 상위뷰의 뷰모델인 PostsViewModel을 알지 않아도 됩니다. 그리고 의존관계를 쉽게 관리하려면 하나의 뷰모델은 하나의 뷰 컨트롤러에서만 의존하도록 만드는 것이 좋습니다.
감사합니다!