페이지

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

2015년 4월 18일 토요일

이미지 고르기


    @IBOutlet weak var pickedImage: UIImageView!

    @IBAction func pickImage(sender: AnyObject) {
        var imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = UIImagePickerControllerSourceType.Camera   //PhotoLibrary
        imagePicker.allowsEditing = true
        self.presentViewController(imagePicker, animated: true, completion: nil)
    }
    
    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
        self.dismissViewControllerAnimated(true, completion: nil)
        pickedImage.image = image
    }

2015년 3월 1일 일요일

Udemy - The Complete iOS8 and Swift Course

요즘 Udemy에서 열심히 재밌게 듣고 있는 Swift 강좌가 있다.
우리 말로 하면 <15가지 실용 앱 만들면서 배우는 완벽한  iOS8과 Swift 과정> 정도?
강좌 처음부터 부지런히 쭉 보고 있는데 역시 사람들이 많이 찾는 코스는 이유가 있네.
영국식 영어인데 Rob 이 물론 설명을 잘 하는 거겠지만, 의외로 잘 들리고 이해도 잘 된다.
주변에 Swift 공부 시작하시는 분 있으면 꼭 추천해주고 싶은데.. 내 주변엔 없다.

오늘은 65강: Tic Tac Toe 라는 게임을 만드는 걸 해봤는데 배우는 게 참 많았다.
여전히 생소한 Auto Layout이라든가 Swift식 자료구조 접근 방법 등을 알기 쉽게 설명한다.
여러 말 해 무엇 하겠나. Swift 입문자들에게 강력 추천한다!
기본적인 리스닝만 된다면 무리 없이 수업 따라갈 수 있다.
샘플 강좌도 들을 수 있으니 한 번 들어보시길.


2013년 6월 16일 일요일

NSLog (when DEBUG)

#ifdef DEBUG
#define NSLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define NSLog( s, ... )
#endif

2013년 4월 19일 금요일

GCD(Grand Central Dispatch) 코드 템플릿



오래 걸리는 작업을 메인스레드에서 폴그라운드로 그냥 돌리면 블락(멍때림)된다.
시간이 걸리는 계산이나 디스크에 쓰기/읽기 하는 경우 등의 무거운 작업을 돌리는 경우,
GCD(또는 NSOperationQueue)를 사용하자.
템플릿은 다음과 같다:



dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 백그라운드 스레드로 진입하여 오래 걸리는 작업을 실시한다.

    dispatch_async(dispatch_get_main_queue(), ^{
        // 메인스레드의 UI를 변경하는 작업

    });
});


2013년 3월 1일 금요일

xib에서 아웃렛 연결이 안됩니까?

xib 에서 컨트롤의 아웃렛 연결 작업을 하려 하는데..
컨트롤 드래그가 전혀 안먹는 경우가 있어 헤맨 경우가 있을 것이다.
뷰컨트롤러의 클래스명을 일괄적으로 바꾼 경우, 커스텀 클래스 속성을 바꿔줘야 한다.

해결방법:
File's Owner 선택하고
Identity Inspector 에서 Custom Class 항목을 확인하라!


2013년 2월 4일 월요일

Modern Objective-C : 요약

source : iPhone iOS 6 Development Essentials

최근 iOS 6 SDK 에서 변경된 주요 내용 몇가지 요약.
개발자의 스트레스를 제법 많이 줄여줄만한 내용들이니 주목할 것.

1. Default Property Synthesis
더이상 @synthesize 구문을 사용할 필요가 없다는 건 많이들 알 것이다.
이젠 디폴트로 잡히므로, 다음처럼 instance 변수에 접근 가능하다.
_volumeControl.enable = YES;

2. Method Ordering
메서드 정의 순서를 말함. 이전에는 함수 호출 이후에 해당 함수 구현이 있으면 컴파일 에러를 뱉었는데, 이제는 더이상 문제되지 않는다고 함.

3. NSNumber Literals
이제 다음과 같이 넘버타입 리터럴 값들을 할당할 수 있다.
NSNumber *number;
number = @'A'; // Character
number = @YES; // Boolean
number = @43231ul // Unsigned Long
number = @123431ll // Long Long
number = @1254.23 // Float
number = @123 // Integer
number = @123.432 // Double

4. Array Litterals
배열 초기화 길고 지루했던 타이핑도 줄었다.
NSArray *carMakes = @[@"Hyundai", @"Chevy", @"BMW", @"Toyota", @"Volvo", @"Smart"];
또한 배열인덱스로 접근하는 것도 훨 수월해짐.
NSString *firstCar = carMakes[0];
carMakes[1] = @"Kia";
기본적으로 이 리터럴 초기화는 수정할 수 없는 배열이다. (immutable)
수정 가능한 배열로 뽑아내려면 다음과 같이 mutableCopy 사용하자.
NSMutableArray *carMakes = [@[@"Hyundai", @"Kia"] mutableCopy];

5. Dictaionary Literals
가장 자주 쓰는 딕셔너리도 역시 가볍게 바뀌었다! 쥐기네~
NSDictionary *bookListing = @{key1:object1, key2:object2, key3:object3};
bookOjbect = bookListing[key1];
bookListing[key2] = newBookObject;


6. 요약
전체적으로 코드가 읽기 수월해지고, 프로그래머의 타이핑 수가 현저히 줄었다.

2012년 11월 28일 수요일

진동 및 소리 모드 구분

http://developer.apple.com/library/ios/#documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Introduction/Introduction.html
// 관련 apple 문서



// AudioToolBox FrameWork 임포트 후

CFStringRef state;
UInt32 propertySize = sizeof(CFStringRef);
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
if(CFStringGetLength(state) == 0)
{
    //SILENT
}
else
{
    //NOT SILENT
}

2012년 11월 27일 화요일

진동 길게..



-(void)playVibeDuring:(int)second
{
    for (int i = 1; i <= second; i++)
    {
        [self performSelector:@selector(vibe) withObject:self afterDelay:i * .3f];
    }
}

- (void)vibe
{
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}

2012년 11월 15일 목요일

웹뷰 포커스 문제 (iOS5 이하)




    if ([[[UIDevice currentDevice] systemVersion] integerValue] >= 6)    // iOS 6 이전
    {
        [self.webView setKeyboardDisplayRequiresUserAction:NO];     // 포커스 이벤트 (iOS 6.0)
    }



//- (void)setFocus:(NSString *)objID
//{
//    NSString *htmlString = [NSString stringWithFormat:@"document.getElementById('%@').setAttribute('contentEditable','true')", objID];
//    [self.webView stringByEvaluatingJavaScriptFromString:htmlString];
//}
//- (void)killFocus:(NSString *)objID
//{
//    NSString *htmlString = [NSString stringWithFormat:@"document.getElementById('%@').setAttribute('contentEditable','false')", objID];
//    [self.webView stringByEvaluatingJavaScriptFromString:htmlString];
//}

2012년 10월 30일 화요일

더이상 쓰지 않는 아웃렛 끊어주삼!

프로퍼티, 씬떠사이즈 지운다고 끝나는 거 아니다. 아웃렛까지 끊어줘라.

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MyPopUp 0x1dde98c0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key insideView.'

ABAddressBookSave()의 추억..

아이폰 연락처에 접근하기 위해서
ABAddressBookRef 객체를 생성해서 사용한다.
이놈을 통해 Person 레코드도 그룹도 접근할 수 있다.
일반적인 조회는(풀스캔조차) 기가막히게 빠르고, 
저장도 무척 빠르다. (안드로이드의 그것과 비교할 수 없다)
그런데, 이번에 연락처 프로젝트 하면서 골치 꽤나 썩었던 업데이트가 있는데
동기화 관련 프로세스였다. 잠깐 소개하자면, 
update가 여의치 않아 기존 데이터를 remove하고 새로 insert하는 방식을 택했다.
연락처 풀스캔해서 찾아 remove, and insert하는 작업을 라이브러리 펑션으로 빼놨었다.
지우고, 저장... 
아무리 봐도 그렇게 오래 걸릴만한 작업이 아닌데 3GS에서 10여초가 걸렸다 ;;
나중에 동료의 제안으로 수정을 했는데,
오래 걸리는 주된 원인은 ABAddressBookSave() 이놈이었다!
레코드(또는 그룹)를 삭제하거나, 추가한 뒤 변경사항을 최종 commit하는 놈인데
내 기억으로, 이놈이 거의 1초 가까이를 잡아먹었다..
해결은, ABAddressBookSave() 이놈을 함수 밖으로 빼서 한번만 커밋.
순식간에 서버에서 다운받은 연락처가 폰연락처에 후루룩 저장됐다. 쩐다~

요약 : 특별한 경우(!) 제외하고, record(group) 변경 후, 건건이 ABAddressBookSave()할 필요는 없다.


2012년 10월 24일 수요일

The jsonData argument is NULL 에러 (problem with JSONKit in iOS 5)


이 문제 해결 못하면,
iOS 5 지원 포기해야 한다 ;;;
(iOS 6로 업글 하시기 바랍니다 ^^;)

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The jsonData argument is NULL.'

2012년 10월 23일 화요일

countForCategoryIndex

하이라이팅 이쁘게 해서 영어로 피드백 보냈는데,
과연 소중하게 받아들여질까?

2012년 10월 11일 목요일

Multiple build commands for output file xxxx


Multiple build commands for output file /Users/tkword/Library/Developer/Xcode/DerivedData/PlayWithMe-ajevesjczbukwwenrvrtybrxnsfy/Build/Products/Debug-iphonesimulator/PlayWithMe.app/hit_me.png

위와 같은 경고 메시지는.. hit_me.png라는 이미지 파일이 빌드 단계에서 두 개 이상이 발견되어 뿌려주는 워닝이다. check it out ~

2012년 10월 10일 수요일

Beautiful custom tabbars (Link)

Search Results for tabbar: 34 controls found - Cocoa Controls:

iOS 6 Address Book not working? (펌)


source : iOS 6 Address Book not working?
-(BOOL)isABAddressBookCreateWithOptionsAvailable {
    return &ABAddressBookCreateWithOptions != NULL;
}
-(void)loadContacts {
    ABAddressBookRef addressBook;
    if ([self isABAddressBookCreateWithOptionsAvailable]) {
        CFErrorRef error = nil;
        addressBook = ABAddressBookCreateWithOptions(NULL,&error);
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
            // callback can occur in background, address book must be accessed on thread it was created on
            dispatch_async(dispatch_get_main_queue(), ^{
                if (error) {
                    [self.delegate addressBookHelperError:self];
                } else if (!granted) {
                    [self.delegate addressBookHelperDeniedAcess:self];
                } else {
                    // access granted
                    AddressBookUpdated(addressBook, nil, self);
                    CFRelease(addressBook);
                }
            });
        });
    } else {
        // iOS 4/5
        addressBook = ABAddressBookCreate();
        AddressBookUpdated(addressBook, NULL, self);
        CFRelease(addressBook);
    }
}
void AddressBookUpdated(ABAddressBookRef addressBook, CFDictionaryRef info, void *context) {
    AddressBookHelper *helper = (AddressBookHelper *)context;
    ABAddressBookRevert(addressBook);
    CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);

    // process the contacts to return
    NSArray *contacts = ...    

    [[helper delegate] addressBookHelper:helper finishedLoading:contacts];
};

Build Succeeded ~!



맥 OS 마운튼 라이언으로 업데이트하고 나서부터,
Xcode 4.5 백그라운드에서 빌드 완료되면 이런 게 뜨네~
친절하고, 귀엽다 ^.^

"시스템 루트" 키체인을 수정할 수 없습니다.



OS 10.8.2 기준, 인증서 새로 등록하려다 보니 위와 같이 키체인 등록 에러..
cer(p12) 파일 더블클릭 시, 마운은 라이언이 '로그인' 항목이 아닌 '시스템 루트'에 추가를 시도해서 나타나는 현상이라 한다. 키체인-로그인 에다가 드랙-드랍 하면 된다.

근데, 애초에 나의 문제는 장비가 바뀌었기 때문에
포탈을 통해 인증서를 새로 발급받거나,
기존 다른 맥에서 잘 사용하던 인증서를 '보내기'한 파일(.p12)이 있으면 굳~
천만다행으로 프로젝트 팀 공유용 드랍박스에 p12 파일이 있어서 살았다.^^ 유후~

2012년 10월 9일 화요일

UIDevice 클래스를 이용해서 디바이스 정보에 접근하는 예제 (펌)

맥부기 애플(iOS,Mac) 개발자모임 :: 네이버 카페:



UIDevice 클래스를 이용해서 디바이스 정보에 접근하는 예제입니다.

대부분 클래스의 속성값을 통해서 값을 얻어오기 때문에 크게 복잡한 부분은 없습니다.
디바이스 상태 변화에 따른 노티피케이션 처리 코드만 유의해서 살펴보신다면 이와 유사한 목적의 코드를 구현하시는데 큰 어려움은 없을 것 같습니다.