본문 바로가기

iOS/트러블 슈팅6

[iOS] Image url 통해 가져와서 view에 띄우거나 갤러리 다운로드하는 방법 2가지 비교 이번에 unsplash의 api를 받아서 json 데이터를 확인해보니 신기한 점이 있었다. image는 따로 url 종류로 주어지고, 해당 url을 다시 받아와서 사용해야 한다는 것! 때문에 image를 다운로드 하여 imageView에 넣어주는 protocol을 하나 만들었다. protocol ImageViewDownloadable { var imageView: UIImageView { get set } } 그리고 extension으로 이 프로토콜을 채택하고 있다면 image를 보여줄 수도 있고, 갤러리에 다운받을 수도 있는 메서드들을 각각 구현하였다. 1. URLSession.shared.dataTask , @escaping closure 그렇게 만든 첫 방법은 dataTask의 @escaping c.. 2024. 2. 14.
[iOS] UICollectionViewFlowLayout으로 Pinterest Layout 구현하기 처음 과제로 받은 피그마에 Pinterest로 구현된 View를 보고, Compositional로 도전해야지! 라고 호기롭게 생각했다. 그러나 Compositional의 벽은 높았고.. item과 group, section으로 크기를 주는 것에서 item 크기들을 어떻게 다르게 줘야 할지 감이 안 잡히더라. Section별로는 쉬운데!! 다른 라이브러리들을 까보면, Compositional + Combine의 조합으로 pinterest가 구현되어 있었다. 그러나 RxSwift나 Combine을 아직 잘 모르는데, 과제 기간은 매우 짧았기에 차마 이번에 도전할 자신은 없었다. 이미 collectionView, diffable data source, compositional 등 처음 써보는 것이 산더미..... 2024. 1. 31.
[iOS] Test 파일을 넣을 Asset 생성시 오류_ Bundle 사용 테스트용 JSON 파일은 이후에는 사용하지 않을 것이기에 test 폴더에 따로 Asset catalog를 만들어서 그곳에서만 넣어두고 사용하고 싶었다. 때문에 폴더를 하나 만들어서 이름을 Json.xcassets 으로 선언하고 그 안에 파일을 넣었다. 그런데 asset catalog의 모양이 기존의 것과는 달랐다. 확인해보니 asset catalog를 만들때는 단순하게 폴더를 만드는 것이 아니라 File → New → File을 타고 들어가 Resource의 Asset Catalog를 선택하여 만들어야 했다. 그 후 test code를 작성하여 돌리는데 이번에는 NSDataAsset을 가져오는 guard문에서 계속 retrun으로 빠지며 종료되었다. guard let json = NSDataAsset(n.. 2024. 1. 28.
[iOS] TableViewCell에서 layoutMarginsGuide 사용 테이블뷰의 Custom Cell을 설정할 때 처음에 제약조건을 ContentView에만 맞췄다. private func configureCellConstraint() { NSLayoutConstraint.activate([ contentStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), contentStackView.topAnchor.constraint(equalTo: contentView.topAnchor), contentStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), contentStackView.bottomAnchor.constraint(e.. 2024. 1. 6.
[iOS] CoreData에서 특정 Entity 내부에 있는 Entity의 특정값을 가져오고 싶을 때(NSPredicate) 코어데이터를 사용하는 방법을 연습하다가 생긴 일이다. 먼저 entity로는 UserMO와 JokeMO 두개가 있다. User와 Joke는 Model도 있다. 여기서 보면 알 수 있듯이 User는 Joke 배열을 가지고 있다. 때문에 특정한 User의 특정 카테고리를 갖는 Joke만 선별하고 싶은 과정에서 문제가 있었다. func fetchWithPredicate(currentUser: User, currentCategory: Category) -> [Joke] { var jokes = [Joke]() let fetchRequest: NSFetchRequest = UserMO.fetchRequest() let idPredicate = NSPredicate(format: "id = %@", currentUs.. 2023. 12. 20.
[iOS] storyboard에서 custom init을 한 경우 required init이 필요한 이유 view controller에서 init을 생성해주려면 왜 required init이 필요할까? required init은 필수 생성자로 부모 클래스에 생성되어 있다면 자식 클래스에서는 필수로 생성해주어야 한다. 단, 지정 생성자를 따로 작성하는 경우에만. 부모 클래스의 생성자들을 그대로 받을 경우에는 따로 생성해 줄 필요가 없다. view controller는 UIViewController를 상속받는다. class firstViewController: UIViewController 그리고 UIViewController는 NSCoding이라는 프로토콜을 채택하고 있다. class UIViewController: NSCoding 이 NSCoding 프로토콜에는 required init으로 NSCoder를 .. 2023. 11. 9.