✔︎ 오늘의 정리
- 클래스와 구조체
- 인스턴스 프로퍼티와 타입 프로퍼티(method도 동일 ^_^)
- 뷰와 뷰 사이에 데이터 전달 / tag 활용하여 addTarget으로 값 바꾸기
- didset(property Observer)
- UserDefault
✔︎ Instance / Type
[Swift] instance / Type
클래스와 구조체에서 인스턴스 프로퍼티나 타입 프로퍼티, 인스턴스 메서드나 타입 메서드를 정의할 수 있다. 사실 메서드나 프로퍼티나 메서드와 프로퍼티라는 점이 다를뿐 인스턴스냐 타입
dk308c.tistory.com
✔︎ 뷰와 뷰 사이 데이터 전달 / tag 활용하여 addTarget으로 값 바꾸기
오늘 너무 신기했다...
내가 이거 여쭤봐야지!! 했던 걸 잭님이 모두 수업 시간에 설명해 주셨다
그래서 근가 정말 재미있었다
원래 하고 싶었던 코드로 화면 전환... 은 어제 했지만? 화면 전환 하면서 데이터 전달부터 오늘 CollectionViewCell 안에 있는 button에 연결된 값을 바꾸는 걸 배웠다.
뷰와 뷰 사이에 데이터 전달에 대해서 먼저 보려고 한다.
먼저, 데이터를 받을 변수를 필요한 뷰에 만들어 준다.
그 이후, 연결되어 있는 셀에서 데이터를 전달해 줬다.
let movie = list[indexPath.row]
cell.movie = movie
이 중, 저 코드 블럭에 있는 부분이 데이터를 전달한 부분이다.
스토리보드와 뷰컨트롤러를 연결한 경우에 연결한 뷰컨트롤러 내부의 변수에 맞는 친구를 담아줄 수도 있다. ^_^
tag 활용하여 addTarget으로 값 바꾸기
는 사실 위에 잠깐 나왔다.
봤는가?
바로 요기... ...
요 화면 중 ... ...
요 하트 버튼을 구현하는 파트이다.
// cell design
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MovieCollectionViewCell", for: indexPath) as? MovieCollectionViewCell else {
return UICollectionViewCell()
}
let movie = list[indexPath.row]
cell.movie = movie
cell.fillCell()
let row = indexPath.row
cell.likedButton.tag = row
cell.likedButton.addTarget(self, action: #selector(likedButtonTapped), for: .touchUpInside)
return cell
}
@objc func likedButtonTapped(_ sender: UIButton) {
list[sender.tag].liked.toggle()
}
사실 요렇게 봐야 완전하다.
코드 설명을 하자면, cell마다 있는 하트 버튼(likedButton)에 태그에 indexPath.row값을 넣어준다.
그러니까, 이 하트 버튼의 태그는 그 버튼이 현재 있는 위치를 알려주고 있다는 뜻이다!
이후, UIButton 안에 구현된 addTarget method를 이용해서 구현해 주면 된다.
addTarget method의 경우에는 target, action, events를 매개변수로 넣어주면 되는데, 보통 target의 경우에는 self, action의 경우에는 위에서 볼 수 있듯 #selector(objcFunctionName)를 이용해 작성한 함수 앞에 @objc 코드를 붙여서 해당 버튼을 어떤 event로 동작했을 때 어떤 함수가 실행될 수 있을지를 알려주면 된다.
맞다 위 깃 레포는 요기
https://github.com/andwecrawl/SeSAC/tree/main/week%2003/BOOKWARM%20Project
✔︎ UserDefault
UserDefault는 사실 이전에 했던 개념이다.
이번에 tableView로 만든 프로젝트에도 UserDefault 개념을 적용해 보려고 해 봤는데, UserDefault를 저장하는 데까지는 상관이 없으나, 키값을 가지고 불러오는 데서 난관이 생겼다.
바로바로~~ Array로 가져왔을 때 [Any]로 받아진다.
타입 캐스팅을 통해서 내가 기존에 넣었던 타입으로 타입 캐스팅을 하면 nil로 나왔다. ^_^ ... ... 몰까?
찾아보다가 그냥 얘는 hash한 값들만 대는갑다(뭔가 보면 String / Int / Float 같은 기존의 타입들만 들어가는 걸 보면 그 이유가 따로 있는 것 같았다.) 하고 넘겼는데
그 이유를 오늘 저녁에 알 수 있었다~~~!!!!!
바로바로 UserDefault는 기본적으로 hash한 값들이 아니라~~~ Raw한 값들만 저장될 수 있다.
따라서, 나는 구조체로 만든 타입을 멋대로 집어넣었다가 꺼내려고 했으니 삑난 것이다... ^_^
추후에 UserDefault에 내가 만든 타입 같이 raw 하지 않은 값들을 넣고 싶다면 인코딩과 디코딩을 이용해서 할 수 있다고 한다.
오늘 일찍 알았으면 조금 파봤을 텐데,,, 하는 생각이 들지만서도
그냥 지금 search도 구현 못했는데 이따 집 가면서 SearchController 읽어 봐야겠다.
https://developer.apple.com/documentation/uikit/uisearchcontroller
UISearchController | Apple Developer Documentation
A view controller that manages the display of search results based on interactions with a search bar.
developer.apple.com
https://johncodeos.com/how-to-make-a-stretchy-header-in-ios-using-swift/
How to make a Stretchy Header in iOS using Swift | John Codeos - Blog with Free iOS & Android Development Tutorials
In this tutorial, I'll show you step by step how to add a stretchy header in TableView, CollectionView, and ScrollView.
johncodeos.com
https://medium.com/@thomsmed/stretchy-table-header-view-ios-635a0e95d3c5
Stretchy table header view (iOS)
Give your UITableView header view an extra touch by making it stretch as the table view bounces past the edge of its content.
medium.com
생각난 김에 stretchy header도 ^_^
원래 Book어쩌고 프로젝트 위에 넣고 싶었는데 정신 차리고 보니 왜 ... 벌써 열 시인지 모르겠다
아니 d이젠 10시 반임
그래도 맛난간식이랑 비타오백덕분에너무행복해요 . . . . . . ^_^ 굿
'TIL' 카테고리의 다른 글
[SeSAC] August 3, 2023 (2) | 2023.08.04 |
---|---|
[SeSAC] August 2, 2023 (0) | 2023.08.02 |
[SeSAC] July 31, 2023 (0) | 2023.08.01 |
[SeSAC] July 27, 2023 (0) | 2023.07.28 |
[SeSAC] July 24, 2023 (0) | 2023.07.24 |