카테고리 없음

202208026이종윤iOS프로그래밍12주차과제

jong133 2026. 6. 1. 16:47

네이게이션 컨트롤러와 세규에이를 쓴다.

 

 

네비게이션 컨트롤러 다음에 테이블 뷰를 넘어가게 하면은 네이게이션 바가 생성이 된다.
네비게이션 컨트롤러를 추가하면 바뀌는 내용
framework를 추가하는 방법이다. 지금은 에러가 안나도 이렇게 안하면 나중에 에러가 날수 있다.
하루에 최대 20번 쓸수있다.
화면에 나오는 root view controller는 최상위 뷰 컨트롤러

prepare(for:sender:) 메소드는 iOS 앱에서 화면 전환(Segue)이 일어나기 직전에 호출되는 메소드입니다. 주로 전환되는 다음 화면(목적지 뷰 컨트롤러)에 필요한 데이터를 전달하거나 초기 설정을 하는 용도로 사용됩니다. [1]
이해를 돕기 위해 스토리보드를 활용한 기본적인 사용법과 예시를 정리해 드립니다.

💡 prepare(for:sender:) 작성 패턴
이 메소드를 사용할 때는 보통 다음과 같은 구조를 가집니다.
  1. Identifier(식별자) 확인: 여러 화면 전환이 있을 수 있으므로 어떤 Segue인지 확인합니다.
  2. Destination(목적지) 가져오기: 이동할 뷰 컨트롤러의 인스턴스를 가져옵니다.
  3. 데이터 전달: 목적지 뷰 컨트롤러의 프로퍼티에 데이터를 대입합니다.

📝 실제 코드 예시
예를 들어, A 화면(입력 화면)에서 B 화면(결과 화면)으로 넘어가며 사용자가 입력한 String 데이터를 전달하는 상황입니다.
swift
import UIKit

class FirstViewController: UIViewController {

    @IBOutlet weak var nameTextField: UITextField!
    
    // Segue가 실행되기 직전에 호출되는 메소드
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        // 1. Segue의 식별자 확인 (스토리보드에서 설정한 Segue ID)
        if segue.identifier == "showResultSegue" {
            
            // 2. 목적지 뷰 컨트롤러(SecondViewController) 가져오기
            if let destinationVC = segue.destination as? SecondViewController {
                
                // 3. 목적지 뷰 컨트롤러의 변수에 데이터 전달
                destinationVC.receivedName = nameTextField.text
            }
        }
    }
}

class SecondViewController: UIViewController {
    
    // 이전 화면에서 데이터를 받을 변수
    var receivedName: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 전달받은 데이터를 화면에 표시하거나 활용
        print("전달받은 이름: \(receivedName ?? "없음")")
    }
}
코드를 사용할 때는 주의가 필요합니다.
 

⚠️ 필수 확인 사항 (Step-by-Step)
이 코드가 정상적으로 작동하려면 반드시 Xcode 스토리보드에서 다음 2가지를 설정해야 합니다.
  1. Segue Identifier 지정: 스토리보드의 Segue 라인을 클릭하고 우측 Attributes Inspector에서 Identifier를 코드와 동일하게(showResultSegue) 적어줍니다.
  2. Destination Class 확인: Segue의 목적지 뷰 컨트롤러를 클릭하고 Identity Inspector에서 Class가 SecondViewController로 정확히 지정되어 있는지 확인합니다.
a.b.com 사이트를 보여주는 스위프트 소스를 작성하고 설명해줘
 
 
스위프트(Swift)에서 특정 웹사이트(a.b.com)를 화면에 보여주기 위해 가장 널리 쓰이는 표준 방식은 WebKit 프레임워크의 WKWebView를 사용하는 것입니다.
iOS 앱에서 웹 화면을 띄우는 전체 소스 코드와 핵심 설명을 정리해 드립니다.

💻 WKWebView를 활용한 소스 코드
iOS 13 버전 이상에서 스토리보드 없이 코드로만 뷰를 구성할 때 사용하는 가장 깔끔한 기본 UIViewController 형태입니다.
swift
import UIKit
import WebKit

class WebViewController: UIViewController, WKNavigationDelegate {

    // 1. 웹뷰 인스턴스 생성
    var webView: WKWebView!

    override func loadView() {
        // 웹뷰 설정 및 초기화
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        
        // 탐색 이벤트를 처리할 대리자(Delegate) 설정
        webView.navigationDelegate = self
        
        // 루트 뷰를 웹뷰로 지정
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // 2. 보여주고자 하는 URL 주소 정의
        let urlString = "https://b.com"
        
        // 3. URL 구조체 생성 및 안전한 언래핑
        guard let myURL = URL(string: urlString) else {
            print("올바르지 않은 URL 형식입니다.")
            return
        }
        
        // 4. URL Request 객체 생성 후 웹뷰에 로드
        let myRequest = URLRequest(url: myURL)
        webView.load(myRequest)
    }
}
코드를 사용할 때는 주의가 필요합니다.
 

🔍 코드 핵심 동작 설명
  • import WebKit: 웹 콘텐츠를 앱 내에 표시하고 제어할 수 있게 해주는 애플의 전용 프레임워크를 불러옵니다.
  • WKWebView: 과거에 쓰이던 UIWebView를 대체하는 고성능 웹 브라우저 엔진 뷰입니다.
  • loadView(): 컨트롤러의 기본 뷰를 생성하는 시점입니다. 여기서 화면 전체 크기를 웹뷰(view = webView)로 교체하여 꽉 찬 웹 화면을 만듭니다.
  • URL(string:): 문자열을 스위프트가 인식할 수 있는 실제 URL 객체로 변환합니다. 주소가 잘못되었을 경우를 대비해 guard let 문으로 안전하게 예외 처리를 합니다.
  • URLRequest: 서버에 요청할 URL 정보와 옵션을 담는 바구니 역할을 합니다.
  • webView.load(myRequest): 완성된 요청서(Request)를 웹뷰 엔진에 던져서 실제로 페이지를 부르고 화면에 렌더링하기 시작합니다.

⚠️ 필수 앱 설정 변경 (App Transport Security)
만약 연결하려는 a.b.com 사이트가 보안 연결(https://)이 아닌 일반 HTTP(http://b.com) 프로토콜을 사용한다면, iOS의 보안 정책 때문에 페이지가 열리지 않고 흰 화면만 나옵니다.
이 경우 프로젝트의 Info.plist 파일에 아래 옵션을 추가해 주어야 접속이 허용됩니다.
  1. Info.plist 파일을 엽니다.
  2. App Transport Security Settings 딕셔너리를 추가합니다.
  3. 그 하위에 Allow Arbitrary Loads 키를 추가하고 값을 YES로 변경합니다. [1]

 

 


load다음에 왜 request를 쓰니?
 
 
webView.load() 메소드가 URL 주소 하나만 받지 않고, 굳이 URLRequest라는 객체를 한 번 더 감싸서 받는 이유는 웹 서버와 통신할 때 주소 외에도 전달해야 하는 '추가 정보'가 많기 때문입니다.
이유를 쉽게 이해하실 수 있도록 택배에 비유하여 설명해 드립니다.

📦 URL과 URLRequest의 차이 (택배 비유)
  • URL (주소지): 단순히 "서울시 강남구 역삼동 123"과 같은 목적지 주소일 뿐입니다.
  • URLRequest (택배 상자와 송장): 주소(URL)를 포함하여, 물건을 보낼 때 필요한 모든 옵션과 정보(보내는 사람, 배송 요청 사항, 내용물 등)를 한데 모아놓은 상자입니다.

🛠️ URLRequest를 사용해서 얻는 장점 (추가 기능)
단순히 페이지를 열 때는 URL만 있으면 될 것 같지만, 실제 앱 개발에서는 웹 서버에 다음과 같은 복잡한 요청을 보내야 할 때가 많습니다. URLRequest는 이 정보들을 모두 담을 수 있습니다.
  • 로그인 상태 유지 (헤더 정보): "이 사용자는 이미 인증된 회원입니다"라는 토큰(Token)이나 쿠키(Cookie) 정보를 담아 보낼 수 있습니다.
  • 데이터 전송 방식 결정 (HTTP Method): 웹페이지를 단순히 보여달라는 요청(GET)인지, 사용자가 작성한 글이나 파일을 서버로 전송하는 요청(POST)인지 설정합니다.
  • 캐시 정책 설정 (Cache Policy): "매번 새로운 페이지를 서버에서 받아올 것인가", 아니면 "기존에 저장된 스마트폰 내부 데이터(캐시)를 보여줄 것인가"를 결정합니다.
  • 타임아웃(제한 시간) 설정: 인터넷이 느릴 때 "몇 초 동안 반응이 없으면 연결을 끊을 것인가"를 정합니다.

💡 한 줄 요약
스위프트의 WKWebView는 단순히 주소(URL)로 이동하는 기능뿐만 아니라, 서버와 복잡한 통신을 안전하고 다양하게 제어할 수 있도록 설계되었기 때문에 URLRequest를 매개변수로 받도록 만들어져 있습니다.

 

내가 평소에 관심있는 피파랭킹같은거를 해봐야겠다. 월드컵이 곧 시작이기 때문이다!