티스토리 뷰

TIL

[TIL] 2022 / 07 / 21

희철 2022. 7. 21. 22:16

코드로 화면 전환(Present)

 

 

세 단계로 나눌 수 있음.(스토리보드를 사용하는 경우)

 

1. 스토리보드를 특정

let sb = UIStoryboard(name: "StoryboardName", bundle: nil)

name에 스토리보드의 이름을 넣어주면됨.

 

 

2. 해당 스토리보드 내의 뷰컨트롤러중 전환하고 싶은 뷰컨트롤러 특정

let vc = sb.instantiateViewController(withIdentifier: "identifier")

해당 뷰컨트롤러의 Identity Inspector에서 Storyboard ID를 설정하고 이 값을 withIdentifier에 넣어줌.

 

타입 캐스팅까지 하고 옵셔널까지 처리해준다면 아래처럼 적을 수 있음.

guard let vc = sb.instantiateViewController(withIdentifier: DetailViewController.identity) as? DetailViewController else { return }

 

 

3. 화면전환

vc.modalPresentationStyle = .fullScreen
present(vc, animated: true)

modalPresentationStyle을 정해준 뒤 present 하면됨.

 

이때 네비게이션도 추가해줄 수 있음.

let sb = UIStoryboard(name: "Test", bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: "TestSecondViewController")
        
let nav = UINavigationController(rootViewController: vc)
        
nav.modalPresentationStyle = .fullScreen
present(nav, animated: true)

 

전환된 뷰컨트롤러에서 액션으로 dismiss해주면 화면은 내려감.

 

 

코드로 화면전환(Push)

 

 

Present와 방법은 동일함.

 

 

하지만 Push를 하기 위해서는 반드시 네비게이션 컨트롤러가 필요함.

-> 애초에 pushViewController메서드는 navigationController에서만 사용할 수 있음.

 

 

다른 화면을 띄울 예정인 뷰컨트롤러에 네비게이션 컨트롤러가 임베드되어있다면 아래의 코드를 이용해서 다른 화면을 push할 수 있음.

navigationController?.pushViewController(vc, animated: true)

하지만 임베드되어있지않다면 위의 코드를 이용해도 화면이 전환되지 않음.

 

 

또한 네비게이션컨트롤러가 임베드되어있다고해서 반드시 Push로만 화면을 띄워야하는건아님

-> present를 이용해서 띄우는 것도 가능.

 

 

다른 화면을 띄우기 전에 네비게이션컨트롤러를 임베드해서 띄울 수도 있음.

let sb = UIStoryboard(name: "Test", bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: "TestSecondViewController")
        
let nav = UINavigationController(rootViewController: vc)
nav.modalPresentationStyle = .fullScreen
        
present(nav, animated: true)

여기서 주의해야할점은 modalPresentationStyle을 설정할때 만들어준 네비게이션 컨트롤러에 설정해야함.

 

Present인 경우엔 이미 띄울 화면이 네비게이션 컨트롤러를 가지고 있어도 상관이없지만, Push인 경우엔 네비게이션 컨트롤러를 push할 수 없어 앱이 꺼짐.

 

앞의 뷰컨트롤러에 네비게이션 컨트롤러가 없는 상태에서는 push를 아무리 눌러도 화면 전환이 불가능함.

 

 

 

코드로 NavigationBar 설정

 

 

바로 navigationItem으로 접근하면됨.

-> 안의 프로퍼티를 정하여 값을 설정하면됨.

 

 

leftBarButtonItem, rightBarButtonItem

 navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(systemName: "xmark"), style: .plain, target: self, action: #selector(tapCloseBtn))

여기서 action안에는 함수가 들어가야하는데 #selector를 이용하여 오브젝트씨 함수를 넣어주면됨.

선언하는 방법은 똑같음.

@objc func tapCloseBtn() {
    self.dismiss(animated: false)
}

 

 

title

navigationItem.title = "12312"

 

이외에도 backButton같은 다른 것도 설정할 수 있음.

 

 

네비게이션바에 서치바 넣기

 

 

navigationItem을 이용하면되는데 어렵지않음.

 

그냥 titleView에 서치바를 넣어주면됨.

override func viewDidLoad() {
    super.viewDidLoad()
        
    let seaerchBar = UISearchBar()
        
    navigationItem.titleView = seaerchBar

}

 

 

프로퍼티 -> 나중에 자세히 정리해보기

 

 

프로퍼티는 주로 값을 저장하기 위한 목적으로 클래스나 구조체 내에서 정의된 변수나 상수를 말함.

 

프로퍼티는 클래스의 내부, 메서드의 외부에서 정의해야함.

 

 

저장 프로퍼티

 

 

인스턴스의 변수 또는 상수를 의미하는데 구조체와 클래스에서만 쓸 수 있음.

 

구조체의 저장 프로퍼티는 옵셔널이 아니어도 이니셜라이저를 자동으로 생성함.

하지만 클래스의 저장 프로퍼티는 옵셔널이 아니라면 기본값을 지정해주거나 이니셜라이저를 통해 반드시 초기화해야함.

 

위에서 보이는 name이나 age같은 것을 저장 프로퍼티라고 함.

 

 

지연 저장 프로퍼티

 

 

필요할 때 값이 할당되는 프로퍼티.

-> 필요없어서 선언한 옵셔널과는 다름.

 

참고할 점은 지연 저장 프로퍼티는 var를 이용해 정의해야함.

-> 상수는 인스턴스가 완전히 생성되기 전에 초기화해야하므로 지연 저장 프로퍼티와 맞지 않음.

 

 

초기화를 통해 인스턴스가 생성이되어도 호출되지 않는다면 초기화되지 않음.

class Person {
    var name: String = "윤희철"
    var age: Int = 11
}

class Yoon {
    lazy var hee: Person = Person()
    var gender: Bool
    
    init(gender: Bool) {
        self.gender = gender
    }
}

let heecheol: Yoon = Yoon(gender: true) //여기서 hee는 초기화되지않음.
print(heecheol.hee) // 이때 초기화가됨

 

 

타입 저장 프로퍼티

 

 

인스턴스 프로퍼티는 인스턴스마다 다른 값을 가질 수 있음.

 

하지만 타입 프로퍼티는 각각의 인스턴스가 아닌 타입 자체에 속하는 프로퍼티

-> 인스턴스를 생성하지않아도 사용할 수 있음.

 

static으로 선언하며 lazy로 동작함.

 

위처럼 클래스 내에 static으로 생성한 후 인스턴스 생성없이 사용할 수 있음.

 

 

 

______________________________________________________________________________________________________

 

UITextField에서 아무것도 입력하지않으면 nil이 아니라 Optional("")의 값을 갖게됨.

 

 

Prefers Large Titles

 

 

원래의  타이틀

Prefers Large Titles를 체크해보았음.

 

아래와 같이 바뀜.

 

 

코드로 navigationitem의 barbutton추가

 

 

배열에서 인덱스가 작은 것부터 오른쪽에 차례대로 채워짐.

 

 

Global Accent Color

 

 

색을 정해주지 않으면 항상 기본적으로 tint color가 적용됨.

 

Assets에 있는 AccentColor에 색을 넣어주면 기본 색이 적용됨.

-> 새로 컬러에셋을 추가해서 적용해도 됨.

 

 

인스타그램 홈화면 UI 간단하게 구현해보기

 

 

셀을 한 번에 설정했는데 왜 셀끼리 다른지 모르겠음.

한 번 스크롤하고나면 다 똑같이 만들어짐.

이건 아마 재사용때문에 동그란 셀들을 재사용하면서 생기는 일 같음.

 

 

계산해서 맞춰주려고했는데 쉽지않아서 값을 직접 넣어보면서 해결함.(해결했다고 볼 수 없음)

 

테이블뷰 컨트롤러 안에 컬렉션뷰를 넣어서 해봤는데 너무 어려웠음.

 

훨씬 많이 해봐야 할 것 같음

'TIL' 카테고리의 다른 글

[TIL] 2022 /07 / 23  (0) 2022.07.23
[TIL] 2022 / 07 / 22  (0) 2022.07.23
[TIL] 2022 / 07 / 20  (0) 2022.07.21
[TIL] 2022 / 07 / 19  (0) 2022.07.19
[TIL] 2022 / 07 / 18  (0) 2022.07.18
댓글
최근에 올라온 글
Total
Today
Yesterday