발생일: 2016.06.15 키워드: 유니버셜 링크, universal link, smart banner, 스마트 배너, apple-app-site-association 문제: 앱에 유니버셜 링크를 적용하려고 한다. 해결책: 유니버셜 링크는 일반 웹사이트 URL을 클릭했을 때, 웹사이트로 이동하는 대신 연결된 앱을 열어주는 기능이다. 애플의 API 페이지에 정리된 유니버셜 링크의 특징은 아래와 같다. - Unique: 커스텀 URL 스킴과 다르게 다른 앱에서 처리할 수 없다. 유니버셜 링크는 웹사이트로의 링크이기 때문이다. - Secure: 앱을 설치할 때, iOS는 웹사이트에 업로드된 파일을 확인해서 해당 앱의 유니버셜 링크를 허용한다. 웹사이트에는 개발자만 파일을 업로드할 수 있기 때문에 안전하다고 ..
발생일: 2016.02.10 키워드: getValue 문제: 다음 달부터 iOS를 개발해보려고 한다. Objective-C 는 처음인데, 얼라? `getValue()` 메서드에 리턴값이 없다. NSValue *value = [points objectAtIndex:0]; CGPoint point; [value getValue:&point]; 해결책: getValue()는 특정 버퍼에 값을 복사하는 기능이다. CGPoint는 구조체이고, &point 는 구조체 인스턴스의 주소를 리턴한다. 즉, `point` 변수에 `value` 값을 할당하는 코드이다. 논의: 난 개발을 자바부터 배웠더니, getXXX()/setXXX() 패턴이 익숙해 리턴값이 없는 게 이상하게 느껴졌었다.ㅎㅎ 몇 달 지난 뒤에 보니, 너무..
발생일: 2016.04.01 키워드: UIView, tag, 태그 속성, 태그 프로퍼티 문제: 재사용되지 않는 UITableViewCell 에 특정 데이터를 담아뒀다가 꺼내쓰려고 한다. 기존 코드의 구조 상 UITableViewCell 을 상속할 수 없는 상태라서, 다른 방법이 있나 찾아봤더니 UIView 에 tag 라는 프로퍼티가 있다. 여기에 데이터를 담아뒀다가 꺼내쓰면 어떨까? 해결책: UIView 의 tag 프로퍼티에는 특정 뷰를 구분하기 위한 NSInteger 형의 고유값을 할당할 수 있다. 검색해보니, Mike Weller 라는 개발자의 글 중 tag 프로퍼티 활용에 대한 좋은 글이 있고, 나도 동의한다. 저자는 tag 프로퍼티는 뷰를 구분하기 위한 목적으로만 사용해야지, 데이터를 저장하는 용..
발생일: 2016.04.04 키워드: NSAssert, Assertions, NS_BLOCK_ASSERTIONS 문제: NSAssert() 를 실행해도 콘솔에 출력되지 않는다. 해결책: 빌드 설정에 NS_BLOCK_ASSERTIONS 매크로가 설정되어 있었기 때문이다. 빌드 설정에서 매크로를 제외하니 의도한 대로 실행된다. 논의: NS_BLOCK_ASSERTIONS 매크로가 있을 경우, NSAssert() 구문 자체가 실행되지 않으므로 함수 내에서 조건형의 함수를 호출하지 않도록 주의한다. - (void)checkValid { ... self.isValid = YES; } - (void)doSomething { ... NSAssert([self checkValid], @"..."); if (self.is..
발생일: 2016.04.40 키워드: tag, interface builder, 태그 속성, 태그 프로퍼티, viewWithTag 문제: xib 파일에 UIView 의 태그 프로퍼티를 할당하고 코드에서 해당 뷰를 가져오려고 한다. 해결책: Table View Programming Guide for iOS에는 태그를 사용해 테이블셀의 레이블을 설정하는 예제가 있다. 인터페이스 빌더의 Attributes inspector 에서 Tag 항목에 값을 설정해주면 된다. 코드에서는 아래와 같이 viewWithTag: 로 설정한 태그 값으로 가져올 수 있다. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPat..
발생일: 2016.03.22 키워드: AutoLayout, 오토레이아웃, 컨스트레인트, constraint 문제: 구현하려는 뷰는 상황에 따라 보이거나 보이지 않고, 상하 여백 또한 변한다. 처음엔 뷰의 hidden 속성을 NO 로 할당하는 것으로 처리했는데, 숨겨진 이후에도 여전히 높이는 유지되어 있는 것 같다. 어떻게 하면 될까? 해결책: 뷰에 height 컨스트레인트를 준 후, 컨스트레인트의 값을 0으로 설정한다. 이 방법이 가장 컨트롤하기 쉬운 방법으로 보인다. 추가로, - 내가 처리하려던 뷰는 UILabel 이었는데, height 를 0으로 할당할 땐 텍스트의 값도 초기화해줘야 한다. - 컨스트레인트를 업데이트할 때엔 UIView 의 updateConstraints 메서드에서 처리해주는 것이 적..
발생일: 2016.03.23 키워드: UITableViewCell, Selection, selectionStyle 문제: 테이블뷰의 셀 터치 시, 포커스되면서 배경이 회색으로 설정된다. 배경과 동일한 컬러의 View도 보이지 않게 되더라. 포커스된 걸 없애고 싶다. 어떻게 하면 되지? 해결책: UITableViewCell 에 선택되었을 때의 설정을 위한 옵션이 있다. 인터페이스 빌더에서는 아래와 같이 Selection 옵션을 None 으로 설정하면 되고, 코드로 추가하는 경우라면 selectionStyle 옵션을 UITableViewCellSelectionStyleNone 상수로 정의해주면 된다. - (void)awakeFromNib { self.selectionStyle = UITableViewCell..
발생일: 2016.03.23 키워드: UITableViewCell, reuseIdentifier, identifier, NSBundle mainBundle, loadNibNamed, registerNib, forCellWithReuseIdentifier 문제: 코드 리뷰를 받아보니, 내가 테이블뷰셀의 Reuse Identifier 설정을 빼먹었었다. deque 할 땐 정의했었는데 xib 에서 작성하는 걸 누락했는데, 종종 발생하는 실수라고 한다. 해결책: xib 로 테이블뷰셀을 만들고, 아래와 같이 NSBundle 의 loadNibNamed 로 xib를 불러오는 방식으로 구현했다면, - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAt..