레이블이 XCode인 게시물을 표시합니다. 모든 게시물 표시
레이블이 XCode인 게시물을 표시합니다. 모든 게시물 표시

2014/10/10

[iOS] User Defined Runtime Attributes

User Defined Runtime Attributes란? 

Xcode의 Interface Builder에서 특정한 UI 객체에 사용자가 정의하는 값을 바로 입력하는 기능을 말합니다.
Storyboard에 정의된 객체에서 값을 설정할 수 있는 것으로, Identity Inspector tab에서 설정할 수 있습니다. 

InterfaceBuilder의 User Defined Runtime Attributes 설정 화면과 시뮬레이터 표시 내용.

위의 그림처럼 Interface Builder에서 UIView를 넣고, Identity Inspector Tab에서 값을 입력하게 되면, m파일에서 UIView의 객체를 연결해서, 직접 입력한 것처럼 동작하게 됩니다.

입력 할 수 있는 값은 어떤 것이 있을까요?

Boolean - BOOL
Number - NSNumber *
String - NSString *
Point - CGPoint
Size - CGSize
Rect - CGRect
Range - NSRange
Color - UIColor *
LocalizedString - NSString *
(Localizable.string 파일에서 Key를 입력하고, 해당 locale에 맞는 string을 입력)
Image - UIImage*




Xcode 6에서는 총 10가지를 입력할 수 있습니다.

위에 첫번째 이미지에서 layer.borderColor는 바로 설정할 수가 없습니다.
전달되는 객채는 UIColor이고, layer.borderColor는 CGColorRef를 사용하기 때문입니다.
가능한 방법은
CALayer의 카테고리를 생성하고, 그 카테고리에 setBorderColorFromUIColor 함수를 만들어 줍니다.
source code
#import "CALayer+extension.h"

@implementation CALayer (extension)
- (void)setBorderColorFromUIColor:(UIColor *)color
{
    self.borderColor = color.CGColor;
}
@end

h파일에도 함수를 선언해 주어야 합니다.
이제, InterfaceBuilder에서 layer.borderColorFromUIColor 를 사용해서, 색상을 설정할 수 있습니다.


위의 시뮬레이터에서 테두리 색상이 설정된 것을 볼 수 있습니다.


[참고]

- iOS-Blog : User Defined Runtime Attributes
- ATOMIC SPIN : Expanding User-Defined Runtime Attributes in Xcode with Objective-C




2013/12/29

[Xcode] Custom Code Snippet 사용하여, 코딩 생산성을 올려 봅시다.

 Xcode에서 init를 치면, 관련추가 함수가 표시되는 Code Snippet이 동작하게 됩니다.
이 코드 스니펫에 내가 원하는 Code Snippet 즉, 내가 만든 '코드 정보'를 추가할 수 있습니다.

코드 스니펫은 뭘까요?

코딩할 때, init를 치면, 추가적으로 표시되는 부분이 있습니다. Code Completion이라고 하는데, 여기에 코드 묶음이나, 함수가 자동으로 추가되는 것이 있습니다.
init를 치면, - (id) init {...}가 자동으로 추가되는 것과 같은것입니다.

여기에 내가 만든 Custom code snippet 을 추가해 봅시다.

이전 블로그에서 Keyboard관련 함수가 있었는데, 이것을 코드 스니펫에 넣어 두고, 필요한 ViewController에서 바로 사용할 수 있도록 설정해 보겠습니다.
일단 Code Snippet Library가 화면에 표시되도록 합니다.
(오른쪽 아래에 표시되는 코드 스니펫 라이브러리)
(메뉴에서 코드 스니펫 라이브러리 보기)

그리고 추가할 코드를 블록으로 선택하고, 드래그해서 코드 스니펫에 넣습니다. 아래 이미지는 이전 블로그에서 추가한 Keyboard Notification관련 코드를 스니펫으로 추가하고 있습니다.
코드를 선택해서 Code Snippet Libarary에 Drag해서 넣기

추가된 것이 표시가 되면, 클릭해서, Edit를 해서, 정보를 수정합니다.

(추가된 스니펫을 수정하기, Edit Custom Code Snippet)

  • Title: 코드스니펫 라이브러리에 표시되는 이름
  • Summary: Title 밑에 설명으로 표시됩니다.
  • Completion Shortcut : 코딩할 때, 이 숏컷을 입력에 대해서 코드스니펫이 표시가 됩니다. init를 입력하면 함수가 나오는 것 처럼.
  • Completion Scopes : 함수 내에서 사용을 하거나, 클래스 메소드에 추가될지 범위를 설정하는 것입니다.
    • All: 모든 경우에 다 표시됩니다.
    • Class Implementation : 클래스의 메소드 입력할 때 표시됩니다. 
    • Code Expression : 메소드 내에서 코드 입력할 때 표시 됩니다.


그럼 코드에서 사용해 봅시다.

위에 Compeltion Scopes를 Class implementation으로 해두어서, 함수 입력 부분에서 DBU를 치면 입력이 나와야 합니다. 아래처럼..
(함수 입력 부분에서 DBU를 치면 내가 입력해둔 코드 스니펫이 표시가 된다. Enter하면 그 코드가 추가된다.)
위와 같이 표시되고, 엔터를 치면, 코드가 추가가 됩니다.

코드에서 토큰입력할 수 있는 코드를 넣어 봅시다.

token labeled Code는 탭키로 입력부분에 바로 이동할 수 있는 토큰 코드 입니다.
(forin 입력시 표시되는 token labeled code)
입력한 코드 스니펫에 token labeled code를 추가합니다.
추가하는 방법은 <# Code #>을 입력하면 됩니다. 아래 처럼.

(코드스니펫에 token labeled code 추가하기)
 이 코드를 직접 사용하게 되면 아래와 같이 표시가 됩니다.
잘 추가해 두면 아주 유용하게 사용할 수 있을 것 같습니다.
(실제 표시된 된것)

이 코드 스니펫은 백업이 될까요? 다른 팀원과 같이 사용할 수는 없을까요?

Xcode를 다시 설치하면, 이 코드 스니펫이 다 사라지지 않을까요? 그리고, 팀원들과 같이 동시에 같은 코스 스니펫을 관리하고 사용할 수는 없을까요?
이거 아시는 분 좀 알려주세요.
저장된 XML을 Backup하고 다시 copy하면 추가가 될까요? 흠...

Custom Code Snippet이 저장되는 위치는?

/Library/Develper/Xcode/UserData/CodeSnippets/...
XML로 저장이 됩니다. 텍스트에디터로 확인을 해보면 아래처럼 나옵니다.
(XML로 저장된 Custom Code Snippet)


참고자료:



2011/06/25

iOS에서 sqlite3 관련 Framework 추가하기.

안녕하세요. iOS 관련 개발을 하면서, sqlite3을 사용하고 있는데, Framework을 등록하지 않아서 Linking Error가 발생했습니다.
에러 내용은 아래에 있습니다.


Undefined symbols for architecture i386:
  "_sqlite3_open", referenced from:
      -[MemoPadAppDelegate readMemoFromDatabase] in MemoPadAppDelegate.o
  "_sqlite3_prepare_v2", referenced from:
      -[MemoPadAppDelegate readMemoFromDatabase] in MemoPadAppDelegate.o
  "_sqlite3_column_int", referenced from:
      -[MemoPadAppDelegate readMemoFromDatabase] in MemoPadAppDelegate.o
  "_sqlite3_column_text", referenced from:
      -[MemoPadAppDelegate readMemoFromDatabase] in MemoPadAppDelegate.o
  "_sqlite3_step", referenced from:
      -[MemoPadAppDelegate readMemoFromDatabase] in MemoPadAppDelegate.o
  "_sqlite3_errmsg", referenced from:
      -[MemoPadAppDelegate readMemoFromDatabase] in MemoPadAppDelegate.o
  "_sqlite3_finalize", referenced from:
      -[MemoPadAppDelegate readMemoFromDatabase] in MemoPadAppDelegate.o
  "_sqlite3_close", referenced from:
      -[MemoPadAppDelegate readMemoFromDatabase] in MemoPadAppDelegate.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status 


위에 나온 것과 같이 sqlite3_open 과 같은 SQLite3관련 함수를 사용하면 Symbol을 찾을 수 없다고 나옵니다.
참 당황스럽더군요. 왼쪽에 보이는  Frameworks에 관련 프레임워크를 넣으면 될 것 같은데, 어떻게 넣는지... Apple의 개발자 사이트를 찾아보니...
먼저 XCode4.0의 왼쪽 Project Navigator에서 제일 위에 있는 프로젝트를 선택합니다.
위 그림처럼 프로젝트 선택하면, 프로젝트에 대한 설정을 변경할 수 있습니다. 거기에 Build Phase부분에서 Link Binary With Libraries 부분에 Sqlite3관련 라이브러리를 등록하면 됩니다.
+로 되어 있는 부분을 선택하면, 아래와 같이 추가할 수 있습니다.
 libsqlite3.0.dylib를 찾으면 됩니다. 아니면, 서치부분에 sqlite3을 입력하면 2개만 나옵니다.
여기서 하나를 선택해서 넣으면 됩니다. (다른 dylib 둘의 차이는 ??? )
 추가를 하고 나면...

라이브러리가 추가 되어 있고, Cmd + b 로 빌드를 하면 에러 없이 빌드 됩니다.

참고되시길~