야곰의 iOS 프로그래밍

야곰의 iOS 프로그래밍

(25개의 수강평)

339명의 수강생
iOSSwift
55,000원
지식공유자 · yagom
106회 수업· 총 10시간 34분수업
평생 무제한 시청
수료증 발급 강의
수강 난이도 초급
기록태리의 프로필

5번째 프로젝트 질문입니다 기록태리의 11일 전

5번째 프로젝트에서요

다른 코드는 괜찮은데, mainViewController에서 오류가 있습니다.

마지막 부분 decode인데요.

"Cannot invoke 'decode' with an argument list of type '(@escaping (main.ButtonTag) -> AnimalInfo?, from: Data)'"

이러한 말이 뜹니다. 어떻게 해결해야하나요?

//  main.swift
//  What's This?
//
//  Created by Tae-hee on 2020-05-11.
//  Copyright © 2020 Tae-hee. All rights reserved.
//

import UIKit

class main: UIViewController {
   
    //MARK: - Nested Type
    private enum ButtonTag: Int {
        case dog = 101
        case cat, rabbit, hedgehog
    }

    // 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.
        guard let button: UIButton = sender as? UIButton else { return }
           
        guard let nextViewController: game = segue.destination as? game else
                {return}
           
        guard let tag: ButtonTag = ButtonTag(rawValue: button.tag) else {
            print("버트의 태그를 enum 변경불가")
            return
        }
           
        guard let info: AnimalInfo = self.AnimalInfo(for: tag) else { return }
           
        nextViewController.AnimalInfo = info
        }
   
       //MARK: Privates
   private func AnimalInfo(for tag: ButtonTag) -> AnimalInfo? {
      
       let assetName: String
      
       switch tag {
       case ButtonTag.dog:
           assetName = "Dog"
       case ButtonTag.cat:
           assetName = "Cat"
       case ButtonTag.rabbit:
           assetName = "Rabbit"
       case ButtonTag.hedgehog:
           assetName = "Hedgehog"
       }
      
    return self.decodeAnimalInfo(from: assetName)
   }
  
    private func decodeAnimalInfo(from assetName: String) -> AnimalInfo? {
        guard let asset: NSDataAsset = NSDataAsset(name: assetName) else {
            print("에셋 로드 실패")
            return nil
        }
       
        do {
            let decoder: PropertyListDecoder = PropertyListDecoder()
            return try decoder.decode(AnimalInfo.self, from: asset.data)
        } catch {
            print("데이터 디코딩 실패")
            print(error.localizedDescription)
            return nil
        }
    }
}

0
기록태리의 프로필

섹션1 웹브라우저 기록태리의 21일 전

강의에서는 오른쪽 맨 하단 key commands에 아이템들이 뜨는데요

제 x-code에서는 key commands 아래가 빈칸이고 아무것도 안떠서요

아이템들은 어떻게 띄우나요?

0
주효진 프로필

1번 프로젝트: 웹 브라우저 관련 질문 드립니다! 주효진 1달 전

먼저 야곰님 수업 정말 잘 듣고 있습니다 :)

야곰님 iOS 프로그래밍 강좌를 들으면서 따라하는 식으로 진행하다가 뒤로 갈수록 따라가는 것이 버거워져, 정리할 겸 1장으로 돌아와 복습을 하고 있었습니다.

한 2주 정도 전에 1장을 따라할 때에는 오류 없이 잘 실행되던 코드가 AppDelegate.swift 파일에서 오류가 납니다.

오류의 내용으로는 아래와 같이 발생합니다.

Thread 1: Exception: "Could not instantiate class named WKWebView because no class named WKWebView was found; the class needs to be defined in source code or linked in from a library (ensure the class is part of the correct target)"

그런데 WKWebView는 ViewController에서 extension을 통해 상속받아주었는데 왜 AppDelegate 파일에서 저런 오류가 나는 지 모르겠습니다..

0
KHP 프로필

Xcode 11을 사용중이면, 해당 강의와 다른 부분이 많네요ㅠㅠ KHP 3달 전

예를들어 프로젝트 생성시 SwiftUI를 선택하면, ViewController.swift 파일이 생성되지 않더라구요.

또한 다른 부분도 많이 다르구요.. 이런 경우 xcode를 다운그레이드하면 되나요? 

구버전의 ViewController이, 11버전에서는 어떤 것으로 바뀌었는지에 대한 정보가 있으면 좋겠네요..

0
FishinGom 프로필

"NSURLErrorDomain error -999." 오류 문의 FishinGom 3달 전

예제 실행 후 뒤로가기, 새로고침, 앞으로 버튼 클릭 시 

"NSURLErrorDomain error -999." 오류 팝업이 출력됩니다.

페이지 로드가 완료되지 않은 상태에서 작업 요청 시 발생하는 오류라고 하는 것 같은데요. 이 오류가 발생하지 않도록 하려면 어떻게 해야 하나요?

xcode 11.3 사용 중입니다

--- 

추가로, 예제 실행 시 마지막 URL 정보가 유지되지 않는 것 같습니다.

applicationWillResignActive 가 호출되지 않고 있는 건 아닌가 의심되는데요. 혹시 applicationWillResignActive 호출을 위해 따로 설정해야 하는 것이 있나요?

1
H J 프로필

Thread 1: signal SIGABRT 가 자꾸 뜨네요 천천히 차근차근 했는데... H J 8달 전

뷰 컨트롤에서 

import UIKit

import WebKit

class ViewController: UIViewController {

    // MARK: - Preperties

    // MARK: IBOutlets

    @IBOutlet var webView: WKWebView!

    @IBOutlet var activityIndicator: UIActivityIndicatorView!

    

    // MRAK: - Methods

    // MARK: Life Cycle

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view.

        self.webView.navigationDelegate = self

    }

    

    override func viewDidAppear(_ animated: Bool) {

        super.viewDidAppear(animated)

        

        let firstPageURL: URL?

        

        if let lastURL: URL = UserDefaults.standard.url(forKey: lastPageURLDefualtkey) {

            firstPageURL = lastURL

        } else {

            firstPageURL = URL(string: "https://www.google.com")

        }

        

        guard let pageURL: URL = firstPageURL else {

            return

        }

        

        let urlRequest: URLRequest = URLRequest(url: pageURL)

        self.webView.load(urlRequest)

    }

    // MARK: IBAction

    @IBAction func goBeck(_ sender: UIBarButtonItem) {

        self.webView.goBack()

    }

    

    @IBAction func goForward(_ sender: UIBarButtonItem) {

        self.webView.goForward()

    }

    @IBAction func refresh(_ sender: UIBarButtonItem) {

        self.webView.reload()

    }

    

    //MARK: Custom Methods

    func showNetworkingIndicators() {

        self.activityIndicator.isHidden = false

        self.activityIndicator.startAnimating()

        UIApplication.shared.isNetworkActivityIndicatorVisible = true

    }

    

    func hideNetworkingIndicators() {

        self.activityIndicator.isHidden = true

        self.activityIndicator.stopAnimating()

        UIApplication.shared.isNetworkActivityIndicatorVisible = false

    }

}

extension ViewController: WKNavigationDelegate {

    

    //MARK: WKNavigationDelegate

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

        print("did finish navigation")

        

        if let appDelegate: AppDelegate = UIApplication.shared.delegate as? AppDelegate {

            appDelegate.lastPageURL = webView.url

        }

        webView.evaluateJavaScript("document.title") { (value: Any?, error: Error?) in

            if let error: Error = error {

                print(error.localizedDescription)

                return

            }

            

            guard let title: String = value as? String else {

                return

            }

            

            self.navigationItem.title = title

        }

        self.hideNetworkingIndicators()

    }

    

    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {

        print("did fail navigation")

        print("\(error.localizedDescription)")

        

        self.hideNetworkingIndicators()

        let message: String = "오류발생!\n" + error.localizedDescription

        

        let alert: UIAlertController

        alert = UIAlertController(title: "알림", message: message, preferredStyle: UIAlertController.Style.alert)

        

        let okayAction: UIAlertAction

        okayAction = UIAlertAction(title: "확인", style: UIAlertAction.Style.cancel, handler: nil)

        

        alert.addAction(okayAction)

        

        self.present(alert, animated: true, completion: nil)

    }

    

    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {

        print("did start navigation")

        self.showNetworkingIndicators()

    }

}

앱딜리게이트에서 

import UIKit

/// 마지막 페이지 주소를 UserDefaults에서 관리하기 귀한 키 값

let lastPageURLDefualtkey: String = "lastURL"

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {

    

    // MARK: - Properties

    var window: UIWindow?

    var lastPageURL: URL?

    

    

    // MRAK: - Methods

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // Override point for customization after application launch.

        

        self.lastPageURL = UserDefaults.standard.url(forKey: lastPageURLDefualtkey)

        return true

    }

    func applicationWillResignActive(_ application: UIApplication) {

        // 응용 프로그램이 활성 상태에서 비활성 상태로 이동하려고 할 때 전송됩니다. 이는 특정 유형의 일시적인 중단 (예 : 전화 또는 SMS 메시지 수신) 또는 사용자가 응용 프로그램을 종료하고 백그라운드 상태로 전환하기 시작할 때 발생할 수 있습니다.

        //이 방법을 사용하여 진행중인 작업을 일시 중지하고 타이머를 비활성화하고 그래픽 렌더링 콜백을 무효화합니다. 게임은이 방법을 사용하여 게임을 일시 중지해야합니다.

        let userDefaults: UserDefaults

        userDefaults = UserDefaults.standard

        

        userDefaults.set(self.lastPageURL, forKey: lastPageURLDefualtkey)

        userDefaults.synchronize()

    }

 코드를 적었는데요 

빌드를 실행하게 되면 앱딜리게이트 첫부분 

class AppDelegate: UIResponder, UIApplicationDelegate {Thread 1: signal SIGABRT  A가 걸리네요  레이아웃 연결 제대로 연결했는데 스레드 걸리니깐 무엇이 문제인지 모르겠습니다... 

0
shhan730@gmail.com 프로필

UI WebView deprecated shhan730@gmail.com 9달 전

UI WebView는 IOS 12.0부터 deprecated 되었답니다.

화면도 검정색만 뜨네요

어떡하죠?

 

1
shhan730@gmail.com 프로필

강의 코드 shhan730@gmail.com 9달 전

Yagom님 깃헙 레포에 가보아도 강의때 작성하신 코드를 찾을 수 없는데

혹시 강의코드는 공유하지 않으시는 건가요?

0
박단비 프로필

혹시 강의하실때 사용하셨던 Xcode 버전을 알 수 있을까요? 박단비 10달 전

모두 똑같이 적었는데 오류가 많이 납니다 ㅠㅠ

저는 10.2.1 사용합니다.

4
Matthew So 프로필

질문 드립니다( keychain)관련 Matthew So 2019.05.06

안녕하세요 강사님. 좋은 강좌 감사합니다.

강좌와는 별개로 첫 개인 프로젝트 진행 중인데, 사용자의 각종 개인 정보를 보관하기 위해서는 어떤 api나 framework가 적절할 지 조언해 주시면 감사 드리겠습니다. 찾아보기로는 user default와 keychain을 보통 사용하더라고요. 감사합니다!

1
include hoany 프로필

Thread 1: signal SIGABRT 오류발생 입니다. include hoany 2019.04.30

꼼꼼하게 코드를 전부 확인했으나 이상이 없어서

혹시나 해서 야곰님이 올려두신 코드를  복사해서

컴파일 해보았으나

 

다음과 같은 오류가 발생했습니다.

웹킷 객체를 구성하지 못한것 같은데 이유를 모르겠네요..

 

2019-04-30 01:14:12.255645+0900 MyWebBrowser[14759:376648] *** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named WKWebView because no class named WKWebView was found; the class needs to be defined in source code or linked in from a library (ensure the class is part of the correct target)'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010d9d06fb __exceptionPreprocess + 331
    1   libobjc.A.dylib                     0x000000010cf74ac5 objc_exception_throw + 48
    2   CoreFoundation                      0x000000010d9d0555 +[NSException raise:format:] + 197
    3   UIFoundation                        0x0000000116dfb6c9 UINibDecoderDecodeObjectForValue + 360
    4   UIFoundation                        0x0000000116dfbaf9 UINibDecoderDecodeObjectForValue + 1432
    5   UIFoundation                        0x0000000116dfb554 -[UINibDecoder decodeObjectForKey:] + 251
    6   UIKitCore                           0x00000001116ed705 -[UIView initWithCoder:] + 802
    7   UIFoundation                        0x0000000116dfb852 UINibDecoderDecodeObjectForValue + 753
    8   UIFoundation                        0x0000000116dfb554 -[UINibDecoder decodeObjectForKey:] + 251
    9   UIKitCore                           0x0000000110ed2b41 -[UIRuntimeConnection initWithCoder:] + 178
    10  UIFoundation                        0x0000000116dfb852 UINibDecoderDecodeObjectForValue + 753
    11  UIFoundation                        0x0000000116dfbaf9 UINibDecoderDecodeObjectForValue + 1432
    12  UIFoundation                        0x0000000116dfb554 -[UINibDecoder decodeObjectForKey:] + 251
    13  UIKitCore                           0x0000000110ed03f1 -[UINib instantiateWithOwner:options:] + 1216
    14  UIKitCore                           0x0000000110c4d3af -[UIViewController _loadViewFromNibNamed:bundle:] + 382
    15  UIKitCore                           0x0000000110c4dd39 -[UIViewController loadView] + 177
    16  UIKitCore                           0x0000000110c4e048 -[UIViewController loadViewIfRequired] + 172
    17  UIKitCore                           0x0000000110bb2004 -[UINavigationController _updateScrollViewFromViewController:toViewController:] + 68
    18  UIKitCore                           0x0000000110bb22f7 -[UINavigationController _startTransition:fromViewController:toViewController:] + 146
    19  UIKitCore                           0x0000000110bb33b5 -[UINavigationController _startDeferredTransitionIfNeeded:] + 896
    20  UIKitCore                           0x0000000110bb46a7 -[UINavigationController __viewWillLayoutSubviews] + 150
    21  UIKitCore                           0x0000000110b9538d -[UILayoutContainerView layoutSubviews] + 217
    22  UIKitCore                           0x000000011171e9c1 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1417
    23  QuartzCore                          0x0000000112c8feae -[CALayer layoutSublayers] + 173
    24  QuartzCore                          0x0000000112c94b88 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 396
    25  QuartzCore                          0x0000000112ca0ee4 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 72
    26  QuartzCore                          0x0000000112c103aa _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 328
    27  QuartzCore                          0x0000000112c47584 _ZN2CA11Transaction6commitEv + 608
    28  UIKitCore                           0x0000000111269ccb __34-[UIApplication _firstCommitBlock]_block_invoke_2 + 128
    29  CoreFoundation                      0x000000010d937aec __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
    30  CoreFoundation                      0x000000010d9372b0 __CFRunLoopDoBlocks + 336
    31  CoreFoundation                      0x000000010d931b34 __CFRunLoopRun + 1252
    32  CoreFoundation                      0x000000010d931302 CFRunLoopRunSpecific + 626
    33  GraphicsServices                    0x0000000116a9f2fe GSEventRunModal + 65
    34  UIKitCore                           0x0000000111250ba2 UIApplicationMain + 140
    35  MyWebBrowser                        0x000000010c68eebb main + 75
    36  libdyld.dylib                       0x000000010fdc1541 start + 1
    37  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)

1
문태부 프로필

4분 12초 부근에서 뭔가 스킵하셨는데 문태부 2019.03.05

ㅁ 모양에 프레젠트 모달리 하는 부분이 없습니다. 제가 하면 겹쳐서 나오네요. 그리고 프로젝트 돌리면 아이덴티티 없다고 에러 나요.

The file “todos.json” couldn’t be opened because there is no such file.

허용여부 true, 오류 : 없음

2019-03-05 09:26:32.086463+0900 Todos[69953:4622760] Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Todos.TodoViewController 0x7fc4802023c0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key memoTextField.'

First throw call stack:

(

0 CoreFoundation 0x000000010e3ef1bb exceptionPreprocess + 331

1 libobjc.A.dylib 0x000000010c95f735 objc_exception_throw + 48

2 CoreFoundation 0x000000010e3eed29 -[NSException raise] + 9

3 Foundation 0x000000010c38ade4 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 292

4 UIKitCore 0x0000000110753292 -[UIViewController setValue:forKey:] + 87

5 UIKitCore 0x00000001109ea573 -[UIRuntimeOutletConnection connect] + 109

6 CoreFoundation 0x000000010e3dacfd -[NSArray makeObjectsPerformSelector:] + 317

7 UIKitCore 0x00000001109e72b9 -[UINib instantiateWithOwner:options:] + 1814

8 UIKitCore 0x000000011075a452 -[UIViewController _loadViewFromNibNamed:bundle:] + 383

9 UIKitCore 0x000000011075addc -[UIViewController loadView] + 177

10 UIKitCore 0x000000011075b0ee -[UIViewController loadViewIfRequired] + 175

11 UIKitCore 0x000000011075b940 -[UIViewController view] + 27

12 UIKitCore 0x00000001106c9177 -[UINavigationController preferredContentSize] + 197

13 UIKitCore 0x000000011067a0ec -[UIPresentationController preferredContentSizeDidChangeForChildContentContainer:] + 64

14 UIKitCore 0x0000000110675d0b __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 116

15 UIKitCore 0x0000000110d860d2 _runAfterCACommitDeferredBlocks + 318

16 UIKitCore 0x0000000110d74b2c _cleanUpAfterCAFlushAndRunDeferredBlocks + 384

17 UIKitCore 0x0000000110da3efc _afterCACommitHandler + 135

18 CoreFoundation 0x000000010e353c27 CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 23

19 CoreFoundation 0x000000010e34e0be CFRunLoopDoObservers + 430

20 CoreFoundation 0x000000010e34e751 __CFRunLoopRun + 1537

21 CoreFoundation 0x000000010e34de11 CFRunLoopRunSpecific + 625

22 GraphicsServices 0x000000011650b1dd GSEventRunModal + 62

23 UIKitCore 0x0000000110d7a81d UIApplicationMain + 140

24 Todos 0x000000010c00f607 main + 71

25 libdyld.dylib 0x000000010f888575 start + 1

)

libc++abi.dylib: terminating with uncaught exception of type NSException

1
YYY 프로필

[질문] collectionview에 사진이 중간중간 안나와서요. YYY 2019.02.12

안녕하세요 :-)

실행해보았는데 카메라롤 앨범을 선택하면 PhotoCollectionCollectionview에 사진이 중간중간 안나오는데 왜 그럴까요?

1
민경태 프로필

Command+Shift+O를 눌렀을때 클래스 관련 개발문서로 이동이 안됩니다. 민경태 2019.01.19

Command+Shift+O를 눌렀을때 클래스 관련 개발문서로 이동이 안됩니다.

검색창이 나오긴 하는데 UIKit을 치면 헤더파일만 나오는데요. 제가 잘못하는 부분이 있는지 알고 싶습니다.

XCode버전은 10.1입니다. 감사합니다!

1
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스