[iOS - Swift] tableView, collectionView 스크롤 시 상단 뷰 흐리게 하는 방법 (네이버 웹툰 상단 뷰, Sticky He

구현 아이디어 상단에는 UIImageView, 하단에는 스크롤되는 UITableView나 UICollectionView 준비 (예제에서는 UICollectionView 사용) UIImageView와 UICollectionView 레이아웃 UICollectionView의 topAnchor를 화면의 최상단으

ios-development.tistory.com

 

 

 

How to reload tableview from another view controller in swift

When I dismiss a modal view controller I want the tableview to update, I am using the form sheet presentation style on iPad so the viewWillAppear and the viewDidAppear methods will not work

stackoverflow.com

 

    bookSearchController = UISearchController(searchResultsController: nil)
     //searchController가 실행됐을 때 아래 배경을 어둡게 표시하는 여부
    bookSearchController.obscuresBackgroundDuringPresentation = false
    bookSearchController.searchBar.placeholder = "제목 또는 작가명 검색"
    bookSearchController.searchBar.delegate = self
    bookSearchController.searchResultsUpdater = self
    bookSearchController.delegate = self
    ...
    
    tableView.tableHeaderView = bookSearchController.searchBar

대충 서치바 코드 ..

navigationBar를 숨기고 Active될때마다 움직이지 않고 고정해서 쓰려고 tableHeaderView에 추가함

 

 

 

 

    //이전뷰의 네비게이션바를 가리지 않고 보이게할라믄 true
    definesPresentationContext = true

definesPresentationContext 값을 true로 하면 써치바를 탭했을 때 화면이 다 날라가버림(???????????)

기본값(false)로 두면

Application tried to present modal view controller on itself. Presenting controller is <UISearchController: 0x15f081c00>.'

오류가 남..

 

class SearchViewController: UIViewController {

테이블뷰 쓰려고 UITableViewController 상속받고있었는데 UIViewController를 상속받도록 수정해니깐 오류 안남.

 

 

 

 

이번에는 CancelButton 빼고 딜리게이트가 안먹음

 

 

	//취소버튼 클릭
    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    }

얘만 되고 온갖 searchBarText..어쩌고 이벤트가 안되는것임..

 

    //테이블뷰 헤더에 써치바 추가
    tableView.tableHeaderView = bookSearchController.searchBar
    //네비게이션아이템에도 추가해야함
    navigationItem.searchController = bookSearchController

테이블 헤더로 추가할래도 네비게이션아이템에 추가해주야하나벼~~~🖕

열거형

// 원시값을 사용하는 열거형
enum 열거형: Type {
	case a = value
}
열거형타입변수.a.rawValue

// 연관값을 사용하는 열거형
enum 열거형 {
	case a(연관값Type)
}
var 열거형타입변수 = 열거형.a(연관값)	// 연관값 초기화
열거형타입변수.a(let b)		// b에 연관값을 대입하게 됨

 

 

옵셔널 체이닝

옵셔널 체이닝 - 옵셔널바인딩 없이 값에 접근
옵셔널타입변수?.프로퍼티	// 옵셔널타입 / Optional(value)
옵셔널타입변수!.프로퍼티	// 강제로 값만 추출

 

 

클로저

closure
- 참조타입
- 코드에서 사용할 수 있는 독립기능 블록
- 일급객채? 전달인자로 보냄, 변수/상수로 저장,전달 가능, 함수의 반환값 가능
- 익명의 함수
- 전달인자가 없음. 파라미터 값만 넘겨야함

{ (매개변수) -> 리턴타입 in		// 헤드
	실행구문			// 바디
}

// 파라미터X, 리턴타입X
let hello = { () -> () in
    print("hello")
}
hello()

// 파라미터O, 리턴타입O
let hello2 = { (name: String) -> (String) in
    return name
}
hello2("hello2")

// 함수의 파라미터로 클로저를 사용
func doSomething(closure: () -> ()) {
    closure()
}
doSomething { () -> () in
    print("hello3")
}

// 함수의 반환타입으로 클로저를 사용
func doSomething2() -> () -> () {
    return { () -> () in
        print("hello4")
    }
}
doSomething2()     // 클로저 네임..
doSomething2()()   // 클로저() ...... print됨

 

 

클로저 간소화

// 후행클로저 - 마지막 매개변수로 전달되는 클로저만 사용가능
// 파라미터, 반환값이 없으면 in까지 생략가능
doSomething() {
    print("hello3")
}

// 다중후행클로저 - 첫번째 클로저는 매개변수 생략가능
func doSomething3(closure1: () -> (), closure2: () -> ()){
    closure1()
    closure2()
}
doSomething3 {
    print("closure1")
} closure2: {
    print("closure2")
}

// 클로저 표현 간소화
func doSomething4(closure: (Int, Int, Int) -> Int){
    closure(1, 2, 3)
}
doSomething4 {
    $0+$1+$2
}

 

고차함수 - map & filter & reduce

// map - 배열의 요소에 접근 (기존배열.count = 새로운배열.count)
let numbers = [0,1,2,3]
let mapArray = numbers.map {
    return $0 * 2
}
print("map - \(mapArray)")

// filter
let numbers2 = [10,50,33,354,544,20]
let filterArray = numbers2.filter {
    $0 % 5 == 0
}
print("filter - \(filterArray)")

// reduce - 요소를 하나로 통합
let numbers3 = [0, 1, 2, 3]
let reduceResult = numbers3.reduce(4) {          // 초기값
    print ("Result - \($0), Element - \($1)")    // result - 누적값, element - 요소
    return $0 + $1
}
print("reduce - \(reduceResult)")

구조체 & 클래스

인스턴스
- 구조체, 클래스, 열거형을 사용할 때 선언하는 오브젝트

struct
- value 타입
- 인스턴스를 상수(let)로 선언 > 내부 변수 프로퍼티 변경X
- 인스턴스를 여러개의 변수에 할당 > 변경된 인스턴스의 변수만 변경 됨 (값 복사)

class
- 참조 타입
- 인스턴스를 상수(let)로 선언 > 내부 변수 프로퍼티 변경O
- 인스턴스를 여러개의 변수에 할당 > 변경된 인스턴스의 변수 외 모든 변수값이 바뀜 (메모리 복사)
- ARC로 메모리 관리 / deinit 사용 / 상속 가능

 

 

초기화 구문

생성자 - init() {}
소멸자 - deinit {}	// 옵셔널 클래스 인스턴스 값이 nil이 되면 호출 됨

 

 

프로퍼티

프로퍼티 - 저장/연산/타입 (클래스, 구조체, 프로토콜에서 사용)

// 연산 프로퍼티
get { return value }
set(newValue) { 프로퍼티 = newValue }

// 타입 프로퍼티 - static 키워드 사용 / 인스턴스 생성 없이 바로 프로퍼티에 접근 가능

// 프로퍼티 옵저버 - 저장 프로퍼티, 오버라이딩 된 연산 프로퍼티에서 사용
willSet { //newValue - 대입값 }	// 프로퍼티 저장 직 전 호출 됨
didSet { //oldValue - 기존값 }	// 프로퍼티 저장 직 후 호출 됨

 - 저장 프로퍼티는 멍미

 

 

타입캐스팅

// 타입 확인 - 타입이 일치하면 if문 실행
if 변수 is 클래스타입 { }

// 타입 변환(다운캐스팅) - 타입이 일치하면 a 상수에 변수값을 대입하고 if문 실행
if let a = 변수 as? 클래스타입 { }	// as!는 타입 변환이 실패하면 런타임에러

 

 

assert & guard

assert(조건, "")			// 조건 성립X -> 메시지 출력 (디버깅용)
guard 조건 else { return }	// 조건 성립X -> else 구문 실행

 

 

프로토콜

protocol
- 인터페이스?? 역할
- 정의할 때 계산/저장 프로퍼티 구분X
- 프로퍼티 var로 선언 / get,set 정의
- class에서만 오버라이드하는 생성자 앞에 required 식별자 선언

 - 계산.저장 프로퍼티 구분 먼소린지

+ Recent posts