원본글 : -> http://www.toptal.com/ios/ios-user-interfaces-storyboards-vs-nibs-vs-custom-code
요즘은 내공이 생기니 이런 기준으로 프로그래밍을 하게 됩니다.
StoryBoard를 사용하여 ViewController의 전환을 이해 할 수 있도록 흐름을 설계 한다.
Template가 되는 View는 Nib를 사용하여 디자인 한다 : 많은 곳에서 재활용 될 수 있는 View
Code : 동적으로 변화하는 Graphic User Interface를 사용하여 디자인 하기 어려운 View는 Code로 작성한다. (웬만하면 지양한다)
StoryBoard의 네비게이션이 복잡한 경우 Segue를 쓰지 않고 코드로 작성한다.
[이전에 작성한 내용]
저도 소스 merge conflict 부분에서 공감 됩니다만
아직 내공이 부족해서 모든 것에 대해 공감할 수 없었습니다.
ㅇ 후기 결론 :
ㄴ> 결국 상황 수습 하려면 모두 다 할 줄 알아야 한다….;;;;
하단은 케이스별 용도, 잘못된 사용예, 장/단점에 대해 정리 해보았습니다.
ㅇ 본문 번역 요약
ㅁ 스토리보드
용도 :
TableViewController 의 cell view를 프로토타이핑 할 때 유용하다.
여러가지 cell template은 부모 컨트롤러 안에서 디자인 할 수 있다.
static table 구현 가능.
잘못된 사용 예 :
복잡한 레이아웃 구현 (코드가 최고)
NIB파일로 view 가 구현되었다면 storyboard로 구현할 필요가 없다.
장점 :
전체적인 뷰 컨트롤러의 흐름을 파악하는데 용이하다. (프로토타입)
성능 부담이 없다. 오직 초기화 되는 View Controller만 생성. (성능)
단점 :
재사용성이 떨어진다. (copy paste하게 되면 storyboard에 bind된 IBAction, IBOutlet의 의존성이 그대로 카피되며 오류를 발생 시킨다.)
인터페이스 빌더 안에서 데이터가 어떻게 이동하는지 보기 어렵다.
View Controller 간에 이동할 때 prepareForSegue를 override하는데 이러한 구현 방식은 에러를 발생시키며 불필요한 코드를 만들어낸다.
예 )
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
NSString *identifier = [segue identifier];
if ([identifier isEqualToString@"segue_name_1"]) {
MyViewController *vc = (MyViewController *) [segue destinationViewController];
[vc setData:myData];
} else if ([identifier isEqualToString@"segue_name_2"]) {
...
} else if ...
}
ㅁ NIBs (인터페이스 빌더)
용도 :
Modal View 디자인
간단한 로그인과 등록화면
설정
팝업 윈도우
재사용가능한 뷰 템플릿
재사용 가능한 테이블 뷰 cell 템플릿
잘못된 사용 :
view 가 동적으로 변하는 구간. (레이아웃이 컨텐츠 종류별로 많이 바뀌는 경우)
interface builder로 디자인하기 어려운 뷰
View Controller flow가 복잡한 경우 (story board)를 사용한다.
장점 :
재사용성
여러 클래스에 공유할 수 있다.
TTLoginView, TTSignupView
거의 비슷한데 약간의 문구 내용만 다른 경우 view template 를 공유 해서 사용 가능.
NIB는 lazy load
ㅁ 코드 UI 구현
용도 :
동적인 layout
View 특수 효과
NIB나 Storyboard를 사용하면 복잡해지는 경우
잘못된 사용 :
모든 상황은 코드로 해결 가능하다.
장점 :
보다 유연하게 Code level 에서 다루기 용이하다.
xml파일로 이뤄진 view 구조 안에서 무엇이 변경되었는데 merge conflict가 발생 했다면….문제 해결이 용이하지 않다.
(이유가 xml에 이루어진 view Controller, view 들의 Id가 알기 어려운 랜덤 문자로 이뤄져있기 때문입니다)
그런데 코드는 code만 보면 쉽게 해결 가능하다.
storyboard나 NIB 파일은 xml 을 parsing하는데 overhead가 있으며 결국 ui정보를 코드로 변환하는 작업이 있다.
재사용 가능성이 높다. 코드 레벨로 되어 있기 때문에 별도의 클래스로 분리한 뒤 상속이 용이하다.
단 과도한 상속과 override는 UI디자인이 어떻게 되어 있는지, 알기 어렵게 만든다.
단점 :
프로토타이핑이 어렵다. 실행 해보기 전까지 레이아웃을 확인하기 어렵다.
리팩토링이 어렵다. (매직 넘버와 custom method는 디버깅을 어렵게 한다)
TODO : 개행과 들여쓰기 정리 할것