본문 바로가기
YAGOM CAREER STARTER

[TIL] 20230227: instantiateViewController

by Rhode 2023. 2. 28.

본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.


instantiateViewController(identifier:creator:)

데이터 전송을 하기 위해 원래 작성했던 코드는 다음과 같다:

두 번째 뷰컨

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
     let abc = exhibitItems[indexPath.row]
     let exhibitItemView: ExhibitItemViewController = ExhibitItemViewController.init(navigationTitle:
abc.name, descriptionText: abc.description, imageName: abc.imageName)
     
     navigationController?.pushViewController(exhibitItemView, animated: true)
     tableView.deselectRow(at: indexPath, animated: true)
 }

 

세 번째 뷰컨

import UIKit

final class ExhibitItemViewController: UIViewController {
    
    @IBOutlet private weak var imageView: UIImageView?
    @IBOutlet private weak var descriptionLabel: UILabel?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
        
    init(navigationTitle: String, descriptionText: String, imageName: String) {
        super.init(nibName: "ExhibitItemView.nib", bundle: nil)
        self.imageView?.image = UIImage(named: imageName)
        self.descriptionLabel?.text = descriptionText
        navigationItem.title = navigationTitle
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

그런데, 이렇게 코드를 짜게 되면 다음과 같은 에러가 뜬다.

 

최종적으로 데이터를 넘겨주기 위해 사용한 코드는 다음과 같다:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if let itemDetailView: ItemDetailViewController = storyboard?.instantiateViewController(identifier:
ItemDetailViewController.identifier, creator: { creator in
        let item = self.exhibitItems[indexPath.row]
        let itemDetailViewController = ItemDetailViewController(item: item, coder: creator)
        
        return itemDetailViewController
    }) {
        navigationController?.pushViewController(itemDetailView, animated: true)
    }
    
    tableView.deselectRow(at: indexPath, animated: true)
}

그래서 오늘은 instantiateViewController(identifier:creator:)를 공부해봤다.

 

 

 

 

 

 

 

참조

https://developer.apple.com/documentation/uikit/uistoryboard/3213989-instantiateviewcontroller

 

instantiateViewController(identifier:creator:) | Apple Developer Documentation

Creates the specified view controller from the storyboard and initializes it using your custom initialization code.

developer.apple.com