야곰의 iOS 프로그래밍

야곰의 iOS 프로그래밍

(22개의 수강평)

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

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

뷰 컨트롤에서 

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 3달 전

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

화면도 검정색만 뜨네요

어떡하죠?

 

1
shhan730@gmail.com 프로필

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

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

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

0
박단비 프로필

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

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

저는 10.2.1 사용합니다.

4
Matthew So 프로필

질문 드립니다( keychain)관련 Matthew So 7달 전

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

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

1
include hoany 프로필

Thread 1: signal SIGABRT 오류발생 입니다. include hoany 7달 전

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

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

컴파일 해보았으나

 

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

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

 

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초 부근에서 뭔가 스킵하셨는데 문태부 9달 전

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

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 10달 전

안녕하세요 :-)

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

1
민경태 프로필

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

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

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

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

1
코더백그리거 프로필

모달로 올린 화면을 네비게이션컨트롤러의 dismiss를 사용하나요? 코더백그리거 2018.11.30

ResultViewController.swift 내에
touchUpDismissButton 을 구현할 때 모달로 구현한 화면인데도

presentingViewController?.dismiss를 사용하지 않고
그 앞에 navigationController?를 덧 붙여서
navigation?.presentingViewController?.dismiss 로 사용하는 이유가 무엇인가요.
애초에 토대가 네비게이션 컨트롤러라 그런건가요

1
코더백그리거 프로필

도전과제에 대한 코드도 있나요? 코더백그리거 2018.11.30

안녕하세요 야곰 선생님.

도전 과제에 대한 코드가 있을까요?

가령 지금 4강에서 5단위로 피커의 로우를 설정하는데에 있어서 어떻게 하셨나 궁금해서 그렇습니다!

1
갈렙 프로필

코드블럭 에러 질문 갈렙 2018.11.28

extension Question {

static var all: [Question] = {

guard let dataAsset: NSDataAsset = NSDataAsset(name: "Questions") else {

return []

}

let jsonDecoder: JSONDecoder = JSONDecoder()

do {

return try jsonDecoder.decode([Question].self, from: dataAsset.data)

} catch {

return []

}

}()

}

위 코드에서

Initializer for conditional binding must have Optional type, not '<<error type>>'

Use of undeclared type 'NSDataAsset'

위와 같은 에러가 발생합니다.!!

1
Sean Choi 프로필

클로저 Sean Choi 2018.11.13

클로저 고급을 확인하였는데 아직 다음 구문이 이해가 안 됩니다.

{[weak toBeFirstResponder] (action: UIAlertAction) in toBeFirstResponder?.becomeFirstResponder()}

[weak toBeFirstResponder]는 배열인가요?

설명 부탁드립니다.

1
갈렙 프로필

과제 질문 갈렙 2018.11.07

colorView , pickerView를 IBOutlet 사용하지 않고 구현하는 과제 코드를 알 수 있나요?

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