iOS 프로그래밍(9)

김제형·2024년 11월 21일

tab bar controller 연결

  1. view contoroller 생성

  2. view contoroller 와 tab bar 연결
    키보드의 control 을 누르고 생긴 레이저를 view contoroller 와 이어준다.

    이렇게 하면 탭 바 를 중간에 두고 view를 왔다갔다 할 수 있는 view들을 만들 수 있다.

video view contoroller 연결

  1. File -> new -> file from templete 으로 cocoa templete을 VideoViewContoroller를 만든다.

  2. 새로 만든 view에 VideoViewContoroller를 연결한다.
    ( view와 class를 연결하는 위치 => identify inspector )

    꼭 view를 만들자 마자 연결해야한다.

버튼을 누르면 동영상이 재생되는 코드

path에서 값이 존재할 경우 String형으로 반환한다 하지만 값이 일치하지 않거나 존재하지 않을 경우 nil을 반환하므로 옵셔널 String 형으로 선언하는 것이다

경고

아직 videoPath를 사용하지 않아 불필요한 변수를 제거하라는 Xcode의 경고이다.

present 함수 (중요)

func present(
    _ viewControllerToPresent: UIViewController,
    animated flag: Bool,
    completion: (() -> Void)? = nil
)
  1. nil은 default 인자로서 사용하지 않아도 되게 자동으로 nil값이 들어가게 되어 굳이 completion에 nil을 따로 주지 않아도 된다.

코드 분석

1. 코드 생성?

이 부분에서 엔터키를 입력시 code 블록이 생기게 된다.

2. player 혼동?

playerController.player = player

.player는 playerController프로터티 이고 뒤 player는 위에서 만든 상수 player이다

3. 실행 순서?

  1. player를 먼저 실행하고 동영상재생 코드가 뒤에 실행하게 된다.
self.present(playerController, animated: true)
player.play()
  1. player가 실행이 완료되고 애니메이션이 끝나게 되면 동영상재생 코드가 실행된다.
self.present(playerController, animated: true) {
	player.play()
}

매개 변수

  1. viewControllerToPresent
    현재 뷰 컨트롤러의 콘텐츠 위에 표시할 뷰 컨트롤러.
  2. flag
    프레젠테이션을 애니메이션화하려면 true 쓰고 그렇지 않으면 false 써야한다.
  3. completion
    프레젠테이션이 끝난 후 실행될 블록을 지정하는 매개변수다. 이 블록은 값을 반환하지 않으며, 매개변수도 없다.
    이 매개변수에는 nil을 지정할 수도 있다.

명시적 함수 사용

내가 만든 함수가 아닌 부모클래스에서 만든 함수이기 때문에 self. 을 붙여 명시적으로 사용한다.

추가적으로 내가 부모클래스에서 함수를 가져와 재정의 하고자 하면 super를 붙여 사용해야 한다.

self.present(playerController, animated: true)

Webview 생성

  1. 새로운 view를 만들어 웹을 연결한다.

    deprecated -> 언제 사라지질 모르는 것이기 때문에 사용하면 안된다.

초기 자동 실행

  1. 앱을 키자마자 아래 버튼을 클릭하지 않고 기본적으로 처음 화면에 띄우고자 할때는 super.viewDidLoad() 아래 적어야 한다.

블로그 주소 missing?

  1. URL은 옵셔널 string 형으로 선언 되었기 때문에 nil의 대처 방안을 주지 않아 에러가 난 것이다.

    3-1. guard let
 guard let url = URL(string : "https://velog.io/@kim_jh/posts") else { return }
  • url에 nil 값이 들어가게 되면 조기 반환 시켜버린다.

리팩토링 + 문서화 ( chatgpt )

import UIKit
import WebKit

/// WebViewController는 `WKWebView`를 사용하여 웹 페이지를 로드하는 뷰 컨트롤러입니다.
class WebViewController: UIViewController {
    
    /// 웹 페이지를 표시하는 `WKWebView` 인스턴스
    @IBOutlet weak var WebView: WKWebView!

    /// 뷰가 로드될 때 호출됩니다. 초기 화면에서 `velog` 페이지를 로드합니다.
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 초기 로드: velog 페이지를 WebView에서 로드
        loadWebPage(urlString: "https://velog.io/@kim_jh/posts")
    }

    /// 버튼 클릭 시 호출됩니다. 지정된 URL을 WebView에서 로드합니다.
    ///
    /// - Parameter sender: 버튼을 눌렀을 때 전달되는 버튼 객체.
    @IBAction func btnWebVelog(_ sender: UIButton) {
        // 버튼 클릭 시에도 동일한 페이지를 로드
        loadWebPage(urlString: "https://velog.io/@kim_jh/posts")
    }

    /// 주어진 URL 문자열을 안전하게 `WebView`에 로드합니다.
    ///
    /// - Parameter urlString: 로드할 웹 페이지의 URL 문자열.
    /// - If the URL string is invalid, a message will be printed and the method will return without loading the page.
    ///
    /// - Returns: None. Loads the web page in the `WKWebView` if the URL is valid.
    func loadWebPage(urlString: String) {
        // 주어진 URL 문자열을 URL 객체로 변환
        guard let url = URL(string: urlString) else {
            // URL이 유효하지 않은 경우, 오류 메시지를 출력하고 종료
            print("유효하지 않은 URL입니다.")
            return
        }
        
        // URL을 기반으로 요청을 생성하고 WebView에 로드
        let request = URLRequest(url: url)
        WebView.load(request)
    }
}

주의 사항

Legacy = 빠른 수정이 필요한 페이지, 코드등을 뜻한다.

import UIKit에 포함되어있지 않은 메소드라 새로 import해주어야 한다 -> import WebKit

profile
개발자 지망생

0개의 댓글