iOS 10강 MVVM 복습

린다·2021년 1월 28일
0

iOS beginner

목록 보기
11/14
post-thumbnail

MVVM

BountyViewController

Model

  • name, bounty 합친 object 만들면 좋겠다
  • BountyInfo 만들기

View

  • ListCell이 뷰 역할임
  • ListCell에 필요한 정보를 컨트롤러가 아니라 ViewModel한테서 받아야겠다
  • ListCell은 ViewModel로 부터 받은 정보로 뷰 업데이트 하기

ViewModel

  • 뷰컨트롤러가 모델에 바로 접근하면 안돼서 ViewModel 만들어야함
  • BountyViewModel을 만들고 뷰레이어에서 필요한 method만들기
  • 모델 가지고 있기(BountyInfo들)
    → 뷰 컨트롤러는 필요한 정보들을 뷰모델한테 물어봐야겠다~

DetailViewController

Model

  • name, bounty 합친 object 만들면 좋겠다
  • BountyInfo 만들기

View

  • imgView, nameLabel, bountyLabel
  • view들은 viewModel을 통해서 구성되기

ViewModel

  • DetailViewModel
  • 뷰레이어에서 필요한 메서드 만들기
  • 모델 가지고 있기 BountyInfo

Model 수정해주기

→ BountyViewController

  1. BountyInfo struct 만들기
struct BountyInfo{
	let name:String
	let bounty:Int

	var image: UIImage? {
		return UIImage(named:"\(name).jpg")
	}

	init(name: String, bounty:Int) { //초기화시켜줌
		self.name = name
		self.bounty = bounty
	}
}
  1. name, bountyList 대체하기
let bountyInfoList: [BountyInfo] = [BountyInfo(name: "", bounty: ), BountyInfo(),,,]
  1. 빌드해보고 뜨는 오류들 대체해주기
let bountyInfo = bountyInfoList[index]
vc?.name = bountyInfo.name
vc?.bounty = bountyInfo.bounty
---
return bountyInfoList.count
---
let bountyInfo = bountyInfoList[indexPath.row]
cell.imageView.image = bountyInfo.image
cell.nameLabel.text = bountyInfo.name
cell.bountyLabel.text = "\(bountyInfo.bounty)"

→ DetailViewController
1. BountyInfo 모델 모양의 변수 만들어주기

var bountyInfo: BountyInfo?
  1. 발생하는 오류 고쳐주기
    → BountyViewController부터 문제생겨서 이것부터 고쳐줘야함
vc?.bountyInfo = bountyInfo
//vc?.name = bountyInfo.name
//vc?.bounty = bountyInfo.bounty

→ DetailViewController

func updateUI() {
	if let bountyInfo = self.bountyInfo {
		imgView.image = bountyInfo.image
		nameLabel.text = bountyInfo.name
		bountyLabel.text = "\(bountyInfo.bounty)" 
	}
}

ViewModel 만들기

→ BountyViewController

  1. class 만들기
class BountyViewModel { //ViewModel이 Model가지고 있어야함!!!!
	let bountyInfoList: [BountyInfo] = [BountyInfo(), BountyInfo(),...]
}
  1. ViewModel 객체 생성
let viewModel = BountyViewModel()
  1. 생기는 오류들 처리(직접 Model에 접근하는 녀석들) → 대부분 ViewModel 안에서 method를 생성한 뒤 접근해야함
//리스트 숫자 세는 method(closure)
var numofBountyInfoList: Int {
	return bountyInfoList.count
}

return viewModel.numofBountyInfoList //viewmodel에서 먼저 접근~
---
//몇번째 index를 넘겨주면 해당하는 데이터를 넘겨주는 Method
func bountyInfo(at index:Int) -> BountyInfo {
	return bountyInfoList[index]
}

let bountyInfo = viewModel.bountyInfo(at: index)
let bountyInfo = viewModel.bountyInfo(at: indexPath.row)

→ DetailViewModel

  1. ViewModel 클래스 만들기
class DetailViewModel{
	var bountyInfo: BountyInfo?
}
  1. ViewModel 객체 만들기
let viewModel = DetailViewModel()
  1. 생기는 오류 고치기
if let bountyInfo = self.viewModel.bountyInfo {
	imgView.image = bountyInfo.image
	nameLabel.text = bountyInfo.name
	bountyLabel.text = "\(bountyInfo.bounty)" 
}
  • BountyViewController에서 발생하는 오류
vc?.bountyInfo = bountyInfo //vc의 bountyInfo에 바로 전달xx 이제 viewmodel이 가지고있음
---> DetailViewModel에서 모델을 업데이트시켜주는 function이 필요함
class DetailViewModel{
	var bountyInfo: BountyInfo?

	func update(model: BountyInfo?) {
		bountyInfo = model
	}
}
---
vc?.viewModel.update(model: bountyInfo)

View 고치기

  1. 지금 바운티뷰컨트롤러에서 직접 cell을 세팅해주고 있음
let bountyInfo = viewModel.bountyInfo(at:IndexPath.row)
cell.imgView.image = bountyInfo.image
cell.nameLabel.text = bountyInfo.name
cell.bountyLabel.text ="\(bountyInfo.bounty)"
  1. 이 부분은 셀 자체가 일하면 되는 부분임. 뷰컨트롤러가 가지고 있을 필요 없음 → 커스텀 셀 부분에 넣어주기
class ListCell: UITableViewCell {
	@IBOutlet 뭐시기
	@IBOutlet 뭐시기
	@IBOutlet 뭐시기

	func update(info: BountyInfo) {
		imgView.image = info.image
		nameLabel.text = info.name
		bountyLabel.text ="\(info.bounty)"
	}
}
  1. 뷰컨트롤러 코드 바꿔주기
let bountyInfo = viewModel.bountyInfo(at:IndexPath.row)
cell.update(info: bountyInfo)

  • BountyInfo (struct)는 따로 파일 생성해줘도됨
  • sort하는 법
var sortedList: [BountyInfo] {
	let sortedList = bountyInfoList.sorted {prev, next in
		return prev.bounty > next.bounty //앞에 있는 바운티가 뒤에 있는 바운티보다는 커야한다
	}
	return sortedList
}

---
//BountyViewModel 수정
func bountyInfo(at index:Int) -> BountyInfo {
	return sortedList[index]
}

0개의 댓글

관련 채용 정보