iOS 프로그래밍 13주차

2024. 11. 27. 16:48📱 모바일 프로그래밍/iOS 프로그래밍 기초

파일을 지울 때에는 Move to Trash를 누른다.

 

Video Scene 스토리보드와 VideoViewController 클래스 연결: identity inspector(시험)

 

무언갈 보여줄 때 쓰는 함수: present

 

가장 기본적인 소스

import UIKit
import AVKit

class VideoViewController: UIViewController {
    
    @IBAction func playVideo(_ sender: UIButton) {
        let videoPath = Bundle.main.path(forResource: "APT", ofType: "mp4")
        let videoURL = URL(filePath: videoPath!)
        let player = AVPlayer(url: videoURL)
        let playerController = AVPlayerViewController()
        playerController.player = player
        present(playerController, animated: true)
        player.play()
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Do any additional setup after loading the view.
    }
}

 

present(_:animated:completion:)

iOS에서 현재의 뷰 컨트롤러가 다른 뷰 컨트롤러를 화면에 표시하도록 하는 중요한 메서드이다. 이 메서드를 사용하면 모달 방식으로 새로운 화면(뷰 컨트롤러)을 사용자에게 보여줄 수 있다.

func present(_ viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)? = nil)

 

매개변수

  1. viewControllerToPresent:
    • 표시할 뷰 컨트롤러 객체입니다.
    • UIViewController 타입이며, 표시하려는 새 화면의 인스턴스를 전달합니다.
    • 예: AVPlayerViewController, UIAlertController 등.
  2. animated:
    • 화면 전환 시 애니메이션 효과를 적용할지 여부를 결정합니다.
    • true:
      • iOS 기본 애니메이션(슬라이드 위로, 페이드 등)을 사용하여 화면 전환.
    • false:
      • 애니메이션 없이 즉시 화면 전환.
  3. completion:
    • 화면 전환이 완료된 후 실행할 클로저입니다.
    • 선택 사항으로, 전환 후 실행할 작업이 필요 없으면 생략 가능합니다.
    • 기본값은 nil이며, 비워두면 아무 작업도 실행되지 않습니다.

 

optional 풀기 위해 guard let 사용

guard let videoPath = Bundle.main.path(forResource: "APT", ofType: "mp4") else {
            return
        }
                
        let videoURL = URL(filePath: videoPath)
        let player = AVPlayer(url: videoURL)
        let playerController = AVPlayerViewController()
        playerController.player = player
        present(playerController, animated: true)
        player.play()

 

, completion을 치면 나오는 자동완성

enter키를 누르면 나오는 자동완성

 

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621380-present

// APT.mp4 파일 경로를 안전하게 가져옵니다.
// guard let을 사용하여 파일 경로를 옵셔널 바인딩하고, 파일이 존재하지 않으면 return으로 메서드를 종료합니다.
guard let videoPath = Bundle.main.path(forResource: "APT", ofType: "mp4") else {
    return // 파일 경로를 찾을 수 없는 경우 아무 작업도 하지 않고 종료
}

// 파일 경로 문자열을 URL 객체로 변환합니다.
// iOS 16 이상에서 사용할 수 있는 URL(filePath:) 메서드를 사용하여 파일 경로 URL을 생성합니다.
let videoURL = URL(filePath: videoPath)

// AVPlayer 객체를 생성하여 비디오를 재생할 준비를 합니다.
// AVPlayer는 비디오 또는 오디오 파일 재생을 담당합니다.
let player = AVPlayer(url: videoURL)

// AVPlayerViewController를 생성하여 재생 UI를 제공합니다.
// AVPlayerViewController는 Apple이 제공하는 기본 비디오 재생 화면 컨트롤러입니다.
let playerController = AVPlayerViewController()

// AVPlayerViewController에 생성한 AVPlayer를 연결합니다.
// 이를 통해 AVPlayerViewController에서 비디오가 재생됩니다.
playerController.player = player

// 현재 뷰 컨트롤러에서 AVPlayerViewController를 화면에 표시합니다.
// animated: true로 설정하면 화면 전환 시 기본 애니메이션이 적용됩니다.
// 후행 클로저를 사용하여 화면 전환이 완료된 후 AVPlayer를 재생합니다.
present(playerController, animated: true) {
    player.play() // 화면이 표시된 후 비디오 재생을 시작합니다.
}

 

내장 웹 브라우저

 

timeoutInterval은 default값이 있다 

 

xcode 자동완성

//
//  WebViewController.swift
//  BMI_psa
//
//  Created by redmist on 11/27/24.
//

import UIKit
import WebKit

class WebViewController: UIViewController {
    @IBOutlet weak var webView: WKWebView!
    
    @IBAction func goNaver(_ sender: UIButton) {
        guard let url = URL(string: "https://logichome.org/g5/") else { return }
        let request = URLRequest(url: url)
        webView.load(request)
        
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        guard let url = URL(string: "https://sungah1030.tistory.com/") else { return }
        let request = URLRequest(url: url)
        webView.load(request)
    }
    
    
    /*
     // MARK: - Navigation
     
     // In a storyboard-based application, you will often want to do a little preparation before navigation
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
     // Get the new view controller using segue.destination.
     // Pass the selected object to the new view controller.
     }
     */
    
}

이소스를 리팩토링해줘

 

리팩토링

//
//  WebViewController.swift
//  BMI_psa
//
//  Created by redmist on 11/27/24.
//

import UIKit
import WebKit

class WebViewController: UIViewController {
    @IBOutlet weak var webView: WKWebView!
    
    // MARK: - View Lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()
        loadURL("https://sungah1030.tistory.com/")
    }
    
    // MARK: - Actions
    @IBAction func goNaver(_ sender: UIButton) {
        loadURL("https://logichome.org/g5/")
    }
    
    // MARK: - Helper Methods
    /// 주어진 URL 문자열을 WebView에서 로드합니다.
    /// - Parameter urlString: 로드할 URL 문자열
    private func loadURL(_ urlString: String) {
        guard let url = URL(string: urlString) else {
            print("Invalid URL: \(urlString)")
            return
        }
        let request = URLRequest(url: url)
        webView.load(request)
    }
}

 

문서화 

//
//  WebViewController.swift
//  BMI_psa
//
//  Created by redmist on 11/27/24.
//

import UIKit
import WebKit

/// WebViewController는 웹 페이지를 표시하는 뷰 컨트롤러입니다.
class WebViewController: UIViewController {
    
    @IBOutlet weak var webView: WKWebView! // WKWebView 인스턴스 연결

    // MARK: - View Lifecycle
    /// 뷰가 로드된 후 호출됩니다.
    override func viewDidLoad() {
        super.viewDidLoad()
        loadURL("https://sungah1030.tistory.com/") // 초기 웹 페이지 로드
    }
    
    // MARK: - Actions
    /// Naver 웹 페이지로 이동하는 버튼 액션입니다.
    /// - Parameter sender: 버튼
    @IBAction func goNaver(_ sender: UIButton) {
        loadURL("https://logichome.org/g5/") // Naver URL 로드
    }
    
    // MARK: - Helper Methods
    /// 주어진 URL 문자열을 WebView에서 로드합니다.
    /// - Parameter urlString: 로드할 URL 문자열
    private func loadURL(_ urlString: String) {
        // URL 문자열을 URL 객체로 변환합니다.
        guard let url = URL(string: urlString) else {
            print("Invalid URL: \(urlString)") // 유효하지 않은 URL의 경우 에러 메시지 출력
            return
        }
        let request = URLRequest(url: url) // URLRequest 객체 생성
        webView.load(request) // 웹 뷰에서 요청을 로드합니다.
    }
}

클래스 설명: WebViewController는 웹 페이지를 표시하는 기능을 가진 뷰 컨트롤러입니다.
프로퍼티 설명: webView는 웹 콘텐츠를 표시하는 WKWebView 인스턴스입니다.
메소드 설명:
viewDidLoad: 뷰가 로드된 후 초기 웹 페이지를 로드합니다.
goNaver: Naver 웹 페이지로 이동하는 버튼 액션입니다.
loadURL: 주어진 URL 문자열을 웹 뷰에서 로드하는 헬퍼 메소드입니다. 유효하지 않은 URL의 경우 에러 메시지를 출력합니다.

//
//  VideoViewController.swift
//  BMI_psa
//
//  Created by redmist on 11/27/24.
//

import UIKit
import AVKit

/// VideoViewController는 비디오 재생을 관리하는 뷰 컨트롤러입니다.
class VideoViewController: UIViewController {
    
    /// 비디오 재생 버튼을 눌렀을 때 호출되는 액션 메소드입니다.
    /// - Parameter sender: 비디오 재생 버튼
    @IBAction func playVideo(_ sender: UIButton) {
        // 비디오 파일의 경로를 가져옵니다.
        guard let videoPath = Bundle.main.path(forResource: "APT", ofType: "mp4") else {
            return // 비디오 파일을 찾을 수 없는 경우 메소드 종료
        }
                
        // 비디오 URL을 생성합니다.
        let videoURL = URL(fileURLWithPath: videoPath)
        let player = AVPlayer(url: videoURL) // AVPlayer 객체를 생성하여 비디오 URL을 전달합니다.
        let playerController = AVPlayerViewController() // AVPlayerViewController 객체를 생성합니다.
        playerController.player = player // playerController에 player를 설정합니다.
        
        // 비디오 플레이어를 화면에 표시하고 재생합니다.
        present(playerController, animated: true) {
            player.play() // 애니메이션이 완료된 후 비디오 재생 시작
        }
        
        /*
        // 주석 처리된 코드: 비디오 파일 경로를 가져오고 플레이어를 설정하는 또 다른 방법
        guard let filePath = Bundle.main.path(forResource: "APT", ofType: "mp4") else {
            print("Error: APT.mp4 파일을 찾을 수 없습니다.")
            return
        }
        
        let videoURL = URL(fileURLWithPath: filePath)
        let player = AVPlayer(url: videoURL)
        let playerViewController = AVPlayerViewController()
        playerViewController.player = player
        
        self.present(playerViewController, animated: true) {
            playerViewController.player?.play()
        }
        */
    }
    
    /// 뷰가 로드된 후 호출됩니다.
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 추가적인 뷰 설정을 수행할 수 있습니다.
    }
    
    /*
     // MARK: - Navigation
     
     // 스토리보드 기반 애플리케이션에서 네비게이션을 준비할 때 사용됩니다.
     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         // 새 뷰 컨트롤러를 가져오고 필요한 객체를 전달합니다.
     }
     */
}

클래스 설명: VideoViewController는 비디오 재생을 담당하는 뷰 컨트롤러입니다.
메소드 설명: playVideo 메소드는 비디오 재생 버튼 클릭 시 호출되며, 비디오 파일을 찾아 재생합니다.
주석 처리된 부분: 코드 중복을 피하기 위해 주석 처리된 코드가 있습니다.
viewDidLoad: 뷰가 로드된 후 추가적인 초기 설정을 할 수 있는 공간입니다.