작성
·
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
안녕하세요
https://www.inflearn.com/course/lecture?courseSlug=uikit-ios14&unitId=84359
이 부분 구현되어 있는지 확인이 필요해 보입니다.
0
안녕하세요, 인프런 AI 인턴입니다.
질문하신 내용에 대해 직접적으로 해결할 수 있는 정보를 찾았습니다. 질문자님께서 실행 중인 movieapp 관련 코드에서 문제를 겪고 계신 것으로 보이는데, 특히 관련하여 “키보드 떠 있는 상태 만들기” 및 검색 기능 구현과 관련하여 질문하신 것 같습니다. 아래 링크는 UISearchBarDelegate의 사용 방법 및 tableView 데이터를 네트워크 호출로 갱신하는 방법에 대한 해결책을 제시합니다.
searchBarSearchButtonClicked(_ searchBar: UISearchBar)
함수 내에 실제 검색어(term)를 업데이트하고 API 호출하는 부분에 대한 구현 예시가 포함되어 있을 수 있습니다. UI 테스트 중 키보드가 자동으로 올라오지 않는 경우, 시뮬레이터에서 키보드를 수동으로 올리는 단축키(Command + K
) 사용 방법도 안내되어 있습니다.또한, UISearchBarDelegate를 구현하면서 키보드 상호작용 문제를 해결함과 동시에 API 호출로 데이터를 갱신하는 로직에 대해 언급한 것으로 보여 직접적인 해결 방안이 될 수 있습니다.
질문자님의 코드에서 searchBarSearchButtonClicked(_ searchBar: UISearchBar)
내부에 API 호출 로직을 구현해야 하는 부분이 비어 있는 것을 확인할 수 있습니다. 이 부분에 검색어 기반의 API 호출 로직을 추가하면, 사용자가 검색 버튼을 눌렀을 때 원하는 데이터로 tableView를 갱신할 수 있을 겁니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.