100 days of Swift - Day 17

sun02·2021년 9월 2일
0

100 days of Swift 

목록 보기
18/40
class DetailViewController: UIViewController {
	@IBOutlet var imageView: UIImageView!
    
    	override func viewDidLoad() {
        	super.viewDidLoad()
        }
}

  • IBOutlet
    : Xcode에게 이 코드라인과 인터페이스 빌드 사이에 연결이 있다는 것을 알려준다.

  • var imageView: UIImageView!
    : 프로퍼티가 UIImageView 유형임을 선언한다. 강제 옵셔널 언래핑 "!" 은 UIImageVIew가 존재할 수도 존재하지 않을 수도 있지만 우리가 사용하려는 시점에는 존재한다고 확신한다는 의미이다.

    • DetailViewController가 처음 생성되었을 때는 UIImageView는 만들어지지 않았기 떄문에 존재하지 않지만 이를 위한 메모리 공간은 필요하다. 이때 imageView 프로퍼티는 nil 이거나 빈 메모리 공간이다. 하지만 뷰가 로드되고 outlet이 연결되면서 UIImageView은 nil이 아닌 실제 UIImageView를 가리키므로 이제 이것을 사용할 수 있다.

      즉, nil로 시작하지만 우리가 사용하기 이전에 값이 설정되기 때문에 우리가 사용하려고 할 때에는 절대 nil이 아니라는 것을 확신할 수 있다.

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let vc = storyboard?.instantiateViewController(identifier: "Detail") as? DetailViewController {
            	vc.selectedImage = pictures[indexPath.row]
            	navigationController?.pushViewController(vc, animated: true)
        }
    }
    
  • instantiateViewController(identifier: "Detail")
    : DetailViewController를 만들 때 main.storyboard에서 storyboard ID를 "Detail"로 지정했기 때문에 instantiateViewController 메서드를 사용하여 스토리보드에서 로드할 수 있다.
  • 모든 뷰 컨트롤러는 storyboard 라는 프로퍼티를 가지고 이것은 로드 된 스토리보드이거나 nil이다. ViewController의 경우 main.storyboard가 될 것이며 detailviewcontroller또한 같은 스토리 보드에 있으므로 거기서 로드될 것이다.
  • storyboard는 UIViewController에 속하지만 해당 뷰 컨트롤러가 스토리보드에서 왔는지 스위프트는 알지 못하기 때문에 옵셔널 ? 이다.
  • as? DetailViewController
    : "DetailViewController로 처리하려고 시도해라 그러나 실패한다면 아무것도 하지말고 계속 진행해라" 라는 의미이다.
  • 모든 것이 정확하다면 instantiateViewController()가 detailViewController를 불러오겠지만 instantiateViewController()의 반환 타입은 UIViewController이기 때문에 타입캐스팅(as?)를 하여 해당 값을 DetailViewController로 처리하도록 요청한다.
  • if let 구문
    : storyboard가 nil 이거나, instantiateViewController()에 유효하지 않은 storyboardID가 잇거나, 타입캐스팅 as?가 실패한다면 if let 구문은 실행되지 않는다.

if let imageToLoad = selectedImage {
     imageView.image = UIImage(named: imageToLoad)
}
  • if let imageToLoad = selectedImage { ///... }
    : 옵셔널인 selectedImage 값을 imageToLoad에 할당할 수 있다면 (값이 존재, 언래핑) if let 구문을 실행한다.

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.hidesBarsOnTap = true
    }
    
  • navigationController?.hidsBarsOnTap
    : 화면을 텝 할경우 네비게이션컨트롤러의 바가 숨겨진다.

 override func viewDidLoad() {
        super.viewDidLoad()
        
        title = "Storm Viewer"
        navigationController?.navigationBar.prefersLargeTitles = true
        
    }
  • navigationController?.navigationBar.prefersLargeTitles = true
    : 앱 전체에서 큰 제목을 사용할 수 있으며 제목이 고정되어있지 않다. 당기면 약간 늘어나고 위로 올리면 약간 축소된다.

 override func viewDidLoad() {
        super.viewDidLoad()
        
        title = selectedImage
        navigationItem.largeTitleDisplayMode = .never 
        
    }
  • title = selectedImage
    : view controller가 storyboard, navigationController 프로퍼티를 가지는 것처럼 title 프로퍼티도 가진다. 이것은 navigationController에 의해 자동으로 읽히고 상단의 네비게이션 바에 표시된다.

  • navigationItem.LargeTitleDisplayMode = .never
    : 해당 뷰 컨트롤러에서는 제목이 작게 보이길 바랄 때 사용한다.

  • Scale To Fill : 두 축(x, y축)에 빈 공간이 없도록 이미지 크기 조정
  • Aspect Fit : 이미지가 모두 보이도록 크기 조정
  • Aspect Fill : 사용 가능한 공간을 채우도록 이미지 크기 조정, 이 경우 이미지가 뷰 영역 바깥까지 나와있으므로 이미지가 넘치지 않도록 ClipToBounds를 활성화해야한다.

0개의 댓글