Notice
Recent Posts
Recent Comments
Link
ยซ   2024/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

[iOS] WebView javaScript ํ•จ์ˆ˜ ํ˜ธ์ถœ๐Ÿ˜จ ๋ณธ๋ฌธ

โš ๏ธ deprecated โš ๏ธ/ํŠธ๋ฆฝํ”Œ๋žœ(TripPlan)

[iOS] WebView javaScript ํ•จ์ˆ˜ ํ˜ธ์ถœ๐Ÿ˜จ

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2021. 10. 25. 15:35

โœ… ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์›น๋ทฐ๋ฅผ ํ†ตํ•ด javaScript๋กœ ์ž‘์„ฑ๋œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ ์˜ˆ์ •์ด์•ผ.

ํ•˜๋‚˜ํ•˜๋‚˜ ๊ผผ๊ผผํžˆ ๋ณด๋‹ค๋ณด๋ฉด ๋ถ„๋ช…ํžˆ ๋‹ค ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์ด์—ˆ์ง€๋งŒ, WebView ๊ฐœ๋ฐœ๋กœ js๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์ž‘์—…ํ•˜๋Š”๊ฒŒ ์ต์ˆ™ํ•˜์ง€ ์•Š๋˜ ๋‚ด๊ฒŒ, ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ค์šด ์ž‘์—…์ด์—ˆ์–ด... (์—„์ฒญ๋‚œ ์‚ฝ์งˆ์˜ ๊ณผ์ •s)

(๊ทธ๋‚˜๋งˆ ๋‹คํ–‰์ธ๊ฑด, ์ง„๋กœ๋ฅผ ์ •ํ•˜๊ฒ ๋‹ค๊ณ  js๋ฅผ ๊ณต๋ถ€ํ•˜์—ฌ ์›น ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋˜ ๊ฒƒ์ด ์ •๋ง์ •๋ง ํฐ ๋„์›€์ด ๋˜์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค!)

 

 

โœ… ๋ชฉ์ฐจ

1๏ธโƒฃ ์›น ํ™˜๊ฒฝ์„ค์ • 

2๏ธโƒฃ iOS ํ™˜๊ฒฝ์„ค์ •

 

 

1๏ธโƒฃ ์›น ํ™˜๊ฒฝ์„ค์ •

 - ์šฐ์„  ๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ์ž์˜€๋‹ค๋ฉด, ์›น ํŽ˜์ด์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์„œ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ์ง€์— ๋Œ€ํ•ด์„œ ์ •๋ง ๋ง‰๋ง‰ํ•˜๊ฒ ์ง€?

๊ทธ! ๋ž˜! ์„œ!

๋‚ด๊ฐ€ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ•ด์ค„ ์˜ˆ์ •์ด์•ผ.

 

๐Ÿ”ถ 1. VSCode๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

๐Ÿ”ถ 2. node.js๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

https://nodejs.org/ko/

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

์œ„์˜ ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๋ฉด ์ด๋Ÿฐ ์‚ฌ์ดํŠธ๊ฐ€ ๋‚˜์˜ฌ๊ฑด๋ฐ, ๋Œ€๋ถ€๋ถ„ iOS ๊ฐœ๋ฐœ์ž๋“ค์€ ๋งฅ๋ถ์„ ์‚ฌ์šฉํ• ํ…Œ๋‹ˆ๊นŒ, ์ €๊ธฐ์„œ ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค.

๋‚˜๋Š” ๊ทธ๋ƒฅ ์™ผ์ชฝ์— ์žˆ๋Š” ์•ˆ์ •์ , ์‹ ๋ขฐ๋„ ๋†’์Œ์„ ์„ค์น˜ํ–ˆ์Œ

 -> ์˜ˆ์ „์— ์ž๋ฐ” ๋ฒ„์ „์„ ์˜ฌ๋ ค๋‘ฌ์„œ ์ง€์›์„ ํ•˜์ง€ ์•Š๋Š” ๋ช‡๋ช‡ ๋ฌธ์ œ์— ๋ถ€๋”ชํ˜€์„œ ๊ฒฐ๊ตญ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ํ–ˆ๋˜ ๊ธฐ์–ต์ด ์žˆ์–ด์„œ ์ตœ์‹ ๋ณด๋‹ค๋Š” ์•ˆ์ •์ ์œผ๋กœ ์ž˜ ๋Œ์•„๊ฐ€๋Š”๊ฒŒ ์งฑ!

LTS ํ™˜๊ฒฝ์„ค์ •

๐Ÿ”ถ 3. ์„ค์น˜๊ฐ€ ์ž˜ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ํ„ฐ๋ฏธ๋„๋กœ ์ž‘์—…ํ•˜๊ธฐ

VSCode๋ฅผ ์—ด์–ด์„œ ์ƒ๋‹จ ๋ฉ”๋‰ด๋ฐ”์— ์ƒˆ ํ„ฐ๋ฏธ๋„ ํด๋ฆญ!

์ƒ๋‹จ๋ฐ”์— ์ƒˆ ํ„ฐ๋ฏธ๋„ ํด๋ฆญ!
์ƒˆ ํ„ฐ๋ฏธ๋„ ํด๋ฆญ์‹œ ํ•˜๋‹จ์— ๋‚˜ํƒ€๋‚˜๋Š” ํ™”๋ฉด

์—ฌ๊ธฐ์„œ ํ„ฐ๋ฏธ๋„์— 

node --version

npm --version (node.js๋ฅผ ์„ค์น˜ํ•˜๋ฉด์„œ ํ•จ๊ป˜ ์„ค์น˜๋œ๋‹ค.)

 

๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด v ~ ๋ผ๊ณ  ๋‚˜์˜ฌ๊ฑฐ์•ผ

์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๋œ ๊ฒฐ๊ณผ

 

์ž ๊ทธ๋Ÿผ ์ •์ƒ์ ์œผ๋กœ ์„ค์น˜๋œ ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค๋ฉด ํ„ฐ๋ฏธ๋„์— ๋‹ค์Œ๊ณผ ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ๋ฉด ๋ผ

 

npm install -g nodemon

-> ๋งŒ์•ฝ ๊ถŒํ•œ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค๋ฉด sudo npm install -g nodemon๋กœ ์ž…๋ ฅํ•˜๊ธฐ

์„ค์น˜ ํ›„์—

npm install -g express-generator

-> ๋งŒ์•ฝ ๊ถŒํ•œ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค๋ฉด sudo npm install -g express-generator๋กœ ์ž…๋ ฅํ•˜๊ธฐ

 

๐Ÿ”ถ 4. ์œ„์˜ ์ž‘์—…์„ ์šฐ์„ ์ ์œผ๋กœ ์ž˜ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด ์ด์ œ๋Š” ํด๋”์—ด๊ธฐ๋ฅผ ํ•  ์˜ˆ์ •์ธ๋ฐ, ํด๋”๋ฅผ ์—ด์–ด์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํ”„๋กœ์ ํŠธ ํŒŒ์ผ๋ช…์„ ์ž‘์„ฑํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์—ด๊ธฐ!

 

ํด๋”๋ช…์€ ๋งˆ์Œ๋Œ€๋กœ ํ•˜๊ธฐ~!

 

ํด๋”๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ํ„ฐ๋ฏธ๋„์˜ ์‹œ์ž‘ ์œ„์น˜๊ฐ€ ์ž๊ธฐ๊ฐ€ ๋งŒ๋“  ํด๋”๋ช…์˜ ์œ„์น˜๋กœ ๋ฐ”๋€Œ์–ด ์žˆ์„๊ฑด๋ฐ,

์šฐ๋ฆฌ๊ฐ€ ์•„๊นŒ ์„ค์น˜ํ•œ express ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ„ฐ๋ฏธ๋„์— (ํ„ฐ๋ฏธ๋„์ด ๋‹ซํ˜€ ์žˆ๋‹ค๋ฉด ์ƒˆ ํ„ฐ๋ฏธ๋„ ์—ด์–ด์ฃผ๊ธฐ)

 

express --ejs ํด๋”๋ช…

 

(์˜ˆ์‹œ) ๋งŒ์•ฝ ๋‚ด๊ฐ€ ํด๋” ์—ด๊ธฐ๋ฅผ ํ†ตํ•ด ํด๋”๋ช…์„ TestExpress๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด

express --ejs TestExpress ๋ฅผ ํ„ฐ๋ฏธ๋„์— ์ž…๋ ฅํ•ด์ค€๋‹ค.

 

์ด ๊ณผ์ •์ด ๋๋‚˜๋ฉด ์•„๋ž˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ํŒŒ์ผ์ด ๋˜ญ! ํ•˜๊ณ  ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค.

๋˜ญ!

 

์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋ชฉํ•ด์•ผํ•  ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ๊ฑฐ ๋‹ค ๋ชจ๋ฅด๊ฒ ๊ณ ~! 

views - index.ejs ํŒŒ์ผ์„ ์ผ๋‹จ ๋ณด์ž.

 

๐Ÿ”ถ 5. index.ejs์— ์ž‘์„ฑํ•ด์ค„ ์ฝ”๋“œ

<!DOCTYPE html>
<html>
  <head>
    <!-- <title><%= title %></title> -->
    <link rel='stylesheet' href='/stylesheets/style.css' />
    


  <script type="text/javascript" charset="UTF-8">
    
    function callNative() {
       try {
          webkit.messageHandlers.callbackHandler.postMessage("MessageBody");
          print("callNative");
       } catch(err) {
           alert(err);
       }
    }


    function redHeader() {
       alert('redHeader() CALL');
       document.querySelector('h1').style.color = "red";
    }

    function funcName() {
       return "OK";
    }
  </script>
  </head>
  <body>
       
    <h1>IOS์šฉ ๋ฉ”์‹œ์ง€</h1>
    <br><input type="button" onclick= 'callNative()' value="๋„ค์ดํ‹ฐ๋ธŒ ํ•จ์ˆ˜ ํ˜ธ์ถœ"/>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    
  </body>
</html>

๐Ÿ”ถ 6. ์›น์—์„œ ๋ณด๊ธฐ ์œ„ํ•ด ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ • 

ํ„ฐ๋ฏธ๋„์—

nodemon ./bin/www

๋˜๋Š” nodemon start

๋‘˜์ค‘์— ํ•˜๋‚˜ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋ผ.

 

๊ทธ ์ดํ›„์— ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ 

http://localhost:3000/ ์ž…๋ ฅํ•ด์ฃผ๊ธฐ.

 

์›น์— ๋‚˜ํƒ€๋‚œ ๊ฒฐ๊ณผ

 

์ด๋Ÿฐ ์›น ์‚ฌ์ดํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด.

 

2๏ธโƒฃ iOS ํ™˜๊ฒฝ์„ค์ •

์—ฌ๊ธฐ ๋ถ€๋ถ„์€ Swift๋ฅผ ์ด์šฉํ•ด์„œ ์ž‘์—…ํ•  ์˜ˆ์ •์ด์•ผ.

Xcode์—ด๊ณ  ํ•˜๋Š” ์ž‘์—…์ด๋‹ˆ๊นŒ ๋ถ€๋‹ด์—†์ด ๋ ˆ์ธ ๊ณ ๊ณ !

 

๐Ÿ”ถ 1. ์Šคํ† ๋ฆฌ๋ณด๋“œ ์„ธํŒ…

 

์Šคํ† ๋ฆฌ๋ณด๋“œ

 

์›น๋ทฐ๋ฅผ ๋„ฃ์€ ๋‹ค์Œ์— ๋ ˆ์ด์•„์›ƒ ์žก์•„์ฃผ๋ฉด ๋!

 

๐Ÿ”ถ 2. ViewController.Swift ํŒŒ์ผ ์ž‘์„ฑํ•˜๊ธฐ

import UIKit
import WebKit

class ViewController: UIViewController,
                      WKNavigationDelegate,
                      WKUIDelegate,
                      WKScriptMessageHandler
{

	@IBOutlet weak var webView: WKWebView! // ์Šคํ† ๋ฆฌ๋ณด๋“œ์˜ ์›น๋ทฐ ์—ฐ๊ฒฐํ•œ ์•„์›ƒ๋ › ๋ณ€์ˆ˜
    
    var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() 
    // ์›น๋ทฐ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ํ•„์š”ํ•œ ์ธ๋””์ผ€์ดํ„ฐ

    override func viewDidLoad() {
        super.viewDidLoad()
       
        let myBlog = "http://localhost:3000" // express ํ†ตํ•ด์„œ ์—ฐ URL ๋งํฌ
        let url = URL(string: myBlog) // URL ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ
        let request = URLRequest(url: url!) // Request ์ค€๋น„
        
        let contentController = WKUserContentController() // js๋ž‘ ํ†ต์‹ ํ•ด์„œ ๋ฐ›์•„์˜จ ๊ฐ’ ๋‹ค๋ฃฐ ํ•ธ๋“ค๋Ÿฌ
        let config = WKWebViewConfiguration() // ์›น ๋ทฐ๋ฅผ ์Šคํ† ๋ฆฌ๋ณด๋“œ ํ˜•์‹์œผ๋กœ ๋งŒ๋“ค ์‹œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ. ํ•˜์ง€๋งŒ ์•Œ์•„๋‘๊ธฐ
        
        // native -> js call (๋ฌธ์„œ ์‹œ์ž‘์‹œ์—๋งŒ ๊ฐ€๋Šฅํ•œ, ํ™˜๊ฒฝ์„ค์ •์œผ๋กœ ์‚ฌ์šฉํ•จ), source๋ถ€๋ถ„์— ํ•จ์ˆ˜ ๋Œ€์‹  HTML์ง์ ‘ ์‚ฝ์ž… ๊ฐ€๋Šฅ
        let userScript = WKUserScript(source: "redHeader()", injectionTime: .atDocumentEnd, forMainFrameOnly: true)
        contentController.addUserScript(userScript)
        
        // js -> native call : name์˜ ๊ฐ’์„ ์ง€์ •ํ•˜์—ฌ, js์—์„œ webkit.messageHandlers.NAME.postMessage("");์™€ ์—ฐ๋™๋˜๋Š” ๊ฒƒ, userContentControllerํ•จ์ˆ˜์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค
        contentController.add(self, name: "callbackHandler")
        
        config.userContentController = contentController
        
        webView.uiDelegate = self
        webView.navigationDelegate = self
        
        // native -> js call page์— js๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•
        webView.evaluateJavaScript("javascript:redHeader()", completionHandler: { msg, err in
            print(msg)
            print(err?.localizedDescription)
        })
        webView.load(request) // ์›น๋ทฐ๋ฅผ ๋กœ๋“œํ•ด์•ผ์ง€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด.
    }
    
    
    // JS -> Native CALL
    @available(iOS 8.0, *)
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage){
        // message.name์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค.
        if(message.name == "callbackHandler"){
            print(message.body)
            abc()
        }
    }
    
    func abc(){
        print("abc call")
    }
    
    // WebView๊ฐ€ ๋กœ๋“œ๊ฐ€ ๋๋‚œ ์‹œ์ ์— ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    
        webView.evaluateJavaScript("javascript:redHeader()", completionHandler: { msg, err in
            print(msg)
            print(err?.localizedDescription)
        })
    }
    
} // ViewController

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ViewController ํŒŒ์ผ์— ๋Œ€ํ•œ ์ฝ”๋“œ์ด๋‹ค.

 

์•„์ฃผ ๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ๋“ค๋งŒ ๋‹ด๊ณ  ์žˆ์–ด์„œ, ์ž์„ธํ•œ ๋ถ€๋ถ„์€ ์ฐธ๊ณ ๋กœ ๊ฐ€์„œ ํ™•์ธํ•ด๋ณด๋ฉด ๋”์šฑ ์ข‹๋‹ค.

 

๐Ÿ”ถ 3. ๊ฒฐ๊ณผ๋ฌผ 

๊ฒฐ๊ณผ๋ฌผ

 

๊ฒฐ๊ณผ๋ฌผ์„ ๋ณด๋ฉด redHeader() CALL์ด ํ˜ธ์ถœ๋˜๊ณ , iOS์šฉ ๋ฉ”์‹œ์ง€๊ฐ€ ๋นจ๊ฐ„์ƒ‰ ๊ธ€์”จ๋กœ ๋ฐ”๋€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ”ถ 4. override func viewDidLoad() ์™€ override func loadView()์˜ ์ฐจ์ด์ 

๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜๋‹ค ๋ณด๋‹ˆ viewDidLoad()๊ฐ€ ์•„๋‹ˆ๋ผ loadView()๋ฅผ ์ž‘์„ฑํ•ด์„œ ๊ฐœ๋ฐœํ•œ ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ์„๊นŒ? 

 (๊ณต์‹ ๋ฌธ์„œ๋„ ํ™•์ธํ•ด ๋ณด์•˜์œผ๋‚˜, ๋‚ด๊ฐ€ ์•Œ๊ธฐ ํŽธํ•˜๊ฒŒ ๋ฐ”๊ฟ”์„œ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์›€!)

 

-> ์ž‘์„ฑํ•˜๋ ค๊ณ  ๋ณด๋‹ˆ ๋‚ด์šฉ์ด ๋งŽ์•„์„œ ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋‹ค์‹œ ๋งŒ๋‚˜๋„๋ก ํ•ด์š”~!

 

 

 

 

(์ฐธ๊ณ )

https://zetal.tistory.com/entry/WKUserContentController

 

WKUserContentController ๋ฝ€๊ฐœ๊ธฐ

WKUserContentController ๋ฝ€๊ฐœ๊ธฐ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” WKWebView ๊ธฐ๋Šฅ ์ค‘์— ํ•˜๋‚˜์ธ WKUserContentController ๊ธฐ๋Šฅ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. WKWebView๊ธฐ๋Šฅ ์ค‘์— ์ข‹์€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด UIWebView์—์„œ๋Š” ์ง€์›์ด ์•ˆ๋๋˜..

zetal.tistory.com

https://ios-development.tistory.com/701

 

[iOS - swift] 2. WKWebView ์‚ฌ์šฉ ๋ฐฉ๋ฒ• (์›น๋ทฐ, ์ฟ ํ‚ค, WKScriptMessageHandler, WKNavigationDelegate, WKUIDelegate)

1. WKWebView ๊ฐœ๋…1 (UIWebView, AJAX, XHR, ์บ์‹œ, ์ฟ ํ‚ค) 2. WKWebView ์‚ฌ์šฉ ๋ฐฉ๋ฒ• (์›น๋ทฐ, ์ฟ ํ‚ค, WKScriptMessageHandler, WKNavigationDelegate, WKUIDelegate) WKWebView๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „ ์•Œ์•„์•ผํ•  ๊ธฐ๋ณธ ๊ฐœ..

ios-development.tistory.com

https://yagom.net/forums/topic/loadview%EC%99%80-viewdidload-%EC%B0%A8%EC%9D%B4%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4/

 

loadView์™€ viewDidLoad ์ฐจ์ด์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. - ์•ผ๊ณฐ๋‹ท๋„ท

์•ˆ๋…•ํ•˜์„ธ์š”. Swift๋ฅผ ๊ณต๋ถ€ํ•œ์ง€ ์‹œ๊ฐ„์ด ํ๋ฅด๋‹ˆ ์Šคํ† ๋ฆฌ๋ณด๋“œ์™€ ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”๋กœ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฑฐ ๋ณด๋‹ค ์ฝ”๋“œ๋งŒ์œผ๋กœ View๋ฅผ ๊ทธ๋ฆฌ๋Š” […]

yagom.net

 

Comments