섹션 15: Cocoapod Dependencies, FlashChat 만들기 (복습)

20287 단어 iOSudemyiOS

Cocoapod 활용해서 firebase 사용하기
TableView와 .xib File 사용하기
App life cycle(AppDelegate.swift), SecneDelegate.swift, ViewController Life cycle 생명주기

has no entry points 오류

시작 뷰 컨트롤러를 표시하지 않았기 때문
Is Initial View Controller에 체크해주기
(root view controller 설정)

화면전환하기

segue

  1. 버튼에서 연결
    버튼을 클릭한 상태에서 드래그
    버튼을 누르면 자동으로 이동된다(unconditional)
    모달형식으로 보여지기 때문에 뒤로 갈 수가 없어서 내비게이션 컨트롤러를 추가하는 방식으로 보통 구현함
  2. 뷰컨트롤러끼리 연결
    메인.스토리보드에서 가운데가 네모난 노란색 버튼 클릭 후 컨트롤 키 누르고 드래그
    show 선택하기
    identifier이름을 설정해주고 수동으로 이동시켜야 한다(conditional)

텍스트에 애니메이션 주기

Timer를 사용했고,
charIndex를 활용해 각각의 문자가 나오는 시간을 0.1씩 증가시켜줬다.

        titleLabel.text = ""
        var charIndex = 0.0
        let titleText = "⚡️FlashChat"
        for letter in titleText {
            Timer.scheduledTimer(withTimeInterval: 0.1 * charIndex, repeats: false) { (timer) in
                self.titleLabel.text?.append(letter)
            }
            charIndex += 1
        }

cocoa pods

Third Party Libraries에 접근하기 위한 Package Dependency Manager 패키지 의존성 매니저 중 하나

  • 다른 패키지 의존성 매니저: Cocoapods, Carthage, Swift Package Manager
  • Swift Package Manager 사용법
    • File > Swift Packages > Add Package Dependency
    • 깃에서 Package.swift에서 스펙 확인 가능

사용하고 있는 pod을 업데이트 시키고 싶으면
터미널에서 아래와 같이 입력하기만 하면 된다

> pod update

https://cocoapods.org/
CLTypingLabel 라이브러리 사용해보기

https://www.youtube.com/watch?v=iEAjvNRdZa0&feature=youtu.be
manually 라이브러리를 가져와서 추가하면 업데이트 관리가 어렵다 -> 코코아팟 사용하자

  • 그 외
    • Lintel
    • Firebase

Terminal에서 설치

prompt sign 깜빡거리는 커서
맥에서 zsh을 기본으로 사용하는데 업데이트를 하려면 chsh -s /bin/zsh를 입력하면 된다

$ sudo gem install cocoapods
$ pod setup --verbose //마스터 브랜치에서 풀 해오기
$ pod --version

사용하기

terminal에서 cd입력하고 xcodeproj의 부모폴더를 드래그한다(경로 자동 입력)
$ pod init
$ open Podfile -a Xcode

Podfile 우클릭> 다음으로 열기> 기타> Xcode(항상 체크)
Podfile은 루비파일

1: ios 9.0이상에서 작동
2: pod 'CLTypingLabel' 사용할 pod 추가

$ pod install

그 이후에는 .xcworkspace를 사용한다

use_frameworks! 뜻

use_frameworks! 를 쓰면 dynamic framework 임을 나타냅니다.
use_frameworks!를 안쓰면 static library 임을 나타냅니다.

static library (정적 라이브러리)는 컴파일 시에 라이브러리 코드가 실행파일에 연결됩니다.
즉 라이브러리 코드가 실행 파일에 복사되어, 실행파일에 라이브러리 코드가 포함되어있는 상태로 컴파일 되는 것입니다.

반면 dynamic framework (동적 라이브러리) 는 런타임 시에 라이브러리 코드가 실행파일에 연결됩니다.
실행파일에는 호출할 라이브러리의 정보만 포함되고 실제 라이브러리 코드는 복사되지 않습니다.

pod 버전 관리

command B 빌드하면 오류가 뜨는데

깃에 들어가서
풀리퀘스트를 보고 코드를 변경해준다 Closed> Files changed

깃에서 release버전을 확인하면 0.4.0이 최신 버전으로 Swift 4, 5 버전을 지원한다
그런데 Podfile.lock파일을 Xcode로 열어보니 0.3.0버전이다

왜why?
they required a higher minimum deployment target
깃에서 podspec을 살펴보면
플랫폼 10.0 이상을 요구하고 있다

Podfile에서 platform을 수정해주고
pod 'CLTypingLabel', '~> 0.4.0'
터미널에서 pod install을 리턴하면

[!] CocoaPods could not find compatible versions for pod "CLTypingLabel":
  In Podfile:
    CLTypingLabel (~> 0.4.0)

Specs satisfying the `CLTypingLabel (~> 0.4.0)` dependency were found, but they required a higher minimum deployment target`

깃에서 CLTypingLabel.podspec 파일을 보니...
s.platform = :ios, '10.0'
10이상이어야 한다

팟파일 수정하기
platform :ios, '13.0'

$ pod install

Installing CLTypingLabel 0.4.0 (was 0.3.0)
제대로 동작한다

적용하기

import UIKit
import CLTypingLabel	//💥요기

class WelcomeViewController: UIViewController {

    @IBOutlet weak var titleLabel: CLTypingLabel!	//💥요기
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        titleLabel.text = "⚡️FlashChat"	//💥요기
    }
    
}

pie

구글에서 특정 키워드 위주로 검색하고 싶으면 키워드에 쌍따옴표를 적어준다 "키워드"

Position Independent Executable

Disable -pie for Pods

삭제

Podfile에서
pod 'CLTypingLabel', '~> 0.4.0' 지우기

터미널에서 pod install

IQKeyboardManagerSwift

코코아팟 사용하고 swift package manager 사용하면 오류 안나는데
반대는 오류가 난다

스위프트 패키지 매니저

File> Swift Packages > Add Package Dependency >
https://github.com/hackiftekhar/IQKeyboardManager

version: Up to Next Major
메이저 버전까지 업데이트하기를 권장한다
마이너 버전이랑 스위프트 언어랑 맞지 않을 수도 있다

https://github.com/hackiftekhar/IQKeyboardManager/wiki/Properties-&-Functions

//AppDelegate.swift
import IQKeyboardManagerSwift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        IQKeyboardManager.shared.enable = true
        IQKeyboardManager.shared.enableAutoToolbar = false
        IQKeyboardManager.shared.shouldResignOnTouchOutside = true
        
        return true
    }

다듬기

내비게이션바 안보이게

첫번째 뷰컨트롤러에서만 내비게이션바 안보이게 만들기

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.isNavigationBarHidden = true
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.isNavigationBarHidden = false
    }

테이블뷰 스크롤

DispatchQueue.main.async {
                                self.tableView.reloadData()  //테이블 다시 로드하기
                                
                                //새로운 메시지를 입력하면 가장 아래로 스크롤하기
                                let indexPath = IndexPath(row: self.messages.count-1, section: 0)
                                self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
                            }

상황에 따라 nib파일 모양 변경하기

우선 nib에 상대방의 이미지를 추가해줬다

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let message = messages[indexPath.row]
        
        let cell = tableView.dequeueReusableCell(withIdentifier: K.cellIdentifier, for: indexPath) as! MessageCell
        
        //로그인한 currentUser와 sender가 일치하면 Me 이미지만 보이게 하기
        if message.sender == Auth.auth().currentUser?.email {
            cell.leftImageView.isHidden = true
            cell.rightImageView.isHidden = false
            cell.messageBubble.backgroundColor = UIColor(named: K.BrandColors.lightPurple)
            cell.label.textColor = UIColor(named: K.BrandColors.purple)
        } else {
            cell.leftImageView.isHidden = false
            cell.rightImageView.isHidden = true
            cell.messageBubble.backgroundColor = UIColor(named: K.BrandColors.purple)
            cell.label.textColor = UIColor(named: K.BrandColors.lightPurple)
        }
        
        cell.label?.text = message.body
        return cell
    }

영단어

  • populate over: 채우다
  • cobble: cobble together this essay: 대충 끼워맞춰서 에세이를 만들다
  • tedious: 지루한
  • typo: 오타
  • populate data: 리스트에 데이터를 채우다
  • bog-standard: 흔한 (bog: 책)
  • cruicible: 쇳물 괴는 곳, 가혹한 시련
  • wind down: 긴장을 풀고 쉬다

좋은 웹페이지 즐겨찾기