인프런 커뮤니티 질문&답변

fltkfltk1004님의 프로필 이미지
fltkfltk1004

작성한 질문수

UIKit - iOS14 실무 가이드 <iOS앱 진짜 개발자 되기>

movieapp 3 46분 실행이 안돼요ㅜㅜ

작성

·

44

·

수정됨

0

 

뭔가 제가 코드를 잘못 친걸수도 있는데 처음부터 보면서 비교했는데도 정말 모르겠어요ㅜㅜ...

알 수 있을까요?

moviemodel

//
//  MovieModel.swift
//  MovieApp


import Foundation

struct MovieModel: Codable{
    
    let resultCount: Int
    let results: [Result]
}

struct Result: Codable{
    let trackName: String
    let previewUrl: String
    let image: String
    
    //이름 똑같이 쓸거면 쓸필요 없다
    enum CodingKeys: String, CodingKey{
        case image = "artworkUrl100"
        case trackName
        case previewUrl
    }
}

moviecell

//
//  MovieCell.swift
//  MovieApp


import UIKit

class MovieCell: UITableViewCell{
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var dateLabel: UILabel!
    @IBOutlet weak var descriptionLabel: UILabel!
    @IBOutlet weak var priceLabel: UILabel!
    
    @IBOutlet weak var movieImageView: UIImageView!
    
    
    
}

viewcontroller

//
//  ViewController.swift
//  MovieApp


import UIKit

class ViewController: UIViewController {

    var movieModel: MovieModel?
    
    @IBOutlet weak var searchBar: UISearchBar!
    @IBOutlet weak var movieTableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        movieTableView.delegate = self
        movieTableView.dataSource = self
        searchBar.delegate = self
        
        requestMovieAPI()

    }

    //network 호출해서 뿌려주는 부분!
    //일종의 규격같은 느낌 이렇게들 씁니다
    func requestMovieAPI(){
        let sessionConfig = URLSessionConfiguration.default
        let session = URLSession(configuration: sessionConfig)
        
        // https://itunes.apple.com/search?term=marvel&media=movie
        var components = URLComponents(string: "https://itunes.apple.com/search")
        
        let term = URLQueryItem(name: "term", value: "marvel")
        let media = URLQueryItem(name: "media", value: "movie")
        
        components?.queryItems = [term, media]
        
        guard let url = components?.url else{
            return
        }
        
        var request = URLRequest(url: url)
        print(request)
        request.httpMethod = "GET"
        
        let task = session.dataTask(with: request) { data, response, error in
            // 제일 중요한 부분
            //statusCode
            //200 - 성공
            //300 - 다른 주소로 넘어가서 줄수있다(리다이렉션)
            //400 - 에러(내가 잘못해서)
            //500 - 서버, 네트워크가 아예 잘못된 경우
            print((response as! HTTPURLResponse).statusCode)
            
            if let hasData = data{
                
                do{
                    //규격에 맞춰 써야함 ituns api는 json타입으로 줌
                    self.movieModel = try JSONDecoder().decode(MovieModel.self, from: hasData)
                    print(self.movieModel ?? "no data")
                    
                    DispatchQueue.main.async{
                        //데이터 갱신
                        self.movieTableView.reloadData()
                    }
                    
                }catch{
                    print(error)
                }
            }
            
            
        }
        
        task.resume()
        session.finishTasksAndInvalidate()
    }

}

extension ViewController: UITableViewDelegate, UITableViewDataSource{ 
    
    //개수
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.movieModel?.results.count ?? 0
    }
    
    //MovieCell과 연결
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MovieCell", for: indexPath) as! MovieCell
        cell.titleLabel.text = self.movieModel?.results[indexPath.row].trackName
        
        return cell
    }
    
    
}

extension ViewController: UISearchBarDelegate{
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        
    }
}

답변 2

0

iOS Developer - 이정님의 프로필 이미지
iOS Developer - 이정
지식공유자

안녕하세요

 

https://www.inflearn.com/course/lecture?courseSlug=uikit-ios14&unitId=84359

 

이 부분 구현되어 있는지 확인이 필요해 보입니다.

0

안녕하세요, 인프런 AI 인턴입니다.

질문하신 내용에 대해 직접적으로 해결할 수 있는 정보를 찾았습니다. 질문자님께서 실행 중인 movieapp 관련 코드에서 문제를 겪고 계신 것으로 보이는데, 특히 관련하여 “키보드 떠 있는 상태 만들기” 및 검색 기능 구현과 관련하여 질문하신 것 같습니다. 아래 링크는 UISearchBarDelegate의 사용 방법 및 tableView 데이터를 네트워크 호출로 갱신하는 방법에 대한 해결책을 제시합니다.

  • “키보드 떠 있는 상태 만들기”에서는 searchBar에 키보드가 뜨지 않는 문제에 대한 해결책이 제시되어 있습니다. 특히 searchBarSearchButtonClicked(_ searchBar: UISearchBar) 함수 내에 실제 검색어(term)를 업데이트하고 API 호출하는 부분에 대한 구현 예시가 포함되어 있을 수 있습니다. UI 테스트 중 키보드가 자동으로 올라오지 않는 경우, 시뮬레이터에서 키보드를 수동으로 올리는 단축키(Command + K) 사용 방법도 안내되어 있습니다.

또한, UISearchBarDelegate를 구현하면서 키보드 상호작용 문제를 해결함과 동시에 API 호출로 데이터를 갱신하는 로직에 대해 언급한 것으로 보여 직접적인 해결 방안이 될 수 있습니다.

질문자님의 코드에서 searchBarSearchButtonClicked(_ searchBar: UISearchBar) 내부에 API 호출 로직을 구현해야 하는 부분이 비어 있는 것을 확인할 수 있습니다. 이 부분에 검색어 기반의 API 호출 로직을 추가하면, 사용자가 검색 버튼을 눌렀을 때 원하는 데이터로 tableView를 갱신할 수 있을 겁니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

fltkfltk1004님의 프로필 이미지
fltkfltk1004

작성한 질문수

질문하기