Objective-C의 기능 추가

1. Nullability annotations 
2. Generics 



안녕하세요 야곰입니다 :)

Swift 2.0이 오픈소스화 되면서 관심이 많이 쏠리고 있습니다.


그러나 기존 Objective-C 프로그래머들 사이에서는 Swift에 따라 변화되는 다양한 모습들이 부담으로 다가오기도 합니다. Swift 언어 문법과 기능들에 더 잘 맞춰주기 위하여 기존의 API들이 변경되기도 하고, Objective-C의 문법적 기능들과 키워드들이 몇몇가지 추가되기도 했습니다. 그에대해 간략히 살펴보는 시간을 가져보도록 할게요.


# 해당내용은 2015년 6월 말에 작성된 내용으로, 애플에 의해 추후 변동의 여지가 충분히 있음을 미리 알립니다.


# Nullability

Swift는 지난 포스팅에 말씀드렸듯 자료형에 굉장히 민감합니다. 더불어 nil에 대해서 Objective-C와 완전히 다른 대응체계를 가졌죠. Swift 에서는 nil이란 녀석에도 굉장히 민감합니다. 그래서 그런 Swift의 특성에 맞도록 Objective-C의 기능이 추가되었습니다. 바로 nullability라는 기능인데요, 한 번 살펴보죠. Nullability 기능은 Xcode 6.3 / Swift 1.2 버전부터 정식 지원합니다.


weakstrong, __weak__strong 이라는 키워드 기억하시나요? ARC 때문에 생겨난 새로운 키워드였죠. 이와 쓰이는 위치가 비슷합니다. (예를 든 것일뿐 weak와 strong 키워드와는 전혀 상관이 없습니다)


Nullability 기능으로 새로 생겨난 키워드는 nullable, nonnull, null_unspecifiednull_resettable 등입니다.


- nullable : 해당 항목이 null일 수 있다. 즉, Swift의 옵셔널 [?] 항목입니다.

- nonnull: 해당 항목이 null일 수 없다. 즉, Swift의 논옵셔널 항목입니다.

- null_unspecified : 해당 항목의 null 여부가 지정되어있지 않다. 즉, Swift의 암시적 추출 옵셔널 형식 [!] 항목입니다.

- null_resettable : 해당 프로퍼티가 기본값을 가지고 있어 nil일 수 없을 경우에 사용합니다.

                               즉, nil을 할당하면 즉기 기본값으로 초기화되는 프로퍼티에 사용할 수 있습니다. 

                               Swift에서는 암시적 추출 옵셔널 형식 [!] 으로 표현됩니다.


* nullability 키워드를 별도로 지정하지 않는 경우 null_unspecified가 기본입니다.

** nullable, nonnull, null_unspecified는 Objective-C 프로퍼티와 메소드, C와 블럭 포인터 등 

     전반적으로 모두 사용가능하지만, null_resettable은 Objective-C 프로퍼티에만 사용 가능합니다.


일단 메소드에 쓰이는 예를 살펴보죠. UIViewController의 한 메소드입니다. Swift 코드와 Objective-C 코드를 살펴보면 기존의 API와 다르게 nullability 관련 키워드가 Swift의 옵셔널 형식에 맞게 반환자료형 또는 전달자료형 뒤에 삽입되어 있음을 확인할 수 있습니다.


[ nonnullnullable의 API 적용 예 ]

[ null_unspecifed의 프로퍼티 적용 예 ]


위에서 nullability 관련 키워드를 설정해 주지 않는 경우 기본적으로 null_unspecified가 기본값으로 적용된다고 말씀드렸는데, 기본값을 변경할 수 있는 메크로가 존재합니다. NS_ASSUME_NONNULL_BEGIN과 NS_ASSUME_NONNULL_END. 이렇게 한 쌍으로 존재합니다. 저 한 쌍의 매크로 안쪽에 해당하는 항목들은 기본적으로 nonnull 옵션이 적용됩니다.

스크린샷을 보시면 실제로 Swift에서 어떻게 적용이 되는지도 확인하실 수 있을겁니다.



[ Objective-C 코드에서 NS_ASSUME_NONNULL_BEGIN과 NS_ASSUME_NONNULL_END의 적용 예 ]



[ 위의 Objective-C 코드로 작성된 내용을 Swift 코드에서 확인 ]



null_resttable에 관련된 프로퍼티를 찾아보았으나 찾지 못했습니다. 애플이 제공한 null_resettable에 관한 문서설명에는 아래 스크린샷과 같이 나와있지만 실제 tintColor는 null_resttable이 아니었습니다 :) 참고로 알아두시면 될 것 같습니다.



null_resttable에 대한 설명 ]




# Generics


Objective-C에서 제네릭이 추가되었다고하여 찾아보았는데, 아마도 Swift의 콜렉션 타입(배열, 딕셔너리, 세트)를 위해 반영이 된 것 같습니다. Objective-C 에서는 배열(NSArray), 딕셔너리(NSDictionary), 세트(NSSet)에 자료형에 상관없이 한 콜렉션에 여러가지 객체형태를 넣어줄 수 있었죠. 즉, myArray라는 NSArray에 문자열도, 숫자도, 뷰 객체도 한 번에 들어갈 수 있었다는 이야기입니다. 그러나 Swift에서는 하나의 콜렉션에는 하나의 자료형밖에 담지 못합니다. Array도, Dictionary도, Set도 전부 담게되는 자료형을 명시해 주고, 그 자료형과 맞지 않으면 넣을 수 없었습니다. 이런 차이를 극복하기 위해 Objective-C에 기능을 추가했군요. 저는 Objective-C의 콜렉션이 자료형과 상관없이 넣을 수 있어서 참 강력하다고 생각했는데, 개인적으로는 아쉽습니다. Objective-C의 generics은 Xcode 7 / Swift 2.0 부터 지원합니다.


스크린샷을 보시면 어떻게 상호 호환되는지 확인해 보실 수 있습니다. __kindof 키워드는 그 클래스와 하위 클래스까지 호환됨을 의미합니다. 실질적으로 Swift의 코드에 미치는 영향은 없습니다.


[ Objective-C 코드에서 Generics의 적용 예 ]


[ 위의 Objective-C 코드로 작성된 내용을 Swift 코드에서 확인 ]



애플이 단지 Swift를 밀어주기 위해 Objective-C를 변경 하는 것인지, 아니면 두 언어의 상생을 위하여 Objective-C를 조금 희생시키는 것인지는 두고봐야 할 것 같습니다.
 

# 오늘은 6.25 한국전쟁 발발일입니다. 오늘만이라도 뼈아픈 민족상잔의 비극을 잊지않고 되돌아 보는 시간이 되면 좋겠습니다.

[역사를 잊은 민족에게 미래는 없습니다]

by yagom

facebook : http://fb.yagom.net

facebook group : https://www.facebook.com/groups/yagom/

twitter : http://twitter.yagom.net ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   



Posted by yagom

댓글을 달아 주세요

  1. Favicon of https://maccrazy.tistory.com BlogIcon maccrazy 2015.06.29 20:36 신고  댓글주소  수정/삭제  댓글쓰기

    전 Swift를 위해서 Objective-C의 문법을 망치고 있다고 밖에 보이지 않네요. 참 안타까운 일이 아닐 수 없습니다. :(
    Objective-C에 기능 추가는 바라지 않지만 그냥 가만히 두기라도 하면 좋겠다는 생각이 드네요.


# 재미있는 언어 Objective-C
여러분들께서는 오브젝티브-C를 어떻게 생각하시나요? 언어의 역사와 배경을 아는 것이 정말 무의미해 보일지 모르겠지만, 오브젝티브-C의 탄생 배경을 살펴보면 재미난 점도 많고, 사용하면서 부딪힐 의문에 대해서도 더 많이 이해하게 될 수 있습니다.
그럼 오브젝티브-C는 어떻게 태어났는지, 왜 제대로 알고 써야 할지 생각해 볼까요?

# Objective-C는 어떻게 탄생하고 발전해왔을까?
오브젝티브-C는 ‘객체 지향 프로그래밍 C언어 [Object-Oriented Programming in C, OOPC]’라는 이름으로 시작된 언어입니다. 즉, C를 객체 지향 언어로 발전시킨 것으로, 1983년에 발표되었습니다. 당시 사람들은 구조적 프로그래밍  습관에 따라 프로그래밍을 하였는데, 풀어내야 할 문제들이 많이 생겨나자 그 해결책으로 객체 지향 프로그래밍  연구를 활발히 하던 시절이었습니다.

애플사에서 나온 스티브 잡스는 넥스트사를 설립한 후 오브젝티브-C의 사용 허가를 받았습니다. 그는 회사를 꾸준히 발전시켜 넥스트스텝이라는 객체 지향형 운영체제에 사용하기 위하여 AppKit과 Foundation Kit 등을 개발하였습니다. 이것이 현재 애플 운영체제의 전신이 되었습니다. 그 후 넥스트는 애플에 합병되었고, 애플은 넥스트에서 쓰던 툴들을 기반으로 Mac OS X라는 운영체제를 출시하였습니다. 오늘날 애플의 Cocoa API 대부분은 이에 기반을 두었죠(애플 운영체제의 클래스 접두어가 대부분 NS인 것이 바로 이 때문입니다).

애플은 2006년 애플 세계 개발자 회의Apple Worldwide Developers Conference, WWDC에서 ‘현대적인 가비지 콜렉션, 문법 기능 향상, 런타임 성능 개선, 64비트 지원’을 포함하는 오브젝티브-C 언어의 리비전Rivision으로 오브젝티브-C 2.0 공개하였습니다. 즉, 우리가 현재 배우고 사용하고 있는 오브젝티브-C는 오브젝티브-C 2.0이죠.

# 왜 Objective-C의 특성을 살려야 할까?
앞에서 언급했듯이 오브젝티브-C는 조금은 독특한 역사를 가지고 있으며, 객체 지향의 특징을 구현하기 위하여 많은 고민을 거듭하여 발전한 언어입니다. 절차 지향 언어인 C에서 파생된 언어이고, 자세히 파헤쳐보면 100% 객체 지향 언어라고 하기에는 무리가 있지만, 저는 객체 지향 특성을 제대로 활용할 수 있는 몇 안 되는 언어 중에 하나라고 생각합니다. 또한, 같은 객체 지향 언어라 하더라도 C++, Java와는 조금 다른 특성들을 많이 갖고 있기에 기존에 개발하던 개발자들이라도 배워야 할 필요가 분명히 있습니다.

게다가 오브젝티브-C를 사용하는 것은 대부분 애플 기기 기반의 애플리케이션을 제작하려는 목적이므로 당연히 애플이 제공한 프레임워크 및 킷을 활용하여 제작할 것은 자명한 사실이죠.

지금에 비하여 처음의 Cocoa API는 오브젝티브-C의 특성을 잘 살리지 못했었습니다. 하지만 지금은 API의 특성을 이해하지 못하면 사용하기 어려울 정도로 오브젝티브-C의 특성들을 많이 활용하고 있습니다. 또한, 프로토콜(특히 Delegate), 카테고리, 블록, GCD 등 오브젝티브-C의 특징을 살린 API와 패턴들이 점점 많아지고 있습니다. 그러므로 좀 더 안정적이고, 유연하고, 빠른 애플리케이션 개발을 위하여 오브젝티브-C의 특성을 알아야 한다고 생각합니다



제 생각들을 조금 정리해 보았는데, 여러분들의 생각은 어떠신지요?
많은 고수분들의 의견을 들어보고 싶습니다 ^^

P.S. 오브젝티브-C를 오브젝트C 라고 잘못 표현하는 분들이 종종 계십니다. 정식명칭은 'Objective-C[오브젝티브-C]'가 맞습니다.

by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/

twitter : http://www.twitter.com/yagomSoft ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   

 


Posted by yagom

댓글을 달아 주세요

  1. 연이 2014.06.11 11:35  댓글주소  수정/삭제  댓글쓰기

    좋은정보감사합니다^^

  2. 푸나 2015.12.16 16:46  댓글주소  수정/삭제  댓글쓰기

    NSString NSArray이런것들에 왜 NS가 붙는지 궁금했는데 의문점을 한방에 풀어주시네요!
    많이 배우고 갑니다.


오늘의 주제

1. 계산기 기능 넣기
2. 메모장 화면 구성 바꾸기



쉰 한 번째 시간입니다.^^

지난 번에 만들어 놓은 계산기 아직 잘 갖고 계신가요?ㅎㅎㅎ
이제 계산기 로직을 완성해 볼 차례입니다.

아............. 지금 제가 글을 쓰고 있는 이 시간은 아직 훈련소에 가기 전이지만, 전 지금 훈련소에서 뒹굴고 있겠군요 ㅋㅋㅋㅋㅋㅋㅋㅋ

뭐, 응원의 한마디...는 볼 수 없겠지만 무탈히 돌아오도록 기도해주세요 ㅋㅋㅋㅋㅋ

2일 전인데 한달이라도 막상 가려니까 싱숭생숭 하네요 ㅋㅋㅋ

아마 들어가기 전까지도 계속 블로그 포스팅 예약을 하다 갈거 같은..ㅋㅋㅋㅋㅋㅋㅋㅋ

뭐 여튼 사설은 각설하고 시작해 봅니다~~~~~~~~~~~~~


# 계산기 기능 완성하기

일단, 지난번에 구현파일에 만들어 주었던 enum을 헤더로 옮겨옵니다. 거기에 FUNC_INVALID도 추가해줬어요 ㅎ

그리고 아래 interface에 enum 변수 하나를 만들어 주었구요~

enum이 뭔지 잘 모르겠다 하시는 분들은
2012/05/24 - [C] - C <20>. enum 

을 참고해 주세요 ㅎㅎㅎ


자, 이제 다시 구현파일로 넘어와서~

일단, 변수 초기화를 따로 메소드로 빼주었습니다. 왜냐면 2번 이상은 사용할 것 같거든요 ㅎㅎㅎ C버튼 눌렀을 때랑, 처음 viewDidLoad되었을 때. 생각난김에 메소드로 빼주고 viewDidLoad에서 호출도 해 줍니다.


자, 그리고 화면에 숫자를 출력해 줄만한 메소드도 하나 따로 빼줍니다 ㅎㅎㅎ


자, 그리고 이제 계산을 해 줄 메소드를 하나 만들어 줍니다. 아마도 = 버튼을 눌렀을 때 요녀석이 실행이 되겠죠?ㅎㅎㅎ
(현재 로직은 약간 틀린 부분이 있습니다만, 아래쪽에서 조금 수정을 해 줄거예요. 일단 요렇게 작성해 주세요..ㅎㅎㅎ)


자, 그리고 숫자 버튼을 눌렀을 때 동작할 메소드를 채워넣어 줍니다.


자, 그리고 기능키를 눌렀을 때 어떻게 동작할지를 버튼과 연결된 메소드에 채워넣어 줍니다 ㅎㅎ
switch문이 아직도 헷갈리는 분들은
2011/12/14 - [C] - C <7>. 조건문(2) switch 
참고 해 주시면 좋을 것 같네요 ㅎㅎ 


자, 그리고 나서 실행 해 봅니다. command + R
어때요 ㅎㅎㅎ 잘 동작하나요?
이것저것 해보다 보면 뭔가 약간 안맞는게 있습니다...ㅎㅎㅎ
네......그렇죠 ㅎㅎㅎ
2 + 3 하고 = 을 누르면 5가 나옵니다.
그리고 또다시 = 을 누르면 8이 나와야 하는데 7이 나올거예요... 흐음... 로직에 문제가 있다!!!!!!!!!!!! (제가 새벽에 정신이 혼미한 상태로 하다보니...)ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

그래서 수정해 줬습니다.
헤더파일에 와서 새로운 flag 변수를 하나 만들어 주었구요~


구현파일에 와서 약간의 조건을 추가해 줍니다. 기존에 변수에 저장하던 값들도 살짝 바꿔줬구요.


그리고 계산부분의 변수들도 살짝 바꿔줬습니다 ㅎㅎ



자, 그리고 다시 실행!!!!!!

어떠세요? 잘 동작하나요?

제가 계산기를 잘 안써봐서 로직을 생각해 보려고 한참 쑈를 했었더랬죠... 계산기 한 번만 켜서 해보면 되는것을...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

여튼 뭐 이렇게 초간단 계산기가 완성되었습니다~!

가로 모드로 바꾸면 공학용 계산기가 나오게도 해보고 싶었으나... 시간이 없는 관계로(낼모레 입소... 'ㅁ') 메모장으로 넘어가 볼게요 ㅋㅋㅋ



# 메모장 화면구성 변경

지난번에 메모장 화면도 조금 만들어 놨었는데요, 살짝만 바꾸도록 합니다 ㅎㅎ


다들 그림만 보고 이해는 하셨으리라 믿습니다 ㅎㅎㅎ

자, 이제 본격적으로 메모장 구현은?

다음 포스팅에......ㅋㅋㅋ



by yagom

facebook : http://fb.yagom.net

twitter : http://twitter.yagom.net ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 






Posted by yagom

댓글을 달아 주세요

  1. 스테디셀러 2012.09.19 16:12  댓글주소  수정/삭제  댓글쓰기

    잘 보고있습니다 :) 그런데 소숫점 처리는 어떻게 해야 할까요?

  2. 컴맹 2012.09.24 18:53  댓글주소  수정/삭제  댓글쓰기

    와~ 정말 잘 됩니다.^^
    정수와 소숫점자리 처리 모두 잘되구, 사칙연산 이상없이 계산 잘됩니다.ㅎㅎ
    오늘도 정말 많이 배우고 갑니다.~^^
    지금쯤 고생이 많겠네요.ㅠㅠ
    그래도 24일이니까 일주일만 참으세요.ㅎㅎ
    복귀하면 치킨에 맥주라도 한잔?? ㅎㅎ (당연히 제가 살께요.^^)

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.10.03 21:51 신고  댓글주소  수정/삭제

      므하하
      건강하게 잘 돌아왔습니다~!
      치맥 사주신다면야!
      정중히 흡입하겠습니다 ㅎㅎㅎ
      신나네용~~~~~~~으히히

  3. 마스터 2012.11.19 21:36  댓글주소  수정/삭제  댓글쓰기

    이거 [self setNumberLable:resultValue];
    랑 [self setNumverLavle:currentInputValue];
    에서 오류 나네요

  4. 시우아빠 2012.11.20 22:46  댓글주소  수정/삭제  댓글쓰기

    11월 초 부터해서 51번 강의까지 다 끝났네요~
    메모장은 아무래도 시간이 안되셔서 여기서 마무리 하신거 같아서 아직 부족한게 많지만
    저도 기초 강좌는 여기서 마무리하고 본업인 게임쪽으로 넘어가려고 합니다.
    앞으로하시는 다른 강의도 열심히 보겠지만
    우선은 지금까지 강의를 통해서 도움을 많이 받았기에 인사를 한번 드려야 할거 같아서요^^
    자기 시간 쪼개서 이렇게 공개강좌를 한다는 쉬운일이 아닐텐데 공익을 위해서 이렇게 노력해주셔서
    저같은 사람들은 얼마나 도움이 많이되는지 모릅니다.
    책을 통해서도 배울수 있지만 이렇게 게시판을 통한 강의도 나름대로 특수성이 있고
    특히 Yagom님의 강의 경우에는 쉽게 이해할수 있는 말로 많이 풀어 써 주셔서 이해도 쏙쏙 잘되고 여기까지 쉼없이 달려 올 수 있었던거 같습니다.
    다시 한번 감사의 말씀 드리고 앞으로도 좋은 강의 많이 부탁드리겠습니다.^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.21 20:38 신고  댓글주소  수정/삭제

      이렇게 좋은 덧글 남겨주셔서 저도 정말 영광입니다.
      앞으로도 종종 들러서 글도 남겨 주세요^^*
      정말 고맙습니다!

  5. Favicon of https://ahnfilm.tistory.com BlogIcon AhnFilms 2012.11.23 10:31 신고  댓글주소  수정/삭제  댓글쓰기

    메모장 포스팅 기다리겠습니다 그리고 항상 잘 보고 있습니다

  6. 김민국 2013.01.22 23:31  댓글주소  수정/삭제  댓글쓰기

    7번강의까지 보고 마지막엔 뭘하나 볼려고 봤는데
    정말 좋은 강의 포스팅 해주셔서 감사해요^^

    혹시 프로젝트의 기획 설계와 구현
    이런 전체적인 것을
    따라하면서 배울수잇는 강의를 하실생각은없으신가요?^^ㅋㅋㅋ
    무지 힘든강의겠군요..ㅜㅜㅋㅋㅋ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.01.23 09:39 신고  댓글주소  수정/삭제

      안녕하세요, 이렇게 덧글 주셔서 정말 고맙습니다 :)

      음... 그것은 프로젝트 성격과 앱 스타일에 따라서 변동이 많은 부분이라 쉽사리 딱 이게 좋은 방법이다 하기에는 무리가 있을 것 같아요^^;

  7. 마스터 2013.01.26 19:24  댓글주소  수정/삭제  댓글쓰기

    야곰님 배터리 용량을 가져오는 매소드 같은건 없나요?

  8. 안녕하세요 2013.03.31 23:09  댓글주소  수정/삭제  댓글쓰기

    항상 이 블로그에서 많은 자료를 얻는거 같아 기쁨니다ㅎㅎㅎ
    하나 물어볼게 있는데, 이전에 띄어논 AlertView를 어떤 변화(타이머 종료, 로딩 종료 등)가 있으면 사라지게 하는 방법도 있나요? 메소드가 있을거 같은데 아무리 찾아도 없네요 ㅜㅜ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.04.02 17:13 신고  댓글주소  수정/삭제

      안녕하세요 :)
      어떤 변화가 감지되는 시점에서 alertView를 dismiss 시켜주시면 됩니다.
      :) 추가적으로 더 궁금하신게 있다면 말씀해 주세요

  9. devtest 2013.07.11 13:20  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님 오늘 또 왔네요ㅎㅎ
    혹시 xcode를 이용해서 콤보박스를 만들 수는 없을까요?
    아무리 생각해도 만들 방법을 모르겟네요ㅜㅜ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.07.11 16:12 신고  댓글주소  수정/삭제

      콤보 박스보다는 아무래도 picker view가 많이 사용되지요...^^

      굳이 콤보박스를 구현해야 한다면 오픈 라이브러리들을 사용해 보셔야 할 것 같습니다 ㅎㅎ

      https://www.cocoacontrols.com/search?utf8=%E2%9C%93&q=combo

  10. 하이앟 2013.09.30 23:00  댓글주소  수정/삭제  댓글쓰기

    좋은 강좌 정말 감사합니다~^^
    무지 많은 도움 받고있어요.
    그런데..ㅎㅎ메모장 구현은 언제쯤?*^^*~기다리고 있을게염~><

  11. 키르미느 2013.10.15 02:50  댓글주소  수정/삭제  댓글쓰기

    야곰님 여쭤볼게 있는데
    제가 네비게이션 기반 실습을 해 보려고 한느데
    첫 화면을 SNS같은 일반 로그인창으로 만들어서 로그인을 하면 로그인된 첫 화면으로 갈텐데
    네비게이션 바가 달려 있어서 다시 백 버튼을 누르면 아이디 및 패스워드 (로그인창)창으로 다시 갈텐데
    로그인된 첫화면에 네비게이션 바를 없애는 게 맞을까요? 로그인 시 아예 다른 뷰를 생성하는 게 맞는 건가요?

    혹시 전자가 맞다면 네비게이션 바, 즉 백버튼 사라지게 하는 건 어떻게 하는 건가요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.10.15 11:24 신고  댓글주소  수정/삭제

      안녕하세요 :)

      때에 따라 두 가지 방법 중에 선택해서 사용합니다.

      주로 로그인 화면은 모달로 많이 띄우기도 하지만 네비게이션으로 처리할 수도 있습니다.

      네비게이션 프로퍼티 중에 navigationBarHidden 이라는 프로퍼티 값을 NO로 설정해 주시면 네비게이션바가 보이지 않습니다 :)

  12. 키르미느 2013.10.16 12:25  댓글주소  수정/삭제  댓글쓰기

    그런데 로그인 화면을 모달로 띄우라고 하셨는데 자세히 알 수 없을까요 소스라도 ㅠㅠ

    두 번째 질문!! ios 7에 xib 파일은 main story 보드로 통합 된 듯?? ㅠㅠㅠㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.10.16 18:14 신고  댓글주소  수정/삭제

      ^^;; 로그인화면 샘플코드는 검색하셔도 종종 나올 것 같구요, iOS 7에서는 기본적으로 스토리보드가 생성됩니다. 수동으로 xib를 사용할 수도 있구요.

      모달로 띄우는 방법은 UIViewController 클래스의
      - (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
      메소드를 참고해 보세요~

  13. 으앙 2013.11.06 22:07  댓글주소  수정/삭제  댓글쓰기

    레이블에 숫자표시가 안되네요 ㅠ


오늘의 주제

1. 실전 프로젝트 생성



벌써 쉰 번째 시간입니다.^^

많이도 써왔나 보네요...ㅎㅎ
벌써 오십번 째 글이라니 +_+

이거 한 편 쓰는데 시간이 얼마나 오래걸리는지 여러분들을 모르실거예요..ㅋㅋㅋㅋㅋㅋㅋ

이제 실전 프로젝트(?) 라고 하기는 좀 그렇지만 예제 앱을 하나 만들어 볼까해요.
물론 저는 디자인을 하지 못하기 때문에 그냥 있는 그대로의 녀석들을 쓰겠지만 말예요..ㅎㅎ

간단한 계산기랑 메모장(?) 정도를 만들어 볼까해요.
단순히 감을 익히는데에는 큰 무리가 없을 것이라고 봅니다.

스토리보드를 원하는 분들이 많이 계셔서, 간단한 앱이기도 하니까 스토리보드와 ARC를 사용하여 진행하도록 하겠습니다.

iOS5.1 Xcode 4.3.3 기준입니다.

오늘의 간단 결과물입니다.
미리보기 +_+ㅋㅋㅋ


한 번 출발해 봅니다 ㅎㅎ

# 프로젝트 생성

우리는 두 개의 탭을 가진 탭바 기반 어플리케이션을 만들거예요.


스토리보드와 ARC사용에 체크를 했구요~



# 화면구성하기

짜잔~ 제 포스팅에서 처음으로 스토리보드가 등장을 했군요..ㅎㅎㅎ
저는 좀 구식이라 스토리보드는 저도 아직 잘 사용할 줄 모릅니다 ㅎㅎ 
눈에 보여서 편하긴 한데, 그만큼 뭔가 댓가가 있겠죠?ㅎㅎ 여튼 잡소리는 그만하고, 계속 가 봅니다 ㅋㅋㅋㅋㅋㅋ 


자, 일단 First View는 계산기로 사용하려고 해요.

뷰 속성에 들어가서 배경색을 그럴싸하게 좀 바꿔주고~ (그래봐야... 뭐... 쩝..ㅋㅋㅋㅋㅋㅋㅋ 그래도 기본만으로 뭔가 할 수 있게 해준 애플의 디자인 센스는 좋습니다ㅋㅋ)


First View라고 써있던 라벨의 위치와 크기를 적절히 조절해주고 오른쪽 정렬~ 그리고 0으로 세팅해줍니다 ㅎ


자, 그리고 뭔가 계산기처럼 그럴싸하게 버튼들을 넣어주세요 ㅋㅋㅋ


그리고 어시스턴스 모드로 전환해서 아울렛 연결하는 방법 다들 아시죠?ㅎㅎㅎ
오른쪽 버튼 드래그 또는 컨트롤 키 누르면서 드래그!!
라벨의 property 생성해 줍니다~
요게 잘 이해가 안되신다면?
2012/04/03 - [iOS Dev/깨알 Tips] - Xcode4 xib의 객체 소스파일과 쉽게 연결하기

를 참고하시면 되겠습니다 ㅎㅎ


그리고 두번째 탭에 있던 뷰도 텍스트뷰 하나 올려주시고, 버튼 두개 올려서 아울렛이랑 액션 연결 해 주세용~ 


자. 이거 좀 헷갈리실 수 있는데, 0부터 9까지 한 메소드에 연결을 할 거예요.
0에서 액션을 하나 생성해 주시고, 1~9까지 같은 메소드 자리로 연결하시면 됩니다. 자세한 설명은 그림에~! 
점(.)을 포함한 기능키들은 아래에서 또 따로 해줄거예요~ 



자, 기능키들도 하나의 액션 메소드에 연결해 줍니다. 방법은 동일해요~


자, 그리고 버튼마다 태그를 지정해 줍니다.
0번 버튼은 0
1번 버튼은 1...
9번까지 태그를 지정해 줍니다. 



그리고 기능버튼들도 마찬가지 입니다.

 
+ : 100, - : 101, * : 102, / : 103, C : 104, = : 105, . : 106


자, 이렇게 106번까지요 ㅎ


자, 이렇게 화면구성은 대강 마무리 된 것 같군요~

그럼 계산기로 사용될 FirstViewController에 와서 코딩을 좀 해봅시다 ㅎㅎ
일단 사용하여야 할 변수들을 선언해 주시구요.
추후에 수정하였는데 CGFloat이 아니라 double로 선언해주세요!!! 꼭이요!!!



아까 태그달았던 버튼들 나중에 번호 헷갈릴게 분명합니다.
벌써부터 헷갈리는데요?ㅎㅎ
enum을 사용하여 우리가 알아보기 쉽게 만들어 줍시다.

내려와서...
변수 초기화 잊지 말아주시구요 :)
숫자 버튼을 눌렀을 때 동작하는 메소드 부분을 구현해 봅시다.
자세한 설명은 역시나 주석에 ^^*

추가적으로 설명하지 않은 것은 pow라는 녀석인데,
pow( x, y )라고 해주면 x의 y제곱을 구해주는 함수입니다. ㅎ

그리고 또! %.0lf,  %lf 등이 무슨말인지 잘 모르겠다 하시는 분들은 아래 포스팅을 참고하세요ㅎㅎ
 
2011/12/05 - [Objective-C] - Objective C <4>. 실수 표현 방법
2011/12/03 - [Objective-C] - Objective C <3>. 변수. Variable



자... 여기까지 작성하고 한 번 실행해 보세요~

화면에 숫자가 제대로 표시되나요?ㅎㅎ

아 물론 소수점이 찍히는 기능키는 코딩하지 않았기 때문에 동작을 하지 않지요 ^^ 

자, 오늘은 여기까지 해볼게요...ㅎㅎㅎ

신나지 않나요?

물론 전 지금 훈련소에서 뒹굴고 있겠죠...ㅋㅋㅋ

어차피 포스팅은 예약 되어 있으니까 다음에 또 뵙도록 해용 >_<



by yagom

facebook : http://fb.yagom.net

twitter : http://twitter.yagom.net ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




Posted by yagom

댓글을 달아 주세요

  1. 컴맹 2012.09.24 17:22  댓글주소  수정/삭제  댓글쓰기

    오~~ 드디어 스토리보드도 하시는군요.ㅎㅎ
    스토리보드도 관심은 있지만, 기본 UI 도 사용법이 서툴기 때문에 접근을 못했었는데.^^
    그런데 현재 소스상으로는 positionNum값이 0미만일 경우가 없기때문에 else문은 실행이 되지 않겠네요. (소숫점 버튼에 대한 처리가 없기때문에...^^;)
    뭐, 다음강좌에서는 0미만일경우가 처리가 되어 else문이 사용되겠죠.
    좋은 강좌 잘보고 갑니다.~~~^^

  2. 21 2012.11.10 01:31  댓글주소  수정/삭제  댓글쓰기

    저.... 야곰님 질문이 잇는데여 ㅎㅎ
    탭바 기반에서 탭바가 안보이도록 할순없나요ㅜ..?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.11 15:46 신고  댓글주소  수정/삭제

      안녕하세요 21님~!
      방문해 주셔서 고맙습니다 :)
      음... 탭바 기반에서 탭바가 안보이게 하려고 하신다구요^^;
      처음부터 탭바 기반으로 작성하지 않는 방법이 있지만...
      탭바가 있는 상태에서 탭바를 안보이게 하려면 setHidden 메소드를 이용하시면 될 것 같은데요~^^
      탭바 이름이 tabBar라면
      [tabBar setHidden:YES];
      이런식으로요~^^

  3. 시우아빠 2012.11.20 16:19  댓글주소  수정/삭제  댓글쓰기

    드디어 실전이군요 ^^ 이제 곧 마무리네요~

  4. 117 2013.07.24 01:37  댓글주소  수정/삭제  댓글쓰기

    탭바에서 first나 second같이 이름써져있는거 이름은 어떻게 바꾸는 건가요ㅎㅎ?;;

  5. 2014.06.08 01:19  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다


오늘의 주제

1. 예외처리

마흔 아홉번째 시간입니다.^^

싱글턴 패턴에 대해서는 조금 익히셨나요?
그 외에도 디자인 패턴이란 것은 많이 존재합니다. 싱글턴 패턴은 아주 간단한 예에 지나지 않습니다.
디자인 패턴에 관심이 생기신다구요?
그렇다면 이제 아주 기초는 벗어나고 있다~ 라고 생각하시면 되겠습니다..ㅎㅎㅎ
물론 제가 말씀드리지 않은 것들은 정말 많지만, 저의 목표는 레퍼런스들을 나열하여 언제든 가져다 쓸 수 있는 것보다는 여러분들이 직접 원리를 알고, 개발문서를 통해 스스로 뭔가를 만들어 낼 수 있는 그런 포스팅이 되길 바라기 때문에 굳이 레퍼런스들을 다 나열하진 않았습니다.

많은 도움이 되셨는지 모르겠습니다. :)

이 기초 포스팅도 이제 막바지를 향해 달려가고 있습니다.
정말 몇 개 쓴거 같지도 않은데 이제 두어달만 있으면 일년이 되네요^^;
그동안 부족한 포스팅에 덧글도 응원도 많이 해 주신 여러분들께 진심으로 감사의 마음을 표합니다.

사설은 여기까지 하도록 하구요,

지난 포스팅에 이어 이번에도 iOS에 국한된 이야기라기 보다는 Objective-C 언어에서의 이야기를 해보려 합니다.
싱글턴도, 예외처리도 코코아 터치 프레임워크를 사용하는 것이라기 보다는 언어를 사용하는 테크닉 중 하나라고 볼 수 있겠지요.

오늘 포스팅은 정말 짧지만 정말 강력한 하나가 될 것이라 믿어 의심치 않습니다 ㅎㅎ

어쨌거나 저쨌거나 출발합니다~~~~~~~~~~


# @try @catch @finally

예외처리가 뭔가요???

여러분 여기까지 오면서 누구나 한 번 쯤은 Memory  Access Violation, Exception Error... 등등, 어플리케이션이 튕겨버리는 일을 겪지 않으신 분 없을겁니다.

즉, 어플리케이션이 죽어버리는... 만약 사용자가 사용하다가, 내가 사용하다가 퍽하고 강제종료 되어버리는... 이런 참사를 예방하려면 예외처리에 많은 심혈을 기울여야 하겠습니다. ㅎㅎㅎ

즉, 잘못된 처리로 인해 튕겨버릴 상황이 와도 한 번은 내가 컨트롤 해 볼 수 있는 여지를 만드는 것이 예외처리 입니다.

말로만 해서 잘 감이 안오시죠?

한 번 해봅시당 ㅎㅎ

지난 번에 사용하던 프로젝트에 그대로 적용해 보겠습니다.

싱글톤 객체에서 파일을 저장하던 메소드에 임의로 exception 에러를 발생시켜 봅니다.

NSDictionary는 Mutable이 아니기 때문에 setObject 메소드를 사용할 수 없지요. 그런데 임의로 Mutable인 것처럼 가장하여 메소드를 호출 해 봅니다.

말도 안되는 코드이긴 하지만, 실제로 종종 일어날 수 있는 일이기도 합니다. 이제 추가적으로 남은 것은 주석으로 모두 설명이 되어있습니다 ㅎㅎ

결과까지 한 화면에 나와있지요?



자, 이렇게 혹시 모를 상황에 대비하여 예외처리를 잘 사용해 주는것이 중요합니다.

이 하나의 포스팅으로 여러분의 어플리케이션이 조금 더 안정적이 되기를 희망합니다~

그럼 이만 뿅 ㅎㅎ



by yagom

facebook : http://fb.yagom.net

twitter : http://twitter.yagom.net ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




Posted by yagom

댓글을 달아 주세요

  1. 컴맹 2012.09.24 16:50  댓글주소  수정/삭제  댓글쓰기

    오늘은 짧아서 좋네요.ㅎㅎ
    짧긴하지만, 정말 중요한 명령이죠.^^
    어플이 죽지 않게 할수 있으니까요.^^;
    좋은 강좌 잘보고 갑니다.~~~

  2. 시우아빠 2012.11.20 12:07  댓글주소  수정/삭제  댓글쓰기

    실제로 저 예외처리를 공부할때는 많이 썼었는데 실제 현업에서는 잘 사용안하더라구요~
    말씀하시는대로 빨리 죽이고 크래시 핸들링을 하는게 더 나을수도 있으니까요.
    그리고 코드가 커지는 경우 유지 보수가 많이 힘들더라구요.
    하지만 중요한 코드에는 저런식으로 관리해주는게 훨씬 좋을것 같습니다.

    그런데 @finally는 왜 필요한 걸까요? 어차피 항상 실행되는 문이면 이후 진행되는 블럭하고 의미가 다르지 않을꺼 같은데
    무지한 질문이니지만 잘 몰라서 그러니 이해해 주세요^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.20 12:55 신고  댓글주소  수정/삭제

      실제로 현업에서도 잘들 써주시면 얼마나 좋겠습니까만... 다들 한줄 한줄 늘리기만 급급하지 귀찮아서 잘 하지를 않습니다...
      나중엔 저거 하나 안해서 몇 날 며칠을 보이지않는 버그와 싸워야 할텐데ㅜㅜ
      finally를 넣어둔 이유는 이 코드가 예외처리가 되었기에 동작하는 코드다, 즉, 이녀석이 제대로 돌아가려면 위에서 제대로된 예외 확인이 필요하다 뭐 그런뜻이 아닐까 조심스레 생각해 봅니다...ㅎ

    • 낭만떡대 2012.11.22 10:01  댓글주소  수정/삭제

      finally 가 필요한 이유는 (저도 잘 모르겠습니다만.. ㅎㅎ;; )
      보통 다른 프로그램을 예를 들면..

      DB 접속 구문
      try {
      작업;
      DB 접속 헤지
      }
      catch {
      예외 작업;
      DB 접속 헤지
      }

      이런 구문을

      DB 접속 구문
      try {
      작업;
      }
      catch {
      예외 작업;
      }
      finally {
      DB접속해지;
      }

      이렇게 try건 catch건 관계없이 반드시 실행되야 되는 코드를 넣는곳이 아닐까요 코드 양도 줄어들고.. (물론 다음 블럭에 취소 DB접속해지 구문을 넣어도 되지만 다음 구문이 없는 경우도 있고, 한 블럭에서 처리하면 논리적으로 이해가 쉽고.. 아놔 아닌가;; )

      iPhone 프로그래밍에서 보면
      지금은 ARC를 이용중이라 상관 없는 이야기지만..

      객체생성;
      try {
      각체에 어떤 작업;
      객체소멸;
      }
      catch {
      예외작업;
      객체 소멸;
      }

      이것을


      객체생성;
      try {
      각체에 어떤 작업;
      }
      catch {
      예외작업;
      }
      finally {
      객체 소멸;
      }

      이렇게 사용이 아닌가 싶은데..

      글을 쓰다보니.. 이건 아닌거 같기도 하네요..
      -_-;; ㅎㅎ;;
      힘들게 쓴거라 우선 Commit ㅎㅎ;;

      (질문에 대한 답변은 아닙니다. 무지한 사람의 의견 나눔입니다...)

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.22 10:26 신고  댓글주소  수정/삭제

      예, 떡대님 말씀이 맞습니다 ㅎㅎㅎ
      시우아버님 질문의 요지는 어차피 밑에서 실행할거면 굳이 finally를 넣을 필요가 있나... 위에서 예외처리를 끝냈다면 밑에 일반코드처럼 작성해도 되지 않느냐 였는데, 떡대님이 더 좋은 보충설명을 넣어주셨네요 ㅎ
      고맙습니다 ㅎ

    • 낭만떡대 2012.11.22 10:42  댓글주소  수정/삭제

      흠... 다시 생각해보니... 제가 질문을 잘못 이해했군요 ㅋㅋ;; 죄송합니다. ㅋㅋ;;

    • 낭만떡대 2012.11.22 11:05  댓글주소  수정/삭제

      그냥 코드를 명확하게 한다. 정도 뿐이 안되겠네요 지금까지 고민하고 있었음.. ㅋㅋ;;


오늘의 주제

1. Singleton 패턴 사용해 보기


마흔 여덟 번째 시간입니다.^^

지난 번에 이어서 싱글턴 패턴 사용 방법에 대해 알아보도록해요 ㅎ

일단... 뭐... ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
지금 여러분들이 이 포스팅을 보고계신 시간이면 저는 논산 훈련소에 있겠네요~ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아이 좋아.............는 개뿔......
면회 환영합니다..............는 개뿔.........ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

여튼 오늘부터는 한달동안 제가 덧글을 달아드릴 수 없게되었군요...ㅠ_ㅠ

몸 건강히 돌아오겠습니다.ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

한 달 캠프 으쌰~

자 잡소리 때려치고~

스따뚜~~~~~~~~~~~~


# 싱글톤 객체 활용

이제 싱글톤 객체를 사용하기 위해, 헤더를 import해 옵니다.

그리고 원래 있던 메소드는 깔쌈히 지워주시고 싱글톤 객체 안에 구현해놓은 녀석들을 사용하기 위해 예쁘게 작성합니다 호호호


불러오기도 마찬가지로 예쁘게 바꿔줍니다~


자, 그리고 파일로 읽고 쓰는 것 대신 싱글톤 객체에만 세팅하고 가져오는 기능도 따로 만들어주기 위하여 이렇게 또 버튼을 만들고 메소드를 만들어 줍니다~


자 이렇게 간단히 메소드 구현을 마쳐주시구요~~~~~~~



SecondViewController로 넘어와 봅니다~ 여기도 위와 똑같이 작성해 주시면 됩니당 ㅎㅎ



그리고 생각해보니 화면전환 기능을 안 넣어줬군요.....

훈련소의 압박으로 정신머리가 좀 나갔습니다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

ViewController로 와서 화면전환을 위한 버튼을 만들어주고 연결 해 줍니다~ 



자, 그리고 이렇게 깔쌈하게 두줄로 완성~


그리고 다시 돌아올 방법도 만들어줘야겠죠?ㅋㅋㅋ
이렇게 연결해 줍니다. 


그리고 이렇게 한줄로 구현 끝~!


자, 실행 해 봅니다~
뭔가 되나용?ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


어!? 그런데..... 아오....... 이놈의 키보드때문에 뭐가 안되는구만요...ㅠㅠㅠ


키보드놈을 없애봅시다~!

각각버튼을 누르고 나면 키보드를 사라지게 하는 마술을 심어줍니다 ㅎㅎㅎ 


그러고나서 이리저리 왔다갔다 하면서 어떻게 동작을 하는지 확인해 보세요~ 예상했던 것과 같은 동작들을 하는가 잘 살펴보세요 ㅎㅎㅎ



자... 이처럼 싱글턴 객체는 한 번 생성되면 메모리에 계속 상주하면서 데이터를 지니고 있게 됩니다.

어떤 곳에서도 그 한 객체를 불러내서 쓸 수 있는거죠~

재미있는녀석이죠?ㅎ 

 
잘 활용하면 득이되고, 잘못 활용하면 독이되는 녀석이기도 합니다.

뭐..... 제가 매번 이런말을 하는 것 같긴 하네요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

자, 그럼 이만 뿅~!


by yagom

facebook : http://fb.yagom.net

twitter : http://twitter.yagom.net ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




Posted by yagom

댓글을 달아 주세요

  1. 궁금궁금 2012.08.31 17:18  댓글주소  수정/삭제  댓글쓰기

    함께해보기에 있는 48개의 글 목록을 한 번에 볼 수 있는 방법이 있나용...???

  2. 승준 2012.09.04 09:58  댓글주소  수정/삭제  댓글쓰기

    몸건강히 훈련 잘 받고 오세요!~

    그동안 포스트 반복 학습하며 다음 글을 기다리고 있을께요

  3. 컴맹 2012.09.16 06:18  댓글주소  수정/삭제  댓글쓰기

    아~ 지금쯤 고생이 많겠네요.ㅠㅠ
    오늘도 좋은강좌 잘보고 갑니다.~

  4. 시우아빠 2012.11.20 11:48  댓글주소  수정/삭제  댓글쓰기

    이제 이곳에 덧글을 남겨야 겠네요^^
    오늘도 좋은 강좌 잘 보고 갑니다.

  5. 낭만떡대 2012.11.22 09:38  댓글주소  수정/삭제  댓글쓰기

    병특이셨군요 ㅋㅋㅋ

    반갑습니다 동지 ㅋㅋ

    전 얼마전에 끝났는데 모두~ ㅎㅎ

    질문. 1.

    공통으로 접근하는 싱글톤 객체를 만들고 prefix 에 import 하고 사용하는 것에 대해
    보안상 이슈는 없는지 궁굼하네요 보통 그렇게들 쓰시나요? (로그인 정보나 기타 중요정보.)

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.22 10:24 신고  댓글주소  수정/삭제

      아... 부럽습니다 ㅠ_ㅠ 어디서 근무하셨나요 ㅋㅋ
      질문에 대한 답변으로는 각각의 테크닉이 많이 존재하기 때문에, 앱이 어떤 정책을 가지고 운영(?) 되느냐에 따른 문제인 것 같네요.
      로그인 정보 등 중요정보에 대한 저장방법은 검색을 좀 더 해보시면 좋을 것 같아요 :)
      정말 좋은 질문 고맙습니다 ㅎ

  6. ss 2012.11.26 00:13  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, ios 프로그래밍 공부하고 있는 학생인데요 ^^
    싱글톤이 필요해서 열심히 따라했는데ㅠㅠ
    저는 스토리보드에서 이걸 구현하고 싶어서요 ㅠㅠ
    똑같이 따라하고 xib파일 대신 스토리보드에서 뷰를 연결해주는 방식만 다른데 안되네요 ㅠㅠ 어떻게 하면 좋을까요

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.26 10:57 신고  댓글주소  수정/삭제

      스토리보드에서도 같은 방식으로 연결해 주면 되지 않나요?^^;

    • yimcold@gmail.com 2013.10.10 11:40  댓글주소  수정/삭제

      지금 댓글을 달기에 많이 늦은감이 있지만.. 저는 이런 식으로 해결했어요~
      1. 스토리보드에서 두번째 뷰컨트롤러의 Storyboard ID를 secondViewCon으로 지정해주고,

      2. 코드를
      secondViewController: (id)sender{
      SecondviewController *secondViewCon = [self.storyboard instantiateViewControllerWithIdentifier:@"secondViewCon"];
      [self presentModalViewController:secondViewCon animated:YES];
      }
      이렇게 작성하니까 되네요~ 늦었지만 비슷한 문제가 있으신 분들 참고하시라고 올려요. 제가 초보라 수정할부분 있으면 지적해주시면 감사하겠습니다.

  7. 2012.11.29 12:19  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.21 20:41 신고  댓글주소  수정/삭제

      안녕하세요 앱만들자님!
      이렇게 글 남겨 주셔서 정말 영광입니다.
      정말 도와드리고 싶은 마음은 굴뚝같지만 제가 그 부분에 있어서는 큰 도움을 드리지 못할 것 같아요...ㅠㅠ 현재 저의 개인적인 사정으로도 좀 벅찬 상태라서요ㅜ 죄송합니다..
      정말 진심으로 죄송합니다...ㅜ
      꼭 더 좋은 분 찾으시면 좋겠네요...
      정말 죄송합니다ㅜ

  8. 리얼왕초보 2013.06.27 13:59  댓글주소  수정/삭제  댓글쓰기

    이번 강좌는 맥부기에 없어서 여기서 봤는데
    진작에 야곰님 블로그에서 공부할껄 그랬네요 ㅠㅠ
    스크린샷한것도 크게보이고 ㅠㅠㅠㅠ
    정말 너무 많은 것을 배운 시간이었습니다~
    아무리 감사를 드려도 부족하네용~~~

  9. 리얼왕초보 2013.06.27 14:15  댓글주소  수정/삭제  댓글쓰기

    야곰님~아래 팁으로 주신 키보드 없애는 방법을
    키보드 외 화면을 터치하면 키보드가 사라지게끔~
    메서드 하나 알려주시면 안될까용?
    부탁드립니다~~

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.06.28 10:35 신고  댓글주소  수정/삭제

      http://blog.yagom.net/507
      제스쳐 인식으로 뷰에 탭 제스쳐 인식을 넣어서 특정 동작을 하게 만드시면 될 것 같습니다 :)

  10. ㄴㄴ 2013.11.09 02:37  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 강좌 잘 보고 있습니다.

    이번 강좌에서

    [singletonObj setCurrentString:inputTextField.text]

    이 부분에 대해서 자세한 설명좀 해주시면 안될까요?

    제가 서로 다른 뷰에서 간단한 숫자를 공유해서 입력하고 받아서 쓰는 코드를 구현중인데

    입력까진 되는것 같은데 다른 뷰에서 받으면 계속 0으로 나오네요;


오늘의 주제

1. Singleton Pattern 


마흔 일곱 번째 시간입니다.^^

지난 번에는 파일을 저장하고 로드하는 것을 해 보았습니다.
이번에는 파일에서 로드해 온 자료를 다른 객체들과 공유하여 사용하고 싶을때 사용해 볼만한 방법을 가지고 왔습니다~

물론 Objective-C에서만 쓰이는 방법이 아니지만, iOS 개발 할 때에도 유용하게 쓰일 수 있는 방법이라 이렇게 또 소개를 해 드립니다.
싱글톤 패턴이라고 흔히 이야기들을 하는데요, 무엇인지 한 번 알아보도록 합니다~


# 싱글톤 패턴이란?

한 프로그램에서 특정한 용도의 객체 하나를 생성해서 공용으로 사용하고 싶을 때 주로 사용하는 방법입니다.

주로 환경설정, 로그인 정보, 유저 정보 등을 한 번 객체에 생성해 두고 여러 객체에서 공유해서 데이터를 쓸 수 있는 방법이죠.

즉, 프로그램이 실행되고 끝날 때 까지 특정용도를 가지는 단 하나의 객체를 만들어 놓고 쓰게 되는 것입니다. 물론 임의로 해제해 주지 않는다면요 :)

말로만 이렇게 떠들어 대니 잘 감이 안오시죠?ㅎㅎㅎ

그런데 일단 static 이라는 녀석에 대해서 조금 알아보실 필요가 있습니다.

static이 어떤 녀석인지 정확히 알고 계신분은 바로 따라오셔도 좋습니다~

모르는 분들은 프로그래밍 언어 기본서에 보면 나와있을거구요, 포털 검색을 통해서도 많이 나올거예요^^~

자, 그럼 실습을 시작해 봅니다~
 

# 실습

지난 번에 만들었던 프로젝트를 그대로 사용합니다~

여러 객체간에 데이터를 공유하는 것을 실습해 볼 것이므로, 화면을 옮겨다녀 보는게 효과적일 것 같네요~

뷰 컨트롤러를 하나 더 만들어 줍니다 ㅎ


자, 그리고 이렇게 지난 번에 했던 것 처럼 새로운 뷰 컨트롤러에도 화면을 구성해 줍니다~



자, 이번엔 싱글톤 클래스를 생성하도록 할게요~




NSObject를 상속받는 SingletoneObject라고 이름을 지었어요. 사실 Singleton이 맞는 표현인데, 제가 자꾸 Singletone이라고 쓰네용 +_+


자, 이렇게 새로 생성된 클래스의 헤더에 와서요~

이런저런 것들을 작성합니다.

지난번에 파일에서 읽고 쓰기 했던 것들도 여기로 옮겨올 거구요, 공통적으로 쓰고 불러올 NSString 객체 포인터도 하나 만들어 줬구요~ 


자, 헤더에서 property로 던져줬으면 구현파일에서 synthesize로 받아주는거 잊지 않으셨죠?ㅎ

그리고 지난 번에 파일저장 메소드 구현했던 부분에서 복사해와서 붙여넣고 살짝 손봐줍니다 ㅎㅎㅎ


파일에서 불러오기도 마찬가지구요 :~)


자, 그리고 가장 핵심부분!!!

싱글턴 객체를 만들어주는 부분입니다.

static이라는 처음보는 녀석이 등장했죠? 주석으로 간략하게 설명을 써놓긴 했지만, 이해가 힘드시다면 검색을 해 보시는 것을 강력추천합니다 ^^; 



자, 이렇게 싱글톤 클래스까지 완성을 했습니다~

이제 이 녀석을 어떻게 사용하게될지 궁금하지 않으세용?ㅎㅎㅎ

제가 앞으로 어떻게 진행할지 감이 오는 분들도 분명 계실거 같아요 ㅎㅎ

음... 일단 오늘은 여기까지 쓸건데요 ㅎㅎ 한 번 써보고 싶은 분들은 마음껏 써보세요~

컴퓨터 폭발 안합니다~ 


으히히, 여튼 다음에 또 만나용~ :-)





by yagom

facebook : http://fb.yagom.net

twitter : http://twitter.yagom.net ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




Posted by yagom

댓글을 달아 주세요

  1. 컴맹 2012.09.16 05:37  댓글주소  수정/삭제  댓글쓰기

    오~ 멀티쓰레드까지 신경써주시는군요.^^
    오늘도 많이 배우고 갑니다.
    좋은 강좌감사합니다.~~

  2. 시우아빠 2012.11.20 11:49  댓글주소  수정/삭제  댓글쓰기

    멀티쓰레드` 갑자기 튀어나와서 ㅋㅋ 검색해봤습니다.^^
    역시 공유 객체의 경우 저렇게 보호를 해줘야 하겠네요
    좋은 내용 많이 배워 갑니다.

  3. 디지시스 2013.04.25 16:04  댓글주소  수정/삭제  댓글쓰기

    에잇 왜 추천은 한번밖에 안되는걸까요

  4. Hide 2013.11.28 15:25  댓글주소  수정/삭제  댓글쓰기

    야곱님 사랑해요


오늘의 주제

1. 딕셔너리 형태의 객체를 파일로 쓰고 읽기


마흔 여섯 번째 시간입니다.^^

지난 두 포스팅에서는 모양새를 바꿔보는 것을 해 보았어요~
사실상 명목이었지 어쨌든 개념적인 요소가 많았지요 ㅎㅎㅎ

이번에는 파일을 읽고 써 보는 시간을 가져보도록해요 ㅎㅎ

매번 어플리케이션이 종료되면 모든것이 다 날아가 버리면 아쉽잖아요.
뭔가 저장하고 다시 가져올 수 있는 방법, 간단한 파일 쓰고 읽기를 해 보도록 합시다~

자, 그럼 시작해 볼까요?ㅎㅎ


# 파일 입출력

자, 우선 오늘도 프로젝트 하나를 만듭니다.

지난 두 프로젝트와는 달리 이 프로젝트는 3개 ~ 4개 포스팅 동안 사용하게 될 것 같네용 호호


늘 그래왔듯이 싱글 뷰 어플리케이션으로 만들어 줍니다 ㅎㅎ
 


이름은 YGFileManagement


첫 실행화면 ViewController.xib로 들어와서 이렇코롬 만들어 줍니다.
이제 이 정도는 설명하지 않아도 되리라 굳게 믿습니다 ㅋㅋㅋ 


딕셔너리 형태의 객체를 파일로 쓰고 읽는다고 했을 때 의아해 하신분들이 분명 계셨을 겁니다.

스쳐지나와서 생각 못하셨다구요?ㅎㅎㅎ

자, 우리는 파일을 plist형태로 쓰고 읽어주는 작업을 할거예요. plist...??? 어디서 들어본거 같은데???

그쵸?ㅋㅋㅋ Supporting Files에 AppName-info.plist라는 파일을 보실 수 있을거예요.

눌러보세용 ㅎㅎㅎ

그 안에 어떤식으로 구성이 되어있나요?

Key - Value 형식...!! 어!!!?? 딕셔너리네?

네~ 딕셔너리 형식으로 구성이 되어있는 것을 볼 수 있습니다.

그래서 우리는 딕셔너리를 plist로 저장하고 불러오는 것을 해 보도록 하겠습니다 ㅎㅎ


일단 저장하는 메소드를 먼저 작성해 보도록 하지요.

아까 버튼에 연결해 둔 메소드가 있지요? saveStringToFile 메소드를 정성스레 작성해 줍니다 ㅎㅎㅎ 

inputTextField에 입력해준 텍스트를 딕셔너리에 넣어서 파일로 저장하는거예요 ㅎㅎ

주로 간단한 내용들을 저장해 줄 때 Document 디렉토리 안에 저장해 줍니다. 어플리케이션 옵션을 주고 적절한 처리를 하면 iTunes에서 도큐먼트 폴더로 파일을 넣고 빼고 할 수 있는 곳이기도 하죠.

이제 이렇게 주석과 글들로 설명이 되어있는데, 이해가 안가거나 조금 더 알고싶은 메소드가 있다면 개발문서를 한 번 찾아보는 센스! 필요하겠죠?ㅎ 



자, 그리고 이번에는 파일에서 딕셔너리를 불러와서 outputLabel에 텍스트를 세팅 해 주는 메소드 입니다.


자, 그리고 실행! 우선 저장하기 전에 로드해 볼까요? 역시나 파일이 없으니 실패!!


하지만 저장하고,


다시 로드하면 이렇게 라벨에 로드가 되는군요 ㅎㅎㅎ


또 다른 글로 바꿔서 저장해보고~


다시 로드해도 잘 되네용 ㅎㅎㅎ


앱을 종료했다가 다시 실행해서 로드도 해 보세요~ 아주 잘 됩니다 ㅎㅎㅎ

물론 앱을 삭제했다가 다시 실행하면 도큐먼트 폴더 내의 데이터도 지워졌기 때문에 로드가 되지 않습니다. 


오늘은 이렇게 간단히 도큐먼트 폴더에 plist파일을 저장하고 불러오는 놀이를 해 보았습니다 ㅋㅋ

어떠셨나요? 괜찮았나요?ㅎ

물론 바이너리 데이터(예를들어 이미지 등)을 읽고 쓸 수 있는 방법도 있는데, 요청하시면 진행하도록 할게요 ㅎ

이런 간단한 예제 외에도 더 크고 복잡한 데이터들을 저장하고 불러오는 방법도 존재합니다.

역시나 배우면 배울수록 어려워지는..ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

뭐 여튼 오늘은 여기까지~


by yagom

facebook : http://fb.yagom.net

twitter : http://twitter.yagom.net ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




Posted by yagom

댓글을 달아 주세요

  1. 으아~!! 2012.08.24 11:29  댓글주소  수정/삭제  댓글쓰기

    야곰님 위 내용과는 관계 없지만 질문이 있습니다~~!!!!
    연속된 이미지와 텍스트파일을 각각 uiview와 라벨에 쌍을 맞춰서 출력하고 싶습니다
    시간인터벌을 갖게 해서 출력하기 위해 nstimer를 사용하려고 하는데요. 구문을 어떻게 사용해야 할지 모르겠어요.ㅜㅜ
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(loadImageAndText) userInfo:nil repeats:YES];
    이렇게만 선언했구요. 셀렉터에서 쌍을 맞춰 출력하는 구문을 만들고 싶은데 각각 재생하는건 어렵지 않은데 쌍맞춰 하는건 .ㅜㅜ
    그리고 텍스트연속 출력은 어떻게 하나요? 이미지와 맞춰 무한 재생으로 만들었다가 버튼클릭하면 멈추게 만들고 싶은데
    구문을 어떻게 짜야하나 모르겠어요.아 빨리 알려주셨음 좋겠어요.ㅠㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.08.24 14:09 신고  댓글주소  수정/삭제

      안녕하세요 으아~!! 님 ㅋ

      음... 배열 두 개를 이용하여 자료를 저장해 두었다가 동시에 두 배열에서 같은 인덱스의 자료를 뽑아오면 되지 않을까요 ^^?

      사실 어떤 것을 원하시는지 잘 몰라서 애매하긴 하지만,

      일단 NSTimer *myTimer = [NSTimer scheduled ...

      해 주시고

      버튼을 누르면 [myTimer invalidate]; 해 주시면 멈출거예요~

  2. chosamong 2012.08.26 11:28  댓글주소  수정/삭제  댓글쓰기

    다음 버전 기대합니다. 초롱초롱
    바이너리 데이타 입출력,
    예외 처리
    파일 경로 변경 등등

    파일 입출력 넘 어려워요. ㅜ.ㅜ

    저도 낼 부터는 출근이라 폭풍 댓글 호응은 좀 더뎌질수도~
    하지만 열렬히 응원합니다.
    야곰님 파이팅 ^^;;

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.08.27 01:07 신고  댓글주소  수정/삭제

      초롱초롱 *_*ㅎㅎ
      이제 며칠 지나면 저도 한달간 덧글을 달수가 없네요 ㅎㅎㅎ
      열심히 하시는 chosamong님도 화이팅입니다 :)

  3. 컴맹 2012.09.16 05:12  댓글주소  수정/삭제  댓글쓰기

    드디어 데이타 저장/로드도 배웠습니다.ㅎㅎ
    오늘도 좋은 강좌 잘보고 갑니다.~
    감사합니다.^^

  4. 낭만떡대 2012.11.21 17:09  댓글주소  수정/삭제  댓글쓰기

    와우!!! 간단한 데이터 저장 방법이 이런 방법이 있었군요!
    간단한 저장은 기본으로 영구 저장되는 딕셔너리 하나 있잔아요.. ㅠㅠ 기억이 안나네
    userinfo 어쩌구 하는거.. 그걸로 했었는데 이렇게 파일로 내리는것도 간단하고 좋네요!
    좋은거 얻어 갑니다.
    (맨날 맥부기에서 강좌 보다가 이쪽으러 넘어옴 ㅋㅋ 여기가 크고 좋네요 ㅎㅎ)

    이미지 데이터를 저장하는 방법도... (제가 한번 해보겠습니다! ㅎㅎ;)
    뭔가 느낌상 그냥 data로 쓰고 data로 읽어 오면 될것 같은 *.* ㅋㅋ)

    추천 꾹~!

  5. 한소쿠리더하기 2013.02.02 00:50  댓글주소  수정/삭제  댓글쓰기

    파일주소에 덧붙일 때...

    /string.plist

    에서 / 는 있어도 되는 건가요?

    안되서 구글링을 하다가 writeToFile:atomically 로 보다보니 다른 예제에는 /가 없어서 빼고 하니까 되네요. ㅎㅎ

    다른 분들은 말씀이 없으신 걸로 봐서는 제가 뭔가를 잘못했다거나 다른 분들에게는 저정도는 너무 허접한 거라서 그냥 넘어가셨다던가...일까요? ㅎㅎ

    진짜 C 프로그래밍도 한개도 모르는 상태에서 시작해서 삽질하다가 야곰님 강의 보고 많이 알아가고 있습니다. 감사합니다. ^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.02.04 10:10 신고  댓글주소  수정/삭제

      stringByAppendingPathComponent:

      메소드를 사용하시면 /를 입력해도 하지 않아도 상관 없습니다 :)

    • 한소쿠리더하기 2013.02.04 11:21  댓글주소  수정/삭제

      stringByAppendingFormat을 썼는데 /를 쓰면 저장이 안되고 /를 안 써야 저장이 되네요;;;

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.02.05 07:56 신고  댓글주소  수정/삭제

      네, 제가 저 소스를 작성할 때 무슨생각으로 그랬는지는 모르겠지만;;
      파일 경로 등을 만들어 줄 때에는
      stringByAppendingFormat 보다는 stringByAppendingPathComponent을 사용하는 것이 바람직합니다... ^^;
      더 자세한 사항은 도큐먼트를 참고하세요~

    • wowjam 2013.07.17 15:40  댓글주소  수정/삭제

      너무 오래된 리플이지만... 한소쿠리더하기님이 말씀하신 문제의 원인을 알았습니다.
      NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
      이 부분에서 NSDocumentDirectory 대신에 NSDocumentationDirectory를 쓰셨던것 같네요.
      혹시 비슷한 문제 있으신 다른 분들도 참고하세요~

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.07.17 23:09 신고  댓글주소  수정/삭제

      정말 유익한 덧글 남겨주셔서 고맙습니다 :)

  6. Royster 2013.07.17 21:39  댓글주소  수정/삭제  댓글쓰기

    오늘도 정말 유익한 시간이었습니다^^

    이미지 및 텍스트를 이용하여 일기 작성 및 저장, 불러오기를
    구현하는 예제 강의 올려주실수 있으실까요~?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.07.17 23:10 신고  댓글주소  수정/삭제

      ㅎㅎ 좋은 예제네요~!
      그런데 제가 지금은 그럴 여력이 부족할 것 같습니다 ㅠ_ㅠ
      이 포스팅을 응용해 보시면 간단한 것은 할 수 있을 거예요..
      죄송합니다 ㅠ

  7. Royster 2013.07.18 01:06  댓글주소  수정/삭제  댓글쓰기

    아 아닙니다 죄송하실게 뭐있나요~ ㅎㅎ
    응용해서 제가 직접 시도해보겠습니다^^
    앞으로도 좋은 예제 많이 올려주세요 ~~~

  8. zeroBear 2013.09.21 14:31  댓글주소  수정/삭제  댓글쓰기

    안녕하세요,
    항상 강좌 잘 보고 있습니다.
    이번 강좌에서 키보드 입력이 나왔는데요, 아무래도 키보드가 내려 가질 않아서 뭔가 아쉽더라구요.
    혼자 찾아 찾아 해결은 했는데, first responder의 개념이 잘 이해가 되지 않습니다.
    나중에 first responder에 대한 강좌를 써 주실 수 있으신가요?

    아마 이 블로그에서 강좌를 보는 다른 분들도 도움이 될 것 같아요 ^____^

  9. 루드릭 2013.11.12 00:29  댓글주소  수정/삭제  댓글쓰기

    강좌 잘 보고 있습니다. ㅎㅎ

    맥부기 까페에서 검색시에도 이상하게 야곰님이랑 겹치는 강좌들이 있길래

    누가 떼다 올리시는건가 했는데 작성자 아이디가 야곰... ㅋㅋ

    직접 올리시는거였군요. ㅎ

    다름이 아니라 질문이 하나 있는데요

    textfield에 글을 적다가 다른 뷰로 넘어갔다가 다시 와도

    아까 적어놓은 텍스트들이 남아있게 하고 싶은데

    키보드를 내리면서 어딘가에 저장을 해 두고 다른 뷰 갔다가 돌아올때

    textfield에 다시 저장을 해야될것같은데 키보드를 내릴때 어떤 메소드가 실행되게 하려니까 방법을 잘 모르겠네요 ;

    키보드를 내리는 방법은 키패드 안의 리턴버튼을 누르거나 백그라운드를 터치하면 내려가도록 해 놓았습니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.11.12 11:47 신고  댓글주소  수정/삭제

      이전에 보았던 화면을 새로 생성해서 돌아오면 당연히 새로운 객체이기 때문에 남아있지 않습니다.

      이전의 화면으로 돌아올 때에는 모달로 띄워줬다면 모달을 내려주어야 하고, 네비게이션 컨트롤러로 push 하셨다면 다시 pop해서 돌아오셔야 합니다. 그러면 다시 이전의 화면 그대로를 볼 수 있습니다.

      아마도 새로운 객체를 생성하여 다시 화면에 보여주는 방식을 사용하고 계시기 때문에 이전 화면 그대로를 보지 못하시는 것 같습니다.

      모달뷰와 네비게이션 컨트롤을 조금 더 살펴보시기 바랍니다 :)

  10. odong 2015.07.26 22:02  댓글주소  수정/삭제  댓글쓰기

    애플이 개발환경이 좋아 혼자 쓸 어플 만들려는데 좋은 참고가 되네요 감사합니다!
    (댓글이 무지 늦게(?) 달린 셈인데 야곰님 보실려나요? ㅋㅋ)

    • Favicon of https://blog.yagom.net BlogIcon yagom 2015.07.28 01:10 신고  댓글주소  수정/삭제

      안녕하세요 odong님!
      덧글 남겨주셔서 고맙습니다 :)
      좋은 참고가 되었다니 기쁩니다!
      종종 들러주고 글도 남겨주세요~!
      고맙습니다~! :D

  11. hjs9402 2017.02.08 13:13  댓글주소  수정/삭제  댓글쓰기

    안녕하세용 그런데 plist로 작성한 파일들은 앱을 종료했을때 다 삭제가 되나요?

  12. sususoo 2017.05.09 23:57  댓글주소  수정/삭제  댓글쓰기

    야곰님 정말 궁금한게 있습니다. 다운받은 ipa파일을 zip파일로 변환한후 압축을 풀어서 안에있는 plist파일이나 coderesources를 조금 수정해서 다시 압축해서 ifunbox를 이용해서 폰에 설치할 수 없나요?

    ipa파일을 zip파일로 변환한후 압축을 푼 아이들을 다시 압축해서 ifunbox를 이용해서 폰에 설치하기는 가능한데, payload폴더 안에있는 아이들을 조금이라도 건들면 설치가 되지 않습니다. 방법이 없는건가요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2017.05.10 12:06 신고  댓글주소  수정/삭제

      안녕하세요 sususoo님, 전혀 방법이 없는 것은 아니지만, 정상적이거나 좋은 방법은 아니기 때문에 따로 알려드리지는 않겠습니다 ^^; 도움을 드리지 못해 죄송합니다


오늘의 주제

1. 네비게이션 바 커스터마이징


마흔 다섯번째 시간입니다.^^

지난 번에는 메소드 재정의(오버라이드)를 활용하여 UIAlertView를 커스터마이징 해 보았습니다~
어떠셨어요?ㅎ 이쁜 이미지로 커스터마이징 하니까 좀 더 산뜻해 지셨나요?ㅎ

오늘은 네비게이션 바를 커스터마이징 해 보겠습니다~

잘 응용하면 원하는 이미지나 이쁜 글도 넣을 수 있구요 :)

자 그럼 출발해 볼까요?ㅎ


# Navigation Bar Customize

자, 일단 새로운 프로젝트를 만들어 줍니다.

Single View Application이구요~


YagomCustomNaviBar라는 이름으로 만들어 주었습니다 ㅎ


그리고 우리는 커스터마이징을 할 때 이번에는 카테고리 라는 녀석을 이용할거예요~
어쨌든 일단 New File... 


Cocoa Touch - Objective-C category 라는 녀석을 선택~!


YGCustomNaviBar라고 이름짓고 Category on UINavigationBar를 작성해 줍니다~


그러면 UINavigationBar+YGCustomNaviBar 라는 희안한 이름을 가진 놈들이 뿅하고 튀어나옵니다~

카테고리로 사용하려면 클래스이름+내가 지정한 이름. 이딴식이지요?

오이잉???????? 고놈 요상하네~~~~~~

자, 그럼 여기서 카테고리란???????????

다른 언어에서는 쉽게 찾아볼 수 없는 형태로 Objective-C의 독특한 클래스 확장법이라고 생각하시면 되겠습니다.

지난번에 해보았던 오버라이드(재정의)보다는 약간 작은 개념입니다.

클래스를 상속받아 메소드를 오버라이드 하는 경우 원래 있던 메소드를 수정, 보완해 주는 형태였고, 인스턴스 변수 등등을 추가해 줄 수 있습니다.

하지만, 이 카테고리라는 녀석은 원래 클래스에다가 내가 원하는 메소드를 원래 그 클래스에서 갖고있던 녀석인 것처럼 추가해 줄 수 있는 간단하지만 강력하고 유용한 녀석입니다. 물론 메소드 오버라이드도 가능합니다. 다만, 클래스 변수 등은 선언해 줄 수 없습니다.

카테고리만 잘 이용해도 쓰임새는 무궁무진하죠 ㅎㅎㅎ

오늘은 네비게이션 바 커스터마이징으로 한 번 예를 들어 진행해 보고자 이렇게 포스팅을 하는 것입니다.

설명이 부족하다 싶으면 책이나 구글링을 통하여 찾아보셔도 좋습니다.

자, 그럼 이제 카테고리는 만들었고... 일단 네비게이션바를 보려면 네비게이션 컨트롤러가 좀 도와줘야겠죠?ㅎㅎ

AppDelegate에서 최상위 뷰 컨트롤러를 네비게이션 컨트롤러로 만들어 봅시다.
 


자, 한 번 실행해 보니 제대로 잘 된 것 같네요 ㅎㅎㅎ


그럼 이제 뷰 컨트롤러에 Push기능을 해 줄 버튼 하나를 만듭니다.

아직도 이 그림이 이해안가시는 분은 없으리라 믿습니다~!

오른쪽 버튼 드래그 또는 ctrl+드래그 아시죠?ㅎㅎㅎ 


그럼 이렇게 이쁘게 연결이 되겠죠???



자, 깔쌈하게 연결 해 줬으니 이제는 구현파일로 넘어와서 해야 할 일들을 말해줘야겠죠 ㅎㅎㅎ


그리고 실행하면 이렇게 이쁘게 버튼이 박혀있구요~



버튼을 누르면 이렇게 다음 화면으로도 넘어오네용 ㅎㅎㅎ


자, 우리가 구현하고자 하는 내용이 무엇이냐???

네비게이션 바 생김새를 커스터마이징 하는 것이지요~

특히나 저는 배경과 제목을 커스터마이징 하고 싶어요.

UINavigationBar 클래스 문서를 봅니다.

제목을 커스터마이징 할 꺼리는 안보이고...

그나마 배경이미지 설정해 주는 메소드가 있는것 같군요~


따라가 봅니다.

앗!!! 그런데 이게 왠 난관입니까??

iOS 5.0 부터 지원하는 메소드라고 합니다...

iOS 5.0 미만 사용자들은 어떡하지... 흠...  


자, 어쨌든 저쨌든간 방법은 있겠죠?ㅎㅎㅎ

버전을 체크해서 가능한 녀석들로 처리를 해 봅시다.

버전 체크하는 방법에 대한 자세한 내용은

2012/08/17 - [iOS Dev/깨알 Tips] - iOS Version Check

를 참고하시면 됩니다~

iOS 5.0 미만 같은 경우는 drawRect메소드를 오버라이드 하여 배경이미지를 그려줄 수 있습니다. 

물론 iOS 5.0이상이라면 좀 더 편안하고 안정적으로 구현되어있는 메소드를 이용해 주면 되겠죠?ㅎ

이렇게 카테고리 메소드를 완성해 줍니다. 물론 배경에 사용될 이미지도 잘 첨부 해 줍니다.ㅎ 


제가 사용한 이미지 올려놓을게요~



그리고 전에도 그랬다시피, 나 이런 메소드 가지고 있어~

오퐈 이런 능력자야~ 라고 말해주려면 헤더에 잘난척 해줘야겠죠?ㅎㅎㅎ


그리고 이제 이 카테고리 메소드를 사용하고 싶으면 헤더를 import해 주시고, 그냥 원래 클래스에 있던 메소드마냥 사용해 주시면 됩니다. ㅎㅎ


자, 이제 실행해 보면??? 예상했던 결과처럼 나오나요?ㅎㅎ


화면을 넘기면 이렇게 나오구요 ㅎㅎ


그런데 화면을 옮겨가도 위의 제목은 항상 그대로지요? 그래서 우리가 만들어 놓은 메소드를 통해 제목도 좀 바꿔줍니다. ㅎㅎㅎ

화면이 보이려고 할 때(viewWillAppear) 에서 해당 메소드를 사용해 주면 될 것 같군요 ㅎㅎ 

그리고 push해 준 후에 제목을 바꿔줘도 적용이 될 것 같은데요?ㅎㅎ 


짜잔~ 일단 첫번 째 화면에는 잘 세팅이 되었네요~


그리고 화면을 넘겼다가~~~~~~~~


다시 돌아와도 우리가 원한대로 잘 되어있죠?ㅎㅎㅎ



자, 오늘은 네비게이션 바 커스터마이징이라는 명목으로 카테고리 라는 녀석을 함께 해보았습니다.

어떠셨어요?

유용할 것 같지 않나요?ㅎ

물론 어떤 클래스라도 카테고리를 만들어 줄 수 있습니다.

자신이 자주 사용하는 기능이 조금 복잡하거나 매 번 프로젝트를 만들 때마다 구현해주기 귀찮다면 카테고리를 이용하는 것이 효율적일 것입니다.

자, 오늘도 즐거운 공부가 되셨길 바라면서

저는 이만 물러갑니다~

또봐용 ㅎㅎ


by yagom

facebook : http://fb.yagom.net

twitter : http://twitter.yagom.net ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




Posted by yagom

댓글을 달아 주세요

  1. 인절미후후 2012.08.21 11:25  댓글주소  수정/삭제  댓글쓰기

    헤에~ 네비게이션바 하시는군요~
    제가 예전에 앱스토어에 올린 어플이 네비게이션 바를 커스텀 해보려고 무지 노력했었는데
    소스로 만들어지는거랑 닙에서 올린거랑 겹쳐져서 고생했었죠..(백버튼은 소스로 보내기전에 만들어야 하고 닙으로 만든거는 또 새로 생겨버리고..백버튼모양은 안만들어지고..)
    관련 내용이 등장하니 반갑네요.
    앞으로도 좋은 강좌 부탁드리겠습니다!

  2. 컴맹 2012.09.16 04:51  댓글주소  수정/삭제  댓글쓰기

    카테고리 정말 좋네요.ㅎㅎ
    좋은 강좌 잘보고 갑니다~ 감사합니다~^^

  3. 눈팅X 2012.12.03 18:16  댓글주소  수정/삭제  댓글쓰기

    야곰님 강좌 몰래 눈팅하고 있는 1인입니다.

    [naviCon.navigationBar customizeWithTitle:@"Customized"];

    추가하고 실행했을 때, 타이틀이 안보이는데.. 혹시 살펴 볼 부분이 있을까요??
    강좌 내용을 살펴봐도.. 잘 모르겠어서..

    잠수중인데, 살짝 올라왔습니다.

    ----------------------------------------------------------------------------------------------

    자세히 좀 볼 걸 그랬어요. 찬찬히 다시 보니.. 아래 코드가 누락.. ㅎㅎ
    [self addSubview:titleLabel];

    야곰님!!
    오늘도 많이 배워 갑니다~ 항상 감사드려요~


  4. paxdreamer 2012.12.26 13:51  댓글주소  수정/삭제  댓글쓰기

    야곰님 안녕하세요. 오랜만에 인사드립니다.ㅎ
    네비게이션 커스터마이징에대해 이것저것 알아보고 있는 중인데요. 네비게이션 바를 슬라이딩하게 하는건 어떤식으로 적용해야 하나요??
    예를 들어서 상하스크롤할때 보였다 안보였다 하는 방식을 적용하고 싶어서요.
    화면 넓게 쓰고 싶어서 그렇게 만들고 텍스트도 따로 입력하게 하고 싶은데 어떻게 해야할지 모르겠네요.ㅋㅋ
    계속해서 좋은 내용 연재해 주셔서 감사합니다.ㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.12.26 14:37 신고  댓글주소  수정/삭제

      안녕하세요:) 오랜만에 뵙습니다.

      UIScrollViewDelegate를 보시면 아마도 스크롤바를 올리고 내릴 때 작동하는 메소드가 있을거예요.

      거기에다가 네비게이션 바를 보였다 숨겼다 하는 메소드를 추가하면 될 거 같은데요 :)

      [naviCon setNavigationBarHidden:YES animated:YES];

      아마 이런 메소드 있을거예요~

  5. Favicon of http://silver-lining.tistory.com/ BlogIcon silver0r 2012.12.26 20:33  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 매번 눈팅으로만 열심히 배우다가 질문드립니다.

    실 프로젝트에서 커스텀네비게이션바를 사용하려하는데 첫화면 등 일부 화면에서 제외하고 나머지 화면에서는 커스텀 네비게이션 바를 보여주려하는데 이경우엔 어떻게 해야될까요??
    매번 책보다 훨씬 더 간단하고 쉽게 연재해주셔서 감사히 잘 보고있습니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.12.26 21:54 신고  댓글주소  수정/삭제

      음... 그 경우에는 좀 애매하네요...+_+

      하나의 네비게이션 컨트롤러는 하나의 네비게이션 바만 가질 수 있으니...

      흐음... 꼼수는 여러가지 있을 수 있으나... 그다지 추천해 드리고 싶지는 않아요 ㅠ

  6. Eastsky_Kagn 2013.01.24 16:40  댓글주소  수정/삭제  댓글쓰기

    정말 큰 힘이 되는 포스트 입니다. 감사합니다~ 늘 수고 많으세요.

  7. 21c 2013.02.03 00:03  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 yagom님ㅎㅎㅎ 프로그래밍 공부하는 고등학생이에요....
    저같이 컴퓨터학원다닐 여유없는 학생에게 큰 힘이 되십니다ㅠㅠㅠㅠ
    제일 은인같이 생각하고 있어요....너무 감사합니다ㅎㅎ!! 앞으로도 좋은 글 많이 올려주시구 항상 응원하겠습니다!

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.02.04 10:12 신고  댓글주소  수정/삭제

      하하... 저보다 훨씬 양질의 컨텐츠를 포스팅 하는 분들이 많습니다.

      더 좋은 자료 찾아보시길...^^

      그래도 이런 응원은 저에게 정말 큰 보람과 힘이 되네요 :) 정말 고맙습니다 ^^

  8. silver0r 2013.09.23 12:48  댓글주소  수정/삭제  댓글쓰기

    야곰님 예쩐에 이거 보고 잘 따라했는데
    ios7나오고나서 이 커스텀네비에 left right 버튼 올렷을 때 버튼이 보이질 않습니다
    (동작은 해요)
    이유가 뭘까요....

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.09.23 13:45 신고  댓글주소  수정/삭제

      iOS 7에서 tintColor 부분에 변경이 있었고, 버튼이 테두리가 사라졌습니다.
      혹여 버튼에 제목을 정해주지 않으셨다면 한 번 넣어보시고,

      http://goo.gl/czcsej

      참고하여 보시기 바랍니다

  9. silver0r 2013.09.24 10:04  댓글주소  수정/삭제  댓글쓰기

    감사합니다
    저도 어제 찾아보니까 tintColor 를 안해주면 안보이는걸 확인했네요 ㅎㅎ;
    버튼의 테두리는 bg이미지로 넣어서 해야겠네요 감사합니다 ^^


오늘의 Tip

1. iOS Version Check


# iOS 버전체크하기

가끔 우리는 특정 버전에서 사용할 수 없는 메소드들을 만나게 됩니다.

그럼 지원하지 않는 버전의 기기에서 그 메소드를 호출하면 펑~ 하고 어플리케이션이 죽어버리는 사태가 발생하죠.

그래서 개발문서를 잘 보고 메소드를 사용하여야 합니다.

나도 모르는사이에 펑하고 어플리케이션이 죽어버릴 수 있으니까요 ㅎㅎㅎ

자, 그럼 버전체크하기~

주석에 달려있듯이 아래  메소드를 사용하여 내가 적어준 버전과 같은지, 그보다 아래인지 위에인지 판단 할 수 있습니다.


자주 필요하다면 아래처럼 App-Prefix.pch 내에 매크로로 정의하여 사용하여도 편리합니다~
 


 



by yagom

facebook : http://fb.yagom.net

twitter : http://twitter.yagom.net ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 


Posted by yagom

댓글을 달아 주세요

  1. 낭만떡대 2012.11.22 09:42  댓글주소  수정/삭제  댓글쓰기

    어머 이 좋은 Tip에 댓글 이 하나도 없네 ㅋ

    감사 드립니다.~


오늘의 주제

1. iOS 어플리케이션의 생명주기
2. ViewController의 생명주기 



마흔 세번째 시간입니다.^^

요 며칠 제 개인적으로 좀 힘든일도 있고, 빡빡한 프로젝트 일정 때문에 제대로 포스팅을 하지 못했습니다.

흙흙 아직 프로젝트가 마무리 되지는 않았지만 최대한 짬을 내 보도록 하겠습니다..ㅎ

우리 이제까지 정말 쭉쭉 달려왔습니다.

이것저것 해 보면서 많은 것을 맛 봐왔죠...ㅎ
물론 이것 저것 많이 해 보는 것도, 맛을 보고 언제 어디서 어떻게 써야할지 감을 익히는 것도 중요합니다.

그러나 더더욱 중요한 것은 통괄적인 흐름이고 기초죠.

초반에 포스팅 할 때 말씀드렸듯이 아주 기초적인 사항들은 많이 스킵하고 넘어왔습니다.

이번에는 그래서 정말 기초 하나를 같이 알아보고자 합니다.

물론 초보자 님께서 포스팅을 해 달라고 부탁하신 내용이기도 합니다 :-) 고맙습니다 ㅎ

자, 그럼 이제 같이 해 볼까요?

스따뚜~~~~~~~~~~~~


# 실습해보기

ㅎㅎ 초심으로 돌아가서 프로젝트 생성부터 따라 가 봅시다.
빈 프로젝트를 생성합니다.


이름은 ViewLifeCycle.
코어 데이터도 사용하지 않을 것이고, ARC도 사용하지 않을 것이며, Unit Test도 포함하지 않을 것입니다.
ARC를 사용하지 않는 이유는, 우리가 원할 때 메모리 관리를 함으로써 더 명확히 흐름을 보여드리기 위함입니다.


자, 프로젝트를 생성했으면 ViewLifeCycle 폴더에서 오른쪽 버튼을 클릭.
New File...


Objective-C class를 선택하고 Next


TestViewController로 이름짓고 XIB생성에 체크합니다~


TestViewController가 생성되었으면 RootViewController도 만들어 주세요 :-)


자, 그리고 RootViewController.xib로 와서 Assistance 모드로 변경하면 이렇게 나오겠죠?
무슨 말인지 모르시는 분들은 
2012/04/03 - [iOS Dev/깨알 Tips] - Xcode4 xib의 객체 소스파일과 쉽게 연결하기

를 참고해 주시면 됩니다 ㅎ
자, 여튼 xib파일을 클릭하고, RootViewController.h를 option+클릭하면 이런 화면이 나오겠죠.
xib파일에 버튼 세 개 가지런히 올려주시고, 저렇게 연결 해 줍니다.


나머지 두 버튼들도 이쁘게 연결 해 주시구요~^^


연결 해 주었으니 무엇을 할지 작성해 주어야겠죠?ㅎ
RootViewController.m 파일로 이동합니다.
이렇게 이쁘게 작성을 해 주세요.ㅎ 
#import 부터 저 쪼 아래까지 쭈욱 다 보셔야 해요 ㅎ


자, 그리고 AppDelegate로 옵니다.
이렇게 이쁘게 네비게이션 컨트롤러를 하나 만들어 주시구요 ㅎ


구현파일로 들어와서 이렇게 또 이쁘게 코딩을 합니다 ㅎ


자, 이제 TestViewController도 RootViewController에서 했던 것과 마찬가지로 쭉쭉 연결해 줍니다 ㅎ


그리고 구현파일로 와서 이렇게 작성을 해 주세요 ㅎ
__PRETTY_FUNCTION__은 나중에 어떤녀석인지 알 수 있으실 거예요 ㅎ
앞에 언더바(_) 두개, 가운데 한 개, 뒤에 두 개 이렇습니다. ㅎ


자, 그리고 RootViewController 구현파일에도 와서 필요한 부분에 그녀석을 찍어 줍니다.


AppDelegate에도 마찬가지구요 ^^*


자! 그리고 실행해 봅시다~!
처음 로그는 어플리케이션을 실행시킨 후 네비게이션 push버튼을 누르고 다시 pop버튼을 누른 후에 나타난 로그입니다.


두 번째 로그는 어플리케이션을 실행시킨 후 모달뷰를 띄웠다가 다시 닫은 후에 나타난 로그입니다.


세 번째 로그는 어플리케이션을 실행시킨 후 addSubview와 removeSubview를 한 후의 로그입니다.


네 번째 로그는 어플리케이션 실행 후 홈버튼을 눌러서 백그라운드로 보낸 후 다시 어플리케이션을 띄운 후 다시 홈버튼을 누른 후에 생긴 로그입니다.


어떤가요? 여러분의 로그와 일치하나요?ㅎ

로그에 찍힌 것은,  -[해당 클래스명 메소드명] 이런식으로 남게 됩니다.

한 번 차근차근 로그를 따라서 추적해 보세요 ~^^*


# iOS Application Life Cycle

자, 그럼 실습을 해 보았으니 본격적으로 알아봅시다.

어플리케이션의 생명주기를 설명하는 그림으로 유명한 녀석입니다.ㅎ


1. 사용자가 어플리케이션을 탭합니다.
2. main() 함수가 호출됩니다.
3. UIApplicationMain()이 호출됩니다.
4. applicationDidFinishLaunching이 호풀됩니다. (AppDelegate)
5. 여러분이 설계하고 작성한 어플리케이션의 코드가 동작합니다.
6. 어플리케이션 종료를 명령하면 applicationWillTerminate가 호출됩니다. (AppDelegate)
7. 어플리케이션이 종료됩니다.

자, 어떤가요? 감이오시나요?ㅎㅎㅎ

main은 뭐고 UIApplicationMain 은 또 뭐고...???

ㅎㅎ

모든 C언어 기반의 프로그램은 main함수에서 출발을 하게됩니다.

Objective-C로 엄연히 아랫단은 C언어 기반이므로 main함수로부터 출발을 하게되는 것입니다.

사실상 형식적이라고 볼 수 있습니다.

우리가 신경써야 할 부분은 AppDelegate의 applicationDidFinishLaunching 부터라고 생각하시면 됩니다.

로그에 applicationDidFinishLaunching이 가장 먼저 찍힌 것을 확인하셨나요?ㅎ 맞지요?ㅎ

그리고 로그에서는 확인 할 수 있을지 모르겠지만 applicationWillTerminate에서 우리가 할 수 있는 모든 것은 끝이나게 됩니다.

한 마디로 어플리케이션의 생명주기는 우리가 AppDelegate에서 확인하고 관리할 수 있습니다.

그렇다면 ViewController들의 생명주기는...???


# iOS View Life Cycle
 
자, 어플리케이션 전체의 생명주기를 알아보았으니, 작게는 ViewController들의 생명주기에 대해 알아봅니다.

로그에 보면 ViewController의 로그 중에 가장 먼저 찍히는 녀석은 init(initWith....... 포함)입니다.

초기화 해 주는 녀석이 당연히 가장 먼저 호출이 되겠죠.

그 후에 바로 불리게 되는 녀석이 viewDidLoad입니다.

자동으로 생성되는 주석에 보면 이녀석에서 처음 부가적인 세팅을 하라고 써있죠.

눈치채신 분들도 계시겠지만 제가 아까 위에서 ViewController에 작성한 View Life Cycle의 메소드들은 순서대로 호출됩니다.

너무나 당연하게 

viewDidLoad
viewWillAppear:
viewDidAppear:
viewWillDisappear:
viewDidDisappear:
viewDidUnload

의 순서로 호출이 되게 됩니다.
그래서 viewDidUnload에서는 객체들을 놓아주는 곳으로 사용하라고 주석으로 설명이 되어있죠.

각각 호출되는 타이밍은 말씀드리지 않아도 아실 수 있을거라고 생각합니다...^^

영어 그대로 해석해 보세요..ㅎ

alloc, init, dealloc은 모든 객체에 공통적으로 해당되는 내용이므로 위에 나열하지는 않았습니다.

alloc - 메모리에 적재되는 시점
init - 객체가 초기화 되는 시점
dealloc - 객체가 메모리에서 해제되는 시점

dealloc은 실질적으로 해당 객체가 메모리에서 해제되는 시점(retainCount가 0이 되는 시점)에 호출되게 됩니다. 말그대로 alloc과 딱 반대개념이죠~


자, 이렇게 간략하게나마 어플리케이션과 뷰컨트롤러, 그리고 일반적인 객체의 생명주기에 대해 알아보았습니다.

제 설명이 어떻게 다가갔을지, 또 어떻게 느껴지셨을지 잘 모르겠지만, 궁금하거나 해결되지 않는 내용이 있었다면 꼭 말씀 부탁드립니다 :-)

사실 이 부분이 제가 초반에 제대로 개념을 잡아놓지 않아서 항상 혼돈을 겪었던 부분중에 하나기 때문에 필시 여러분께 도움이 될 것이라고 생각합니다.

그럼 이만...~!

p.s 오늘은 6월 25일 6.25전쟁 62주년입니다.
우리나라의 평화와 안위를 위하여 목숨바친 순국선열께 감사하는 마음을 가지는 우리가 되었으면 좋겠습니다.


by yagom

facebook : http://fb.yagom.net

twitter : http://twitter.yagom.net ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




Posted by yagom

댓글을 달아 주세요

  1. 초보자 2012.06.27 12:34  댓글주소  수정/삭제  댓글쓰기

    앗 강의 정말 잘봤습니다~^^ 많은 도움이 됐네요~ 계속 좋은 강의 부탁드려요~ㅋ

  2. 도레미 2012.06.28 15:06  댓글주소  수정/삭제  댓글쓰기

    강의 정말 잘보고 있습니다.
    나중에 스토리보드 쪽도 부탁드려요~^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.28 15:40 신고  댓글주소  수정/삭제

      안녕하세요 도레미님 :-)
      좋은 의견 고맙습니다..^^ 차차 준비해 보도록 하겠습니다.
      자주자주 놀러오세요 ㅎ

  3. Favicon of http://blog.naver.com/gamakun BlogIcon 까마쿤 2012.07.20 09:40  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 초보개발자 까마쿤입니다 :)
    블로그를 찾은지 얼마 되지않았지만 친절하신 설명에 감동하면서
    제가 필요한부분들을 쏙쏙찾은것 같아요 :-)
    마음같아선 1강부터 댓글을 달아드리고싶지만... 프로젝트 마감이 얼마 남지않아서..
    정말 감사합니다! 다음번에 시간되시면. 달력같은거 커스터마이징도 알려주시면 감사할거같아요 ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.07.20 12:43 신고  댓글주소  수정/삭제

      안녕하세요 까마쿤님~!
      찾아주셔서 정말 고맙습니다 :)
      도움이 되었다니 저도 정말 기쁩니다 ㅎ
      말씀해 주신 내용은 기회가 된다면 진행해 보도록 하겠습니다.
      많이 덥네요 ㅎ
      더위조심하시고 종종 들러주세요 ^^*

  4. Sio 2012.07.25 14:19  댓글주소  수정/삭제  댓글쓰기

    기본적인 건데 너무 건성으로 지나갔던것 같네요 ㅎㅎㅎ
    다시한번 정리되서 보게되서 많이 도움이 되었습니다~!
    잘보고갑니다~!!!!!

  5. 나에게넌 2012.08.14 16:06  댓글주소  수정/삭제  댓글쓰기

    주옥같은 강의..이제 2강 남았네요..어여 프로젝트 끝내시고 계속 올려주세요 ㅎ

    아직 우린 배울게 너무 많자나요 ㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.08.14 16:51 신고  댓글주소  수정/삭제

      ㅎㅎ 매일 불같은 덧글 정말 고맙습니다~

      다시 복습하다 보면 또 새로울거라 믿습니다...ㅎㅎ

      필요하신 내용 있으면 말씀해 주세요~ :)

  6. 컴맹 2012.09.15 03:36  댓글주소  수정/삭제  댓글쓰기

    제목 그대로 라이프 사이클을 잘 설명해주셨네요.
    좋은 강의 감사합니다. ~~~ ^^

  7. Chris Jeong 2013.08.19 11:13  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다 ^^
    하나 궁금한 점은 각각의 단계(viewDidLoad, viewWillAppear 등)에서 개발자가 작성해줘야 하는 코드들이 분명 차이가 있을것 같은데 감이 잘 안오네요.
    안드로이드의 경우 onCreate에서는 생성시 1회만 초기화해 줘야 하는 부분들, onPause와 onResume에서는 리스너들의 등록, 해제를 하는데 ios에서는 어떤게 있는지 궁금하네요.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.08.19 13:29 신고  댓글주소  수정/삭제

      http://goo.gl/OL30zY
      http://blog.yagom.net/302
      참고해 보셔요..^^
      loadView - viewDidLoad - viewWillAppear - viewDidAppear 등이 있는데,
      최초 한 번 실행되는 것은 대부분 viewDidLoad에 채워줍니다 :)
      viewWillAppear, viewDidAppear 등은 상황에 따라 다시 실행 될 수 있습니다.

  8. 승군 2014.01.29 11:17  댓글주소  수정/삭제  댓글쓰기

    좋은 강좌 잘 보고 있습니다

    감사합니다~~!!!

  9. 멋있으십니다 2015.03.27 18:30  댓글주소  수정/삭제  댓글쓰기

    야곰님 글은 진짜 하나하나 전부다 좋은정보네요 감사합니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2015.03.28 17:39 신고  댓글주소  수정/삭제

      고맙습니다..^^;

      글이 오래되어 조금 다르거나 틀린 정보도 있으니 최신 정보를 찾아보시는 것도 좋을 것 같습니다.

      종종 들러주세요 :)

  10. 요청하나!! 2015.04.06 10:13  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님 항상 좋은정보 알려주셔서 감사합니다.
    다름이 아니라 이번에 iOS objective c 를 이용하여 트위터 로그인하는것을 실습중에있습니다.
    혹시 실례가안된다면 objective c 를 이용한 IOS-Twitter로그인 연동과 그 로그인 한 사용자의 대한 id 와 이메일같은 정보를 로그로 띄울수있는 실습 한번 부탁드려도되겠습니까??

    이메일은 필수요소로 좀 부탁드리겠습니다..!

    • Favicon of https://blog.yagom.net BlogIcon yagom 2015.04.06 13:37 신고  댓글주소  수정/삭제

      안녕하세요, 답변이 늦어졌습니다 ^^;

      제가 요즘 정신이 없어서 늦어졌어요.

      트위터 로그인과 관련된 내용은 트위터 개발자 페이지가 가장 정확하고 최신정보를 가지고 있지 않나 생각합니다 :)

      영어가 큰 문제가 되지 않는다면 https://dev.twitter.com/twitter-kit/ios/twitter-login 페이지를 참고해 보시는게 어떨까 합니다.

      yagomsoft@gmail.com

  11. 요청하나!! 2015.04.07 18:13  댓글주소  수정/삭제  댓글쓰기

    감사드립니다. 바쁘신데 고생하십니다!

    • Favicon of https://blog.yagom.net BlogIcon yagom 2015.04.07 22:01 신고  댓글주소  수정/삭제

      큰 도움을 드리지 못해 죄송합니다.

      하다가 막히거나 궁금한 사항, 필요한 사항 생기시면 언제든 또 연락주세요.

      종종 들러주세요 :)

개발하다가 소스코드가 길어지고 지저분해 지다보면 어떤 메소드가 어디에 있는지 찾아가기 굉장히 불편해지고 가독성이 떨어지게 됩니다.

그래서 소스코드를 약간 이쁘게 정리해 둘 필요가 있습니다.

습관을 들여놓으면 아주 좋아요 ㅎ

#pragma mark 

요녀석을 사용하면 좋은데요~

한 번 보여드릴게요~

코드 오른쪽 상단에 보면 바로갈 수 있는 네비게이터가 있는데요 한 번 클릭해 보시면 구현되어있는 변수들과 메소드들이 쭈욱 나열될 거예요.
그런데 영역별로 마크를 남겨주면 알아서 보기 좋게 정리해 줍니다~


이렇게 이쁘게 깔끔하게 말이죵~ㅎㅎ


정리 되어있지 않았을 때입니다.
소스코드 정말 얼마 되지도 않는 컨트롤러인데도 자신이 원하는 메소드 한 번에 찾아가기 거의 불가능 하다고 봐야겠죠^^;



요로코롬 유용한 녀석이 있으니, 꼭 습관처럼 작성하면 좋습니다 ㅎ


by yagom

twitter : @yagomsoft

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 



Posted by yagom

댓글을 달아 주세요

  1. berry 2012.06.17 16:26  댓글주소  수정/삭제  댓글쓰기

    오랜만에 들렀습니다!!
    사실 ... 제가 하고있는일을 검색하다가
    여기군하고 링크를 눌렀는데
    야곰님 블로그였네요 ㅎㅎ
    시간이 빨리 나아져서
    야곰님껄 보면서 스터디를 하고 싶은데
    아직 시간이 빠듯해서 그렇게 하질 못하고있군요 !!!
    다른거보다가 이것도 유용한거같아서 한번 읽고 갑니다 ㅎ

  2. 나에게넌 2012.08.13 15:56  댓글주소  수정/삭제  댓글쓰기

    간만에 쉬운 내용이라 쭈욱 훓어보고 지나갑니다..

  3. Favicon of http://blog.naver.com/rbfwmqwntm BlogIcon C. 탄소 2012.10.08 20:28  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다. 도대체 뭐하는건가 싶어 찾아봤는데 참 편하게 정리해주네요ㅎㅎ
    (이전까지는 메서드 별로 주석 달아서 관리하고 있었습니다...
    클래스 메서드는 // Class Methods 같이... ㅎㅎ)


오늘의 주제

1. UIWebView
2. UIWebViewDelegate 



스물 여덟번째 시간입니다.^^

지난 번에는 웹뷰를 만들고 화면에 웹페이지를 띄워 만들어 보았습니다.

자 그럼 오늘은 웹뷰와 함께 이것저것 해 보아야 겠지요?ㅎ

긴 말 없이 시작해 봅니다 ㅎㅎ

p.s. 추천 한 방 어떠세요?ㅎ



# UIWebView - delegate

웹뷰를 화면에까지 띄워보았으니 이제는 앞으로 가기 뒤로가기 등,... 버튼 동작들을 구현해 봅니다.
자, 일단은 지난번에 버튼들에 태그를 달아 두었던 것 기억하시죠?
그 태그를 보다 직관적으로 표현해 보기 위하여 #define과 enum을 사용하여 구현해 보았습니다.
#define과 enum은 뭐냐구요?
아... 음... C에서 나오는 녀석들인데,

제가 C 카테고리에서 포스팅 한 줄 알고 있었는데, 아직 포스팅을 안했네요 ㅠ_ㅠ
iOS에 너무 열중을 하다보니;;ㅎㅎ

C 카테고리에서 포스팅 했습니다..ㅎ
한 번 읽어보세요..^^
2012/05/14 - [C] - C <15>. 전처리자
2012/05/24 - [C] - C <20>. enum

그냥 말 그대로 define (정의) 해 주는 전처리자 입니다.
전처리자는 뭐냐구요?
말그대로 전처리, 전에 미리 처리해 놓는다 이런거구요. 깊이 생각하실 필요없고 그냥
변수처럼 쓰이지만 바꿀 수 없는 static한 변수입니다.
물론... 변수와는 큰 차이가 있습니다만, 무시하세요 ㅎㅎ

이렇게 define과 enum을 사용하여 미리 태그들을 직관적으로 표현해 봅니다. 둘 중 하나만 해도 됩니다.
저는 그냥 아주 약간의 테크닉을 소개해 드리고자 이렇게 두 가지 표현 다 사용 해 본 것 뿐입니다..^^;


그리고 내려와서 지난 번에 만들어 두었던 barButtonClick: 메소드를 알차게 채워줍니다^^


짜잔~
실행해 보고 버튼을 눌러봅니다~

잘 동작 되시나요?ㅎ

그런데 코드에서 보면... 네 번째 function 버튼의 동작과 모양이 일치하지 않음을 알 수 있습니다. 그러면 웹뷰의 동작 상태에 따라
버튼의 모양을 상황에 맞게 변경해 주어야 겠지요?ㅎ

그러면 누군가 웹뷰의 상태를 보면서 웹뷰가 특정 행동을 할 때, 그에 맞는 상황 대처를 해 주어야 합니다.
그 녀석이 뭐라고 했죠?

네 맞습니다! delegate !!



# UIWebView - delegate

자, 그러면 Web View의 델리게이트에 대해 알아봐야겠습니다 ㅎㅎ
검색을 알차게 해 봅니다~
아직도 Documentation의 단축키를 모르신다구요?
ㅠ_ㅠ Command + Alt + Shift + / 입니다.
자, 그렇게 해서 레퍼런스를 찾아보니, 델리게이트가 해줄 수 있는 일들이 나오네요 ㅎ
우리가 필요한 것은 웹뷰가 로딩을 시작할 때, 그리고 끝냈을 때 입니다.
왜냐구요? 로딩을 시작하면 정지 버튼으로 변경 해 주고, 로딩이 끝나면 새로고침 버튼으로 변경 해줘야 하니까요 ~


자, 그럼 이 녀석들에 대한 설명을 읽고, 이녀석이다 싶으면 메소드를 복사 해 옵니다~



Bar Button은 툴바 안에 속해 있는 녀석이죠.
일단 그 녀석을 변경해 주려면 툴바의 도움이 필요할 것 같군요~
툴바의 아울렛을 선언 해 줍니다.



이렇게 이쁘게 연결이 되었겠죠?ㅎ


그리고 알차게 코드를 폭풍입력!!!!!!!!!!!!!
코드에 대한 설명은 주석으로 알차게 달려있답니다^^*


그리고 나서 동작 상태에 따라 버튼모양이 이쁘게 변하는지 확인 해 봅시다~

어떤가요?ㅎ

델리게이트라는 녀석 참 오묘하고 재미나지 않나요?

오늘은 여기 까~지~^^

다음에 또 만나요~



by yagom

twitter : @yagomsoft

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 



Posted by yagom

댓글을 달아 주세요

  1. Favicon of http://blog.daum.net/exlikeus BlogIcon 몰락아티스트 2012.05.09 12:26  댓글주소  수정/삭제  댓글쓰기

    이런 개발하기 시리즈를 포스팅하는게 얼마나 힘들고 피곤한지 사람들이 모르는 걸까요?
    관심이 없어서 그런걸까요. 항상 수고하시는 IOS개발하기 시리즈를 지켜보고 있습니다.
    댓글과 추천뿐이지만, 힘내시고 항상 정성스러운 포스팅 감사합니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.05.09 15:52 신고  댓글주소  수정/삭제

      ㅎㅎ 안녕하세요~
      아티스트님 글 잘 보고 있습니다...
      저도 오늘 지나치기만 하고 댓글을 못달았네요 ㅠ_ㅠ
      저부터 반성을...ㅋㅋ
      저도 아티스트님께서 포스팅하신 인기 블로그에 관한 글처럼 인기블로그에 속하고 싶네요...^^
      물론 제 욕심일 뿐이지만요 ㅋ

  2. 생초보 2012.05.10 02:03  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님~ 생~ 초보입니다

    프로그램에 ㅍ 자 도 모르는 상태에서 첨부터 쭉~ 다 읽어보면서 따라도 해보니 다 이해는 못해도 감은 오는거 같네요

    단지 앱을 만들고 싶어서 공부를 시작했는데 맘이 급해서 그런지 만들고싶은 앱과 관련된 부분은 눈에 잘들어오는데
    그 외 부분은 대충대충 이해 못하고 넘어가게 되고....

    오늘은 #define <--요놈을 알게되서 너무 기분이 좋아요~ ㅎㅎ

    다음 강좌도 잘~ 부탁드립니다 감사합니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.05.10 09:16 신고  댓글주소  수정/삭제

      ^^ 안녕하세요~
      제 목표와 조금은 부합한 결과를 이끌어 낸 것 같아 기분이 좋습니다^^*
      마음이 급하다고 기초와 기본, 그리고 중요한 부분을 놓치는 경우가 많고, 저 또한 그랬었는데 누누히 말씀드리지만 간과하고 넘어가서는 안될 부분들이 많습니다..^^
      물론 이제 기초부분이 아니라 기본 부분으로 접어들었지만서도 기초를 탄탄히 하시기 바랍니다!^^
      생초보님의 응원으로 힘이 납니다!!ㅎㅎ
      #define 녀석은 잘 사용하면 편하고 좋지만, 위험요소가 너무나 많은 녀석입니다.
      꼭 필요할때만 적당히 사용하시고, 그 외에 다른 방법들도 많으니 enum, const 상수 등을 사용하시기를 권고드립니다. (검색해 보시면 define의 단점이랑 그 외에 다른 대체방법이 나올거예요)
      그럼 자주자주 놀러오시고 댓글도 많이 많이 주세요~^^
      필요한 부분 있으면 말씀해 주시구요 ㅎ
      그럼 좋은하루 되세요~^^*

  3. 인절미후후 2012.06.06 16:49  댓글주소  수정/삭제  댓글쓰기

    아니 이거슨!!!(이것은 이라고 적는게 맞습니다.)
    바 버튼 바꾸기군요 제가 이전에 바 버튼 체인지를 시도하다가 포기했었는데
    폭풍코딩중에 너무 반가와서(반가워서가 맞는말입니다.) 중간에 글남깁니다.

    제가 이런저런 검색으로 알아낸것은 애플에서 제공해주는 이미지 버튼(play/stop/refresh/rewind같은)은
    체인지를 할수 없고 정 사용하고 싶으면 같은 자리에 버튼을 두개주고 히든과 비지블(hidden = NO)을 번갈아가면서
    사용하라고 하더군요 (카메라 커스텀 할 때 사용해 봤습니다.카메라를 온/오프 가능하게 하고 on시에만 사진마크가 뜨도록 하는 거였죠)
    코딩 다 하고 다시 소감 남길게요 감사합니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.06 17:51 신고  댓글주소  수정/삭제

      아하~! 그런 방법도 있었군요 ㅎㅎ
      미쳐 생각하지 못했네용 ㅎ
      이런 귀차니즘같은...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
      좋은 부연설명 고맙습니다 ^^*
      오늘 폭풍 댓글 받으니 기분 너무 좋네요 ㅎㅎ (정말 좋네요가 맞는 말입니다.)

  4. 지문 2012.06.06 18:39  댓글주소  수정/삭제  댓글쓰기

    초보라, 맥부기에서 야곰님 강좌 본적이 있어서 왔습니다.
    맥부기에도 질문 올렸지만 아직 해결이 안되어서요.
    RUN했을때, 시뮬레이터5.1가 xcode(4.3.2) 상에서 바로 뜨지를 않고
    장면이 바뀌면서 바탕화면이나, 크롬화면위에서 시뮬레이터가 뜹니다.
    시뮬레이터를 xcode화면 위에서 뜨게 하고 싶은데,,어떻게 하는지요?
    너무 초보적인 질문이라서,,,망설이다가 올려봅니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.07 01:33 신고  댓글주소  수정/삭제

      글쎄요..^^;
      무슨말인지 완전히 이해가 가진 않지만,
      다음 번에 실행될었으면 하는 자리에서 시뮬레이터를 종료 해 보세요.
      다음 번에 실행 될 때 시뮬레이터가 지난 번에 실행되었던 자리에서 실행 될 겁니다.
      적절한 답변이었으면 좋겠네요^^;;;

  5. yuyu 2012.06.21 18:02  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    좀 여쭤보고 싶은게 있는데요.
    앱에서 사진을 찍은 위치의 위도와 경도를 알수 있나요?
    그리고 위치서비스를 사용자 동의없이 자동으로 활성화 시키는 것도 가능한가요?
    아니면 자동으로 활성화 시키면 안되는 규정이라도 있나요?
    아무리 찾아봐도 모르겠네요.
    알고계시면 좀 알려주세요~ㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.22 11:39 신고  댓글주소  수정/삭제

      지난 번이랑 질문이 똑같으시네요...^^;
      지난 번에 답변 드렸었는데...
      그래서 저도 답변을 복사해왔습니다 ^^
      그리고 사진에서 위치 가져오는 방법은
      http://stackoverflow.com/questions/1238838/uiimagepickercontroller-and-extracting-exif-data-from-existing-photos
      http://stackoverflow.com/questions/616346/iphone-access-location-information-from-a-photo
      참고하세요~
      ============================
      상식적으로 당연히 사용자의 허가 없이는 그 무엇도 불가능 합니다...
      그런 규정이 명시되어있는지는 모르겠지만, 사용자의 위치정보를 무단 수집하는 행위이므로 어플리케이션에서 임의로 사용자 위치정보를 사용할 수 없습니다.
      사용자가 허가 하여야 합니다.

    • yuyu 2012.06.26 13:27  댓글주소  수정/삭제

      안녕하세요.
      답변 정말 감사드립니다.
      전에 제가 올린 글은 너무 예전 글에 올려서 지우고 다시 올린건데 안지워졌나보네요.ㅎ
      ================================
      위치정보 무단 수집은 당연히 불법인거 아는데,
      애플에서 사용자 허가 없이는 위치정보 수집을 하면 안된다는 조항을 회사에서 꼭 찾아야 한다는데,
      아무리 찾아도 못 찾겠네요ㅠ
      혹시 아시나 싶어서 여쭤본거에요.ㅎ
      더 찾아봐야겠네요.ㅋ

      다시한번 답변 감사드립니다.^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.26 16:06 신고  댓글주소  수정/삭제

      음... 그런 조항에 대해서는 확인해 본 적이 없어서요 ㅠ_ㅠ 구글신께서 답을 내려 주셨기를... :-)

  6. Sio 2012.07.18 17:25  댓글주소  수정/삭제  댓글쓰기

    안녕하세요~~~!!
    음.. itemStyle에 따라서 FuncButton을 바꾸는 부분에서요...
    저는 바뀌는 모습이 보이지 않습니다 ㅜㅜ;;;;;
    시뮬레이터로 아무리 돌려도 변하는 모습이 보이질 않네요 ....

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.07.18 19:04 신고  댓글주소  수정/삭제

      음.. 웹뷰의 델리게이트가 연결되어있나 확인해 보세요~^^*

    • Sio 2012.07.19 11:22  댓글주소  수정/삭제

      아하하;; 할때 뭘 잘못 해서 xib를 싹 지웠다가 다시 했더니 delegate 연결을 깜박했네요 ㅡㅡ;;;
      한번 해봤으니 혼자해봐야지 하면서 나름대로 다시 해봤는데도 역시 하나씩 빠트리네요 ㅋㅋㅋ
      이젠 아주아주 잘됩니다~! 감사합니당^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.07.20 09:07 신고  댓글주소  수정/삭제

      잘 동작된다니 다행입니다 ㅎ

  7. 리현 2012.07.27 04:39  댓글주소  수정/삭제  댓글쓰기

    당큐~~아파서 잠시 쉬고 다시왔더염 ㅎㅎㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.07.27 13:11 신고  댓글주소  수정/삭제

      에고...ㅠㅠ 아프면 안돼요~
      저도 며칠 아프고 이제 좀 정신 차렸는데, 혼자사는데 아프니까 서러워요 ㅠㅠㅠ

  8. 나에게넌 2012.08.13 10:39  댓글주소  수정/삭제  댓글쓰기

    계속 쪽쪽 빨아갑니다..오늘 강의 다 볼꺼에요 ㅎㅎ 항상 감사합니다..

  9. 감사합니다. 2012.10.17 17:19  댓글주소  수정/삭제  댓글쓰기

    yagom님 덕에 정말 많이 배우고 있습니다.

    근데 ios6으로 넘어오면서 더이상
    [self dismissModalViewControllerAnimated:YES]; 코드가 안먹는거 같아요..

    그래서
    [self dismissViewControllerAnimated:YES completion:nil]; 요걸로 바꾸니 정상 작동하는군요.

    스토리 보드로 yagom님 강좌 다 따라하는데 정말 재밌네요.
    감사합니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.10.20 10:43 신고  댓글주소  수정/삭제

      안녕하세요 :)
      말씀하신 내용이 맞습니다.
      iOS6에서 변경된 부분 중 하나인데요, iOS6미만 기기에서도 호환이 되게 만들으려면 버전체크를 해서 적절한 메소드를 호출해 주어야겠죠?ㅎ
      찾아주셔서 정말 고맙습니다.
      필요한 내용 말씀해 주시면 피드백 하도록 노력하겠습니다 ^^*

  10. 2012.10.31 15:40  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.01 09:37 신고  댓글주소  수정/삭제

      안녕하세요 앱만들자님 :)
      applicationDidBecomeActive 메소드와 applicationWillResignActive 두 메소드를 이용하시면 될 것 같습니다 ^^*
      찾아주셔서 정말 고맙습니다 ㅎ
      추운날씨 감기 조심하셔요~

  11. 이춘홍 2014.01.04 22:52  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 소중한 정보 잘 보고 질문드립니다.

    제가 앱개발을 처음해봐서 웹뷰의 사용시 애플 앱심사에 결격사유가 어느정도인지 궁금합니다.
    혹시 앱심사를 잘 통과할 수 있는 노하우가 있을까요~?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2014.01.05 20:05 신고  댓글주소  수정/삭제

      안녕하세요, 방문해 주셔서 고맙습니다 ^^

      앱 심사 기준은 기본 틀은 크게 변하지 않지만 간간히 변하기 때문에 수시로 확인을 해주시는 것이 좋습니다.

      https://developer.apple.com/appstore/guidelines.html

      이곳에 가시면 앱 심사 가이드라인이 있습니다.

      제가 아무리 말씀드려도, 개인마다 어떤 기준의 체감이 다르기 때문에 가이드라인을 읽어보시고 애매한 부분이나 궁금한 부분이 있다면 애플에 직접 이메일로 문의해 보시는 것도 좋은 방법입니다 :)


오늘의 주제

1. UIWebView 
2. UIToolBar



스물 일곱번째 시간입니다.^^

지난 번까지는 프로젝트를 계속 사용했는데, 이번에 새로 프로젝트를 하나 만들어 보겠습니다.
어찌되었든간 지난 번 까지 했던 내용들은 마음에 드셨는지 모르겠습니다...^^
지금까지 해 본것들은 예제이고 앞으로도 예제를 통해 내용이 진행되니, 디자인이 이쁘지 않더라도, 지금 당장 뭐가 없어보여도 쭉 한번 따라해 보세요..^^
그럼 어느순간 머릿속에 정리가 되고 느낌이 올 때가 있습니다.
그 때, 필요한 것들만 검색하고 취합해서 자신만의 프로젝트를 만들어 가시면 됩니다.
아직 그정도는 안온 것 같죠?ㅎ

그럼 오늘 또 새로운 세상을 향하여 한 걸음 내딛어 봅시다^^

출발~!



# UIWebView, UIToolBar

UIWebView...
음~ 이녀석은 뭘까요?ㅎ
딱, 이름만 봐도 웹뷰.
즉, 웹페이지를 보여주는 녀석이라는 것을 알 수 있죠?ㅎ

오늘은 이녀석과 한 번 놀아봅시다^^

아까 말씀드린대로 오늘은 새로운 프로젝트를 생성하여 진행 하도록 하겠습니다.
물론 이후 포스팅에서도 이 프로젝트를 계속 사용할 예정입니다~
프로젝트 템플릿은 Single View Application으로 하겠습니다.


프로젝트 이름은 WithYagom으로 했구요~
아래 여러 옵션들을 유심히 보시고, 실수 하지 않도록 하세요~
질문 주시는 분들중에 스토리 보드에 체크하고 프로젝트를 생성하셔서 질문하시는 분들이 몇분 계시더라구요^^;
너무 조급히 생각하지 마시고 천천히 꼼꼼하게 보며 진행하시기 바랍니다.
조급히 달리다 보면 소소한 기초들과 개념들을 놓치게 됩니다~!


일단 앞으로 당분간은 세로모드 고정으로 진행할 계획입니다.~



자, 새로운 프로젝트를 생성하고, 이제 WebView를 얹어 볼 새로운 뷰 컨트롤러 생성을 할 차례입니다.
WithYagom폴더에서 오른쪽 버튼 또는 커맨드 클릭을 하여 New File을 선택합니다.


Objective-C class를 선택해 주시구요~


클래스 이름은 ViewControllerForWeb이라고 하겠습니다. XIB파일 생성에도 체크해 주시구요~


자, 이렇게 새로운 클래스가 생성되었죠?
그런데 이렇게 클래스를 새로 생성 할때마다 파일이 쭉쭉 늘어나고 복잡해 지는데... 정말 많아지면 정신없겠죠? (지난 프로젝트 한 번 보세요..ㅎㅎ)
이참에 정리를 좀 해볼까요?


WithYagom폴더에서 우클릭을 하고 NewGroup을 선택합니다.


새로운 그룸이 생성되면 이름을 써서 그룹을 만들어 주고, 파일들을 알맞게 정리해 줍니다. 저는 이런식으로 정리를 해 보았습니다~
자, 좀 깔끔하죠?ㅎ


그렇다면 이제 본격적으로 시작해 봅시다.
ViewControllerForWeb.xib파일로 이동합니다.
ToolBar라는 녀석을 하단에 쭈욱 넣어주시고,
Bar Button Item이라는 녀석을 하나 넣고, Flexible Space Bar Button Item 을 넣고, 다시 BarButton Item을 넣고...
그렇게 Bar Button Item을 다섯 개 넣어줍니다.


자, 그리고 Bar Button Item들의 이름을 이렇게 바꿔주시고요~
ToolBar위쪽으로 Web View를 똻~~!!!!!!! 올려줍니다~


그리고 오른쪽 버튼을 누른 상태로 File's Owner로 쭈욱 끌어당겨 줍니다.


그리고 delegate를 클릭!!
이제 이 클래스(ViewControllerForWeb)의 인스턴스가 이 WebView의 delegate가 됨을 말하는 것입니다. WebView의 동작처리를 ViewControllerForWeb이라는 녀석이 하겠다는 뜻이죠?


그 이후에 Assistance 모드로 전환해서 ViewControllerForWeb.h파일에다가 아울렛을 선언해 줍니다.



자, 그러면 ViewControllerForWeb.h에 이렇게 이쁘게 생성이 되겠죠?ㅎ



자, 그럼 이제 Bar Button Item들도 액션 선언을 해 주어야 하는데, Bar Button Item 선택이 한 번에 안됩니다.
버튼을 누르면 처음에 Tool Bar 전체가 선택이 됩니다. 그러면 그 후에 버튼을 한 번 더 눌러주면 그 때 버튼이 선택이 됩니다.
(아래 두 그림을 참고하세요)


자, 그러면 첫 번째 버튼의 액션을 연결 해 봅시다.
오른쪽버튼을 누른채로 쭈욱 당여옵니다.
그 후에 액션을 아래처럼 연결해 주시구요. 이 그림만 보고 성질 급하게 다섯 번 째 까지 연결 하실 분들을 위해 한 줄 더 쓰고 다음 그림으로 갑니다 ㅋㅋ
두 번 째 버튼부터는 아래 그림을 참고하세요.


두 번 째 버튼부터는 위에 만들어 두었던 메소드로 연결을 해줍니다.
오른쪽 버튼을 가지고 쭈욱 끌어서 만들어 놓은 메소드 위로 올리면 Connect Action이라고 나옵니다. 그 때 마우스를 떼면 빤짝빤짝 해요~
연결 된 겁니다.


자, 그런데 버튼들에 이름을 직접 새겨 넣는 것 보다 좀 더 직관적으로 표현해 보고 싶습니다.
네 번째 새로고침 버튼의 스타일을 변경 해 봅시다. 좀 더 직관적으로 보이죠?ㅎ


 다섯 번 째 녀석도 한 번 바꿔 봅니다. 물론 실제로 컬업으로 닫히게 하지는 않을거예요..ㅎㅎ 그냥 스타일 한 번 줘 봅니다~



그리고 이제부터 첫 번째 버튼 부터 태그를 하나씩 지정해 줍니다.
태그는 그 녀석만의 식별 숫자라고 생각하시면 되겠습니다.
물론 다른 객체도 같은 태그를 가질 수 있습니다만, 객체별로 구분하고 싶다면 태그를 다르게 입력해 주는게 좋겠죠?
첫 번째 버튼의 태그는 10


두 번째는 20


세 번째는 30... 네 번째 다섯 번 째 까지 쭈욱 넣어줍니다.



그 후에 이제 메인 뷰 컨트롤러인 ViewController.xib로 이동하여 버튼을 하나 만들어 줍니다.
그리고 액션을 그림처럼 연결 해 주세요~


그리고는 새로 우리가 만든 클래스의 헤더를 import 해 주시고,
버튼과 연결된 메소드인 webButtonClick: 에 내용을 넣어줍니다.
코드는 아래 소스의 주석을 확인하세요.^^


그리고 ViewControllerForWeb.m으로 옵니다.
아래 소스를 작성해 주세요.


실행해 봅니다~!
자, 잘 나오나요?ㅎ
아래 툴바의 버튼들은 아무 동작을 하지 않죠?ㅎ 물론 우리가 아무것도 작성하지 않았기 때문이죠..^^;



오늘은 여기까지..ㅎ

오늘은 양이 많았지만, 결국 나온것은 웹페이지 하나 띄워 본 것 뿐이네요 ㅎㅎ
하지만 다음 포스팅의 밑거름들을 쭈아악~~~~~ 깔아 놓은 것이니 다음 포스팅에서는 좀 더 알찬 내용이 나올 것이라고 믿어 의심치 않습니다 ㅎㅎ

그럼 다음에 뵈어요~^^

뾰봉~


by yagom

twitter : @yagomsoft

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 



Posted by yagom

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. 편안한비 2012.05.15 11:03  댓글주소  수정/삭제  댓글쓰기

    좋은자료 잘 보고 갑니다~

  3. 노가다개발자 2012.05.17 18:25  댓글주소  수정/삭제  댓글쓰기

    혹시 폰갭 이용시 웹페이지를 불러올때 웹뷰로 불러오는게 아니라.. 사파리 웹으로 전환이 되서 열리는데..

    이것에 대한 폰갭에 대한 설정이 있는지 아니면 코딩상으로 제어를 해야하는지 알수있을까요??

    스크립트로 보내서 document.href 로 열어도 다른분 댓글보면 웹뷰를 통해서 열린다는 분도 계시는거 같은데..

    웹으로 전환이 되어버리네요..

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.05.18 05:47 신고  댓글주소  수정/삭제

      흠... 글쎄요^^;
      폰갭에서 웹뷰를 띄워본 적이 없어서 잘 모르겠습니다..^^;
      맥부기나 스택 오버플로에서 정보를 얻으심이 빠르실 것 같습니다..
      확답을 드리지 못해 죄송합니다..!

  4. 인절미후후 2012.06.06 16:09  댓글주소  수정/삭제  댓글쓰기

    항상 알찬 포스팅 감사합니다~~

    와서 볼때마다 느끼는데 딱 저한테 필요한 내용이 정말 많은거 같아요 유용하게 잘 보고 있습니다.
    다음강좌 이동하겠습니다~

  5. 박병훈 2012.07.14 16:58  댓글주소  수정/삭제  댓글쓰기

    안녕하세요?? 요즘 아이폰 입문자입니다.ㅋㅋㅋㅋㅋㅋㅋ
    아주 좋은 자료 감사합니다.
    이번 포스팅을 보고나서 다른 페이스북 페이지로 연결 시키려고하는데 안되네요
    페이스북은 연결이 안되나요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.07.15 20:28 신고  댓글주소  수정/삭제

      안녕하세요 박병훈님.
      페이스북을 어떻게 연결하고자 하시는지요?
      페이스북 페이지를 열고 싶으신 건지, 아니면 페이스북에 글을 남기고 싶으신 건지에 따라 방법이 다릅니다 :-)
      게다가 이제 iOS 6.0 이 정식으로 나오면 또 다른 방법이 생기구요 ㅎ
      어떤 방법으로 연결을 원하시는지 구체적으로 말씀해 주세요~

  6. 앱만들자 2012.07.15 00:18  댓글주소  수정/삭제  댓글쓰기

    참쉽게 설명과 그림을 보니 이해가 자꾸만 가네요 정말 감사합니다........

  7. Sio 2012.07.18 13:09  댓글주소  수정/삭제  댓글쓰기

    웹뷰 같은건 왠지 어려울것 같았는데
    아직까지는 따라갈만 해서 좋네요 ㅎㅎㅎ
    설명을 너무 잘해주셔서 그런가봐요 ^^

  8. 나에게넌 2012.08.13 09:34  댓글주소  수정/삭제  댓글쓰기

    야곰님 지식을 쪽쪽쪽 다 빨아가겠습니다..항상 감사합니다..

  9. mhy 2012.09.12 11:16  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님 글에 많은 도움을 받고 있습니다.

    현재 내용을 따라하다 문의 드릴게 있엇 글남깁니다.

    위내용에 웹표 표현되는것이 시뮬레이터에서는 잘보이는데

    폰으로 확인하면 아무내용도 표시가 되질않는데 어떤이유때문에 그런가요..

    웹뷰가 그냥 흰색화면으로만 나오네요...

    도움주시길 바랍니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.10.03 21:46 신고  댓글주소  수정/삭제

      혹시 아이폰의 버전이 5.x대가 맞나요?
      6.x대에서는 아직 제가 테스트를 해보지 못했습니다.
      버전이 달라서 그럴 수도 있을 것 같습니다 ^^;
      그게 아니라면 어떤 이유 때문인지 다시 알아봐야겠네요~

  10. Parkep 2013.01.02 10:07  댓글주소  수정/삭제  댓글쓰기

    덕분에 공부 열심히 하고있습니다 감사합니다 ㅎㅎㅎ

  11. dumbo 2013.01.15 15:36  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님 덕분에 ios 재미있고 쉽게 배우고 있습니다.

    현재 6.0버전으로 따라가고 있는데 loadRequest부분에서 thread 1 break point 1.1 메시지가 나오면서 구동이 멈추는데요.

    어떤 문제로 메시지가 뜨는지 문의드립니다.

    늦게나마 새해 복 많이 받으세요~~

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.01.16 13:04 신고  댓글주소  수정/삭제

      혹시 Break Point로 지정되어있진 않은가요?^^

      코드 옆에 파란색 화살표가 있는지 확인해 보시고 혹시나 있으면 제거해 주세요 ㅎ

  12. dumbo 2013.01.17 22:34  댓글주소  수정/삭제  댓글쓰기

    .....감사합니다 ㅎㅎ

  13. seunggon 2013.02.25 19:21  댓글주소  수정/삭제  댓글쓰기

    웹뷰의 소스를 얻을 수 있을까요 ? 따라하는데 계속 실패하네요 ㅠㅜ

  14. Help 2013.02.28 10:23  댓글주소  수정/삭제  댓글쓰기

    좋은 강의 잘 보고있어요 정말 큰도움되었답니다!!ㅠㅠ

    아이폰 앱을 다 만들고 앱스토어에 등록하는 강의생각은 없으신가요?ㅠㅠㅠ

    열심히 구글링하고 있는데 원하는 정보가 안나와요...

    만든 앱을 올리고나서 그걸 업데이트하려면 -info.plist 에서 버전만 올리면 되는건가요??

    그리고 사용자가 다운받아논 앱을 업데이트시키려면 어떻게 해야할지....아무리찾아도안나와요 ㅠㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.02.28 10:40 신고  댓글주소  수정/삭제

      안녕하세요~
      지금은 제가 포스팅할 여력은 되지를 않구요...^^
      http://writerkim.pe.kr/1132
      여기를 참고해 보시겠어요?ㅎ
      큰 도움이 되어드리지 못하여 죄송합니다..^^;

  15. 딴또 2013.03.13 16:59  댓글주소  수정/삭제  댓글쓰기

    멋진 강의 정말로 감사합니다.

  16. 배도영 2013.03.16 17:24  댓글주소  수정/삭제  댓글쓰기

    @synthesize ygWebView 가 빠졌네요... ㅠㅠ

    왜 안되나싶어서 엄청 찾아다녔습니다.ㅠㅠ

  17. 노현빈 2013.07.07 22:42  댓글주소  수정/삭제  댓글쓰기

    포스팅 정말 감사합니다
    우연히 블로그를 방문하게 되었는데
    야곰님 덕분에 잘 배우고 있습니다
    프로그래밍은 초심자라 배우면서도 조금 막막했는데 강의보면서 천천히 따라하니까 조금씩 감이 잡히는 것 같습니다.
    정말 감사합니다.

  18. Favicon of http://ohsdsl@naver.com BlogIcon hahahaha 2013.09.02 16:05  댓글주소  수정/삭제  댓글쓰기

    야곰님 잘 보고 있습니다.

    질문이 있는데요

    초기 페이지에서 버튼 눌러서 웹뷰 띄우게 하는게 아니라

    바로 초기페이지에 웹뷰를 넣고 실행하니까 오류가 나는데요

    원래 안되는 것인지 아니면 제가 잘못해서 그런건지 궁금합니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.09.03 09:17 신고  댓글주소  수정/삭제

      안녕하세요~

      초기화면에서 웹뷰를 띄운다고 오류가 나서 앱이 죽는다거나 하는 경우는 없을거예요.
      뭔가 잘못되었기 때문에 오류가 나는 것 같은데, 어떤 오류가 어디서 나는지 파악해 보셔야 할 것 같습니다.

  19. 조언이필요한자 2014.02.05 10:06  댓글주소  수정/삭제  댓글쓰기

    안녕하세요

    야곰님 글 너무 잘보고 있습니다

    질문이 있습니다.

    야곰님이 말씀하신대로 웹뷰를 잘 띄웠는데요

    url주소가 한글이 들어가 있으면 불러오지가 않습니다

    한글이 깨진건 아니구요 로그에는 주소가 정확히찍힙니다.

    혹시 조언좀 구할수 있을까요??ㅠㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2014.02.05 10:11 신고  댓글주소  수정/삭제

      안녕하세요 :)
      URL 인코딩이 필요한 것 같습니다.
      http://theeye.pe.kr/archives/853
      이 주소 또는 구글에 iOS URL encoding 이라고 검색해 보셔요 ㅎ

  20. 조언이필요한자 2014.02.05 10:26  댓글주소  수정/삭제  댓글쓰기

    아 너무 감사합니다

    가르켜주신 url 타고 가서 보고 바로 적용 해서 해결했습니다.

    정말감사합니다. 좋은하루되세요~

  21. 조언이필요한자 2014.02.06 14:03  댓글주소  수정/삭제  댓글쓰기

    안녕하세요

    질문이있어서 그러는데요

    공지사항 을 만들려고 합니다.
    그런데 공지사항 목록을 그렸습니다
    그리고 그 목록중 하나를 클릭하면
    DrawDetail(nIndex); nIndex를 인자로받아
    함수를 호출 하여 그 공지사항에 대한 정보를 그렸습니다

    여기서 문제는 공지사항 상세 에서 다음과 이전 버튼을 만들어서
    다음버튼을 누르면 클릭한 목록 다음것을 그리고 이전버튼을 누르면 클릭한 목록 이전것을 그리고 싶습니다.

    그래서 DrawDetail(nIndex); 함수로 값을 그릴때 nIndexnext = nIndex +1; 을 해줘서 다음버튼 클릭시
    DrawDetail(nIndexnext); 로 다음 공지사항 상세를 바로그리려 하는데 그 목록에 대한 정보를 가져오지 못합니다.
    인자 값은 제대로 증가 한것을 확인했습니다만....

    제말을 이해하셨을지 모르겠습니다. 읽어주셔서 감사합니다. 조언가능하시면 조언해주시면 감사하겠습니다.ㅠㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2014.02.07 09:14 신고  댓글주소  수정/삭제

      안녕하세요, 또 뵙습니다 :)

      여러가지 경우의 수가 존재하기 때문에 딱 뭐라고 말씀드리기가 어렵군요.
      일단 목록(배열)의 인자들이 이미 메모리에서 해제되었을 수도 있고
      DrawDetail 함수가 어디에 구현되어 있는지에 따라서도 다를 것 같구요... 또 어떤식으로 그리고 계신지도 제가 잘 몰라서요 ^^;

      상세 화면으로 넘어갔다면 상세화면 전의 컨트롤러에서 공지사항 정보들을 상세화면쪽으로 넘겨줘야 하는데, 어떤 방식으로 어떻게 넘겨주시는지도 제가 잘 모르구요..^^;

      델리게이트와 프로토콜의 개념에 대해 조금 더 알아보시거나, 싱글턴 기법에 대해서도 알아보시면 좋을 것 같아요.


오늘의 주제

1. NSDictionary, NSMutableDictionary
2. NSArray, NSMutableArray



열 한번째 시간입니다.^^

지난 번에는 상속이라는 또 하나의 중요한 개념에 대하여 알아보았습니다.
이번에는 Objective-C에서 가장 흔하고 많이 쓰이는 클래스 중에 자료를 보관할 수 있는 녀석들에 대해 알아보도록 하려고 합니다.

딕셔너리랑 배열인데요, 한 번 봅시다~
 
어휴~ 봄감기 때문에 아주 죽겠네요+_+

# NSArray

배열이란???
C를 배운 분들이라면 배열을 아실겁니다 ㅎ
하지만 여기서 말하는 녀석은 메소드까지 가지고 있는 클래스 입니다. 단순한 자료형이 아니죠~
뭐 약간의 사용개념을 보면 C의 Linked-List(연결 리스트)와 비슷하다고 생각하시면 되겠습니다~!

일단 아래 발로그린 배열을 보시죠..ㅋㅋㅋ

배열입니다.
C에서의 배열과는 달리 이녀석에는 어떠한 객체도 들어갈 수 있습니다.
C의 배열에서는 int형 배열이라면 저장되는 녀석들이 전부 int형이지만, Objective-C의 Array에는 객체 형태라면 무엇이든 들어갈 수 있습니다.

위의 그림의 배열에는 index 0번에 NSString의 객체가 들어가 있고 1번에 NSNumber의 객체가 들어가 있습니다. 그 뒤에 또 어떤 객체들이 들어올 수도 있습니다.

Objective-C에서 이렇게 index번호로 쭈욱 연결되 있는 녀석을 우리는 Array라고 칭합니다.

이와 같은 배열 클래스는 크게 두 가지로 볼 수 있는데요,

처음 생성시 배열을 만들어 주고 수정, 삭제가 불가능한 NSArray.

그리고 생성 후에 추가, 수정, 삭제가 자유로운 NSMutableArray가 있습니다.

NSMutableArray는 NSArray를 상속받아 사용하기 때문에 NSArray의 모든 메소드를 사용할 수 있으며 추가적으로 추가, 수정, 삭제 메소드가 있습니다.
자세한 설명은 저 아래에서 다시 할게요~

잠깐,,! 상속을 모르신다구요? 그럼 알고 넘어갑시다^^
2012/03/28 - [Objective-C] - Objective C <9>. 상속(1)
2012/04/10 - [Objective-C] - Objective C <10>. 상속(2) - 오버라이딩


# NSDictionary

딕셔너리란???

우리말로 하면 사전이라는 뜻이죠~

우리는 사전에서 무엇인가를 찾고자 할때, 해당하는 단어를 찾고, 그 단어를 찾아가서 그에 해당하는 내용을 가져오죠.

여기서의 딕셔너리도 마찬가지입니다.

여러 자료들을 하나의 딕셔너리에 넣어놓고 우리가 원하는 자료를 꺼내오고 싶을 때, 우리가 딕셔너리를 생성할 때 부여해준 key라는 녀석으로 검색을 하여 꺼내옵니다.

여기 아래의 허접한 그림을 함께 보시죠 ㅋㅋㅋ

위의 그림의 딕셔너리에는 세 개의 객체가 들어가 있습니다.

NSString의 객체는 name이라는 key값을 가지고 있고, NSNumber의 객체는 number라는 key값을 가지고 있습니다.
그리고 NSArray의 객체는 array라는 key값을 가지고 있네요.

이처럼 딕셔너리에는 다양한 종류의 객체가 들어가 있을 수 있으며, 각각의 객체는 고유한 key값을 가지고 있습니다.
그렇기 때문에 우리가 사전에서 어떤 단어를 찾아서 그 의미를 해석해 낼 수 있듯이, 컴퓨터는 딕셔너리 안에서 키값으로 원하는 자료를 찾아올 수 있는 것입니다.

즉, Array는 index 값으로 자료를 꺼내올 수 있지만, 딕셔너리는 index값이 없는 대신 key 값으로 자료를 꺼내올 수 있습니다.

딕셔너리도 배열과 마찬가지로 NSDictionary와 NSMutableDictionary로 나뉠 수 있습니다.

두 개의 차이점은 위에서 말씀드렸으니 아시겠죠?ㅎ

이렇게 자료들을 편하게 보관할 수 있는 두 클래스를 알아보았습니다.



그렇다면 이제 예제를 통해 익혀보도록 해요~

# 실습해보기 

새로운 프로젝트를 만들어 봅시다~
요로코롬 만들어 줍니다~


그리고 코드를 예쁘게 넣어줍니다~_~


자, 자세한 설명은 주석을 통해 달아놓았으니 참고하시기 바랍니다.

위에서 디버깅 로그를 보게되면 배열에 두 개의 객체가 들어가 있는 것을 볼 수 있고, 딕셔너리에 배열, 이름, 숫자 이렇게 세 개의 객체가 들어가 있는 것을 볼 수 있습니다.

그런데 배열에서는 우리가 넣어 준 순서대로 들어가서 로그에 찍히는데, 딕셔너리의 로그에는 우리가 집어 넣어준 순서대로 찍히질 않네요+_+

네, 그렇습니다. 딕셔너리는 기본적으로 우리가 넣어 준 순서대로 자료가 정리되어 있는 것을 보장하지 않습니다.
딕셔너리라는 주머니에 객체들이 막 널부러져 있는거죠~^^* 이 또한 배열과 딕셔너리의 차이점이 되겠습니다. ㅎ

자, 위에서 Mutable이 아닌 기본 클래스를 사용해 보았으니 이제 Mutable도 사용해 보아야 겠죠?
코드를 이쁘게 추가해 줍시다.

역시나 자세한 설명은 주석으로 들어가 있습니다~
우리가 처음에 생성해 주었던 배열과 딕셔너리에서 Mutable 녀석들로 객체의 내용을 복사해 온 후에 원하는 내용을 삭제 해 보았습니다.
물론 추가, 수정도 가능합니다~ 그것은 개발문서를 보고 여러분께서 직접 해보기실 권고드립니다^^

디버깅 로그를 살펴보면 우리가 삭제한 내용들이 나오지 않는 것을 확인할 수 있습니다.
이처럼 Mutable을 들어간다면 수정 가능한 녀석들이라고 보시면 되겠습니다.


자, 그런데 제가 위에서 설명드린 것만으로 이렇게 유용하고 좋고 깔쌈하고 이쁜 클래스들을 전부 알 수가 없습니다.
제가 일일히 다 설명을 할 수가 없으니까요^~^

그래서 우리에게는 개발문서가 존재합니다!!!ㅎㅎㅎ
자, 코드에서 alt 키를 누른 상태로 NSDictionary 위에 살포기 커서를 가져가면 밑줄이 생기죠? 클릭해 봅니다~
요렇게 아래 그림처럼 나올꺼예요~ 그렇다면 좀 더 자세히 알아보기 위해 Reference를 눌러봅시다~


이렇게 NSDictionary Class Reference가 나옵니다~
이 개발문서에서는 이 클래스에 관한 거의 모든 내용이 실려있습니다.
살펴보기 부터 시작해서, 가지고 있는 메소드와 변수 등등 모든 것이 나와있는 것이죠.

이렇게 메소드들도 쭈욱 써져 있고 (링크로 되어있기 때문에 누르면 메소드에 관한 자세한 설명을 볼 수 있습니다) 
많은 내용들이 담겨져 있어요. 제가 이걸 다 블로그에 설명 할 수는 없겠죠?ㅎ


딕셔너리만 보면 서운하니까 배열 클래스도 놀러와 봅니다.


이렇게 메소드의 역할별로 카테고리가 나누어져 메소드가 정리되어 있어 쉽게 원하는 메소드를 찾아 볼 수 있습니다~_~

NSMutableDictionary 클래스 레퍼런스를 봅니다.
아래쪽에 Subclassing Note 라고 나와있는 부분이 있는데, 거기 위쪽에 보면  inherits from NSDictionary 라고 써져 있는 것 보이세요?
즉, '이 클래스는 NSDictionary를 상속받았다' 라는 뜻이죠?
그러므로 이녀석은 NSDictionary의 메소드와 변수들을 사용할 수 있다는 뜻이겠죠~ 거기에 추가적으로 수정 기능이 덧붙여 진 녀석이죠^^*


그래서 이녀석의 메소드들을 보면 몇 개 없습니다. 왜냐면 나머지 사용 가능한 메소드들은 NSDictionary에서 찾아볼 수 있거든요^^

이처럼 개발문서를 보면 우리가 알고 싶었던 것 이상으로 자세한 내용들을 찾아볼 수 있습니다~

이 글을 읽었다고 끝나는 것이 아니라 개발문서에서 이런저런 메소드 들을 보고 직접 실습해 보시기 바랍니다~

오늘은 그럼 여기 까~~~~~~~지!

감기때매 헤롱헤롱 @_@

by yagom

twitter : @yagomsoft

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 사랑합니다~ ↓↓↓ 

Posted by yagom

댓글을 달아 주세요

  1. Favicon of https://bikiniline.tistory.com BlogIcon 비키니라인 2012.04.24 13:20 신고  댓글주소  수정/삭제  댓글쓰기

    으음. 그러니깐 딕셔너리는
    c++에서 구조체 같은 거군요 ~! ... 아닌가 ㅠ

    근데 궁금한게 NSArray 를 사용할때요
    2차 배열은 어떻게 만드는지 궁금하네요
    으음... 어차피 배열에는 객체가 들어가는 거니깐..
    2개의 원소를 갖는 배열 객체를 만들고 그 객체를 원소로 갖는 배열을 만들면 그게 2차 배열이려나 ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.04.24 18:04 신고  댓글주소  수정/삭제

      구조체와 생김새는 비슷하지만, 객체라는 큰 차이점이 있고, 내부에도 객체만 들어갈 수 있다는 점이 다르죠..^^
      Objextive-C 에서도 C의 거의 모든 기능을 사용할 수 있습니다. ㅎ 그러므로 C에도 있는 녀석을 굳이 새로 만들 필요는 없겠죠 ㅎ

      NSArray는 기본적으로 다차원 배열을 지원하지 않습니다만, Array의 각 인덱스에 Array를 넣어준다면 그게 다차원 배열이 되겠지요..ㅎㅎ

      항상 들러주시고 관심 가져 주셔서 고맙습니다^^

  2. Favicon of https://bikiniline.tistory.com BlogIcon 비키니라인 2012.04.25 15:23 신고  댓글주소  수정/삭제  댓글쓰기

    c++의 경우에,
    1. A라는 구초체를 만든다 struct A{ 어쩌고 저쩌고 ...};
    2. A형 배열을 선언한다. A array[10];
    이렇게 해두면 사용할때 array[4].어쩌고 = xxx ; 뭐 이런식으로 접근하기도 편하고 값을 바꾸기도 편한데..

    objective c 의 딕셔너리는 좀 복잡하네요...
    NSMutableDictionary형 배열을 만들고 초기화? 해주고... 포함된 객체에 접근하는거 까지는 별 차이 없는데
    내용을 바꿔주는게 복잡하네요 ...

    1. objectForKey메소드를 이용해 오브젝트를 불러온다
    NSNumber *temp2= [numberDic[[string integerValue]-1] objectForKey:@"appearanceCount"];
    2. 형변환을 해준다.
    int a = [temp2 intValue];
    3. 하고싶은 작업?을 한다.
    a++;
    4. 다시 객체화 시킨다.
    NSNumber *b = [[NSNumber alloc]initWithInt:a];
    5. 넣는다 -ㅅ-;;
    [numberDic[[string integerValue]-1] setObject:b forKey:@"appearanceCount"];

    C++의 경우 한줄이면 끝나는걸 무려 5줄씩이나 써야 하네요 ㅠ ㅠ

    질문 1. 이렇게 하는거 맞나요 ..? ㄷㄷㄷ 한두줄에 깔끔하게 끝나는 메소드가 따로 있는지 모르겠네요 ... ㅠ ㅠ

    질문 2. 선언부에서 NSMutableDictionary *numberDic[45];
    이런식으로 배열을 잡았습니다..
    에러도 안나고 워닝도 없고.... 제가 원하는 작업을 잘 수행하는데 이런식으로 써도 무방한가요 .. ?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.04.25 16:13 신고  댓글주소  수정/삭제

      1. 네, 맞습니다...^^ 숫자를 객체화 시켜 사용을 할 때 불편함이 있지요..^^ 그래서 때에 따라 구조체를 사용하는 방법도 좋은 방법이라고 생각합니다! 각 언어마다의 특징이라고 이해하면 편할듯 하기도 하네요..ㅎㅎ 어떤 언어에서는 이런점이 편하고 이런점이 불편하고 그런것이 있으니까요 ㅎ
      위에서 말씀하신 점은 딕셔너리 보다는 NSNumber의 특성 때문이라고 보시면 될 듯합니다^^~

      2. 사용하신 방법은 딕셔너리 포인터를 C스타일의 배열로 선언하셔서 사용한 것입니다.
      물론 그렇게 사용하셔도 전혀 지장은 없습니다. 포인터 하나하나마다 딕셔너리를 할당하고 초기화 하셔서 사용하시면 됩니다. NSMutableArray를 사용해도 좋지만, 아마 사용하신 방법이 속도는 조금 더 빠를거예요~^^*
      NSMutableArray를 사용하시면 객체 추가 삭제가 훨씬 더 쉽기 때문에 추가 삭제가 필요하다고 하면 이 방법이 더 좋다고 볼 수 있구요... 뭐 다양한 메소드를 이용해서 필요한 기능을 쓸 수 있기 때문에 적절히 판단하셔서 사용하시면 되겠습니다~

      충분히 적절한 답변이 되었는지는 모르겠습니다만, 짧은 지식으로 말씀드렸습니다^^;

      더 부족한 점 있으면 말씀해 주세요~!

      비가 많이 오네요. 동동주에 파전이 땡기는 날입니다 ㅎㅎ

    • Favicon of http://soooprmx.com/wp BlogIcon sooop 2013.06.14 09:58  댓글주소  수정/삭제

      Objective-C에서는 리터럴로 좀 더 간단하게, 배열/사전/숫자(NSNumber) 객체를 초기화할 수 있습니다. 리터럴은 쉽게 말하자면 @"acb"와 같이 축약된 문법으로 NSString을 만드는 것처럼 많이 써왔던 거구요.

      NSArray *anArray = @[ @"a", @"b", @"c"]; // 끝에 nil을 넣지 않습니다.
      NSDictionary *aDict = @{ @"key" : @"value", @"key2" : @"value2" } ; // 키:값 의 순서로 씁니다.

      NSNumber *aNum = @(0.5); // [NSNumber NumberWithFloat:0.5f];와 동일

  3. 인절미후후 2012.06.08 11:03  댓글주소  수정/삭제  댓글쓰기

    이거 그동안 어렴풋이 알면서 쓰던건데 이렇게 정리해주시니 너무 감사합니다.
    제가 자바를 조금 공부했었는데 키와값으로 저장하는거니까 자바의 컬렉션 프레임워크로는 List랑 Map같네요
    뮤터블과 디폴트의 차이도 잘 알게 되었습니다.
    항상 보는쪽의 입장을 잘 배려해주시는 레퍼런스 참조하는 부분을 익숙해지도록 자주 보여주시는것도 너무 좋은 점 같네요.
    픽커뷰 보다가 넘어왔어요
    감사합니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.08 13:26 신고  댓글주소  수정/삭제

      인절미후후님
      항상 격려의 말씀 남겨주셔서 제가 힘이 솟습니다.
      정말 고맙습니다^^*
      저도 항상 읽는 입장에서 어떻게 하면 쉽게 다가갈 수 있을까 고민을 합니다만... 쉽지는 않네요^^
      부족한 점은 지적해 주시고 필요한 부분은 꼭 말씀해 주세요. 부탁드립니다 ㅎ
      행복한 주말 보내시길...^^

  4. 중동백곰 2012.06.15 19:12  댓글주소  수정/삭제  댓글쓰기

    잘 보고 있습니다..
    저기 제목에서 NSArray, NSMutableDictionary <== 요거 NSMutableArray 가 아닐까 사료되옵니다..

  5. 네모누리 2012.07.17 11:07  댓글주소  수정/삭제  댓글쓰기

    정말 유용하게 보고 있습니다.
    더 이상 강의 안 올라오나요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.07.17 23:58 신고  댓글주소  수정/삭제

      네모누리님~
      관심 정말 고맙습니다 :-)
      요즘 제가 진행중인 프로젝트로 인해서 포스팅을 못하고 있는데 월말쯤 되면 다시 재개할 수 있을 것 같네요 ㅠ_ㅠ
      원하는 부분 있으시면 말씀해 주세요. 틈틈히 준비하도록 하겠습니다~!

  6. 나에게넌 2012.08.13 15:19  댓글주소  수정/삭제  댓글쓰기

    NSNotification 강의 보다가 중간에..링크 타고 발도장 찍습니다..꾸욱

  7. 첼로와짜짜 2012.11.27 14:42  댓글주소  수정/삭제  댓글쓰기

    다 읽었다ㅎㅎㅎㅎ 정말 도움 많이되었습니다. 감사합니다. 또 업데이트되면 들릴께요. 건강하세요.

  8. 2012.12.09 01:55  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.12.09 12:15 신고  댓글주소  수정/삭제

      이건 C 코드이고, 무엇을 도와달라는 말씀이신지 잘 모르겠네요;;;
      오브젝티브C는 C코드드를 그대로 사용 가능합니다

  9. 무민 2013.01.18 12:13  댓글주소  수정/삭제  댓글쓰기

    설명을 간단명료하게 잘해주셨어요. NSArray, NSDictionary... 다른곳에서 강좌를 봤지만 잘 이해가 안갔었는데 이곳에서 이해하고 갑니다. 고맙습니다.

  10. Favicon of http://www.facebook.com/younhak.kim.9 BlogIcon 꺼북대장 2013.01.28 00:58  댓글주소  수정/삭제  댓글쓰기

    딕셔너리에대해 보다 자세히 배우고 갑니다.
    ~감사합니다.
    새로운 강좌가 기다려집니다 ㅎㅎ

  11. 2013.02.19 21:37  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  12. 여의도 2013.02.20 02:25  댓글주소  수정/삭제  댓글쓰기

    답변 주셔서 감사드립니다. 말씀하신 대로 해보도록 하겠습니다. 당장해보고 싶지만,, 헐,,, 벌써 2시가 넘었네요.... 편히 쉬시구요~~

  13. 2013.02.20 12:57  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.02.20 14:16 신고  댓글주소  수정/삭제

      T_T 죄송합니다...ㅠ

      제가 지금 병상이라 맥을 사용하기가 어렵습니다...

      몸이 정상이 아니라 코드를 보기가 좀 힘들어요 ㅠ 힘들게 올려주신건데 정말 죄송합니다...ㅠ

  14. 여의도 2013.02.20 14:49  댓글주소  수정/삭제  댓글쓰기

    몸도 안좋으신데 실례가 많았습니다. 쾌차하시길 기원해 드려요,,
    질문드린 내용은 나름 해결해보고 좋은 소식 전해드리겠습니다.
    그럼 또 뵙겠습니다. 꾸벅..

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.02.20 15:19 신고  댓글주소  수정/삭제

      아닙니다..ㅠ
      오히려 제가 도움을 드리지 못해 죄송스러울 따름입니다 ㅠㅠ
      핵심 부분을 메일로 한 번 보내봐 주세요, 다시 한 번 보도록 할게요.
      yagomsoft@gmail.com

  15. 여의도 2013.02.20 17:32  댓글주소  수정/삭제  댓글쓰기

    염치불구하고 메일 보내드렸습니다. ^^

  16. 여의도 2013.02.20 21:54  댓글주소  수정/삭제  댓글쓰기

    명쾌하게 해결해 주셔서 감사드립니다!!
    다음에 또 부탁드릴것 같은데요? ....
    편히 쉬시구요!!

  17. 여의도 2013.02.21 16:43  댓글주소  수정/삭제  댓글쓰기

    메일에 이어서~~~~ ㅎㅎㅎ

    네,, 그렇군요,,,
    그럼, reloaddata를 사용하면 앱이 알아서 데이터를 계속 갱신해서
    화면에 뿌려주는 건가요? (그럼 좋겠네요,,, 당겨서 새로고침 이런거 구현안해도 되니... )
    아니면 앱이 실행되고 한번만 reloaddata가 되는 것인지요?
    ㅎㅎㅎ

    질문은 끝이 없네요...

    아, 생각난김에 당겨서 새로고침 커리큘럼은 어떠세요?
    굉장히 복잡한거 같더라구요..

    수고하시구요~~~~

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.02.21 19:13 신고  댓글주소  수정/삭제

      :)
      reload를 호출할 때 마다 갱신합니다.
      자동갱신은 하지 않구요...^^;
      지금은 몸이 좋지 않아서 당분간은 추가 연재 계획이 없습니다 ...ㅠ
      한 두 번 도큐먼트 관련해서 포스팅이 진행될지도 모르겠지만... 그 이상은 아직 계획이 없습니다 ㅠㅠ 죄송해요..

  18. Favicon of http://blog.naver.com/yunzeman BlogIcon 사운드오션 2013.02.22 10:42  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 저희는 온라인_모바일 게임 음원 및 효과음 제작 업체입니다. 저희도 블로그를 운영하는데 yagom님의 심도있는 강좌를 저희 블로그에도 게시 할 수 있을까 해서 문의드립니다.
    아울러 저희가 게시하는 사운드 게시물도 yagom님께서 퍼오셔서 서로 어플 개발자분들께
    좀 더 다양한 정보와 도움을 주고자 합니다. yagom님과 저희가 서로 winwin 할 수 있는 전략적
    파트너가 될 수 있을것 같습니다. 혹 어떠신지 답변 부탁드립니다. ^^ RSS 열린 이웃으로 추가하였습니다.

  19. Favicon of http://sharphail.tistory.com BlogIcon 샤해 2013.03.19 11:32  댓글주소  수정/삭제  댓글쓰기

    덕분에 개념을 확실히 잡을수 있었네요 ㅎㅎ
    다른분들의 comment들도 도움이 되었습니다.
    감사한 마음과 함께 링크좀 담아갈게요 '-'



오늘의 주제

1. 오버라이딩(재정의)

열 번째 시간입니다.^^

상속의 개념에 대해서는 조금 잡히셨나요?
아직 잘 모르시겠다면 

2012/03/28 - [Objective-C] - Objective C <9>. 상속(1)

요기서 다시 한 번!


자 그럼 오늘은 상속에 대해서 조금만 더 알아봅시다 ㅎ
스따뚜~~~~~~~~~~~~


# 오버라이딩(재정의)?

오버라이딩 : 재정의

오버라이딩이 뭘까요?

지난번에 상속에 대해서 이야기 할 때, 자식은 부모에게 물려받은 것들을 필요에 의해 부분적으로 바꿔 쓸 수 있다고 했던 것 기억하시나요?

바로 그것을 말합니다.

메소드를 부모가 물려준 그대로 사용할 수도 있지만, 자신의 목적에 맞게 재정의해서 사용할 수 있습니다. 즉, 같은 이름의 메소드를 물려받은 녀석에서 덮어씌울 수 있단 말이죠~

너무 말이 어려운가요?

직접 해봅시다..ㅎ

지난번에 사용했던 자식클래스의 선언부로 와서 부모클래스와 동일한 이름의 메소드를 선언해 줍니다. 코멘트 설명 보세요 ㅎ

그리고 구현을 해줍니다~

자, 이제 메인으로 와서 메소드들을 호출해 봅니다~  역시나 설명은 코멘트로^^

요런 결과가 나옵니다~ 

아까 위에서 말씀드린 것 보고 예상하셨나요?ㅎ

자, 이렇게 상속에 대해서 간단히 알아보았습니다~

다음엔 뭘 해볼까나요 ㅎㅎ



by yagom

twitter : @yagomsoft

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 사랑합니다~ ↓↓↓ 


Posted by yagom

댓글을 달아 주세요

  1. Favicon of http://mnworld.co.kr BlogIcon shakej 2012.05.07 09:24  댓글주소  수정/삭제  댓글쓰기

    잘보고 갑니다 ^^
    문서는 앱스토어에서 "dash"라는 무료 앱으로 쉽게 찾을 수가 있더라구요 ㅎㅎ
    혹여나 참고하시면 좋을 것 같아 남겨봅니다~

  2. menet 2012.06.08 20:00  댓글주소  수정/삭제  댓글쓰기

    자바 처음 공부한사람한텐 저 코드 보기가 넘 힘드네요. -(void)메소드명 이게 뭔 코드인지,, 글씨체도 그렇고 첨보면 뭐지 모르겠네요

  3. 첼로와짜짜 2012.11.26 18:52  댓글주소  수정/삭제  댓글쓰기

    잘봤습니다 근데 그림 클릭되게 좀 해주세여 T^T

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.26 18:57 신고  댓글주소  수정/삭제

      제가 저 글을 쓸적에 티스토리에서 버그때매 클릭이 안되게 처리가 되었어요ㅠㅠ 몇 개 글이 그래요... 제가 수정하려 해봤는데 클릭되게 수정이 안되더라구요...ㅠ

  4. kangsu 2013.01.21 20:45  댓글주소  수정/삭제  댓글쓰기

    혹시 오프라인이나 온라인 강좌는 안하시나요??정말 잘보고있습니다.선생님으로 활동하시면 꼭 직접 배워보고 싶네요



오늘의 주제

1. 상속의 개념 


아홉번째 시간입니다.^^

Objective-C는 정말 오랜만이네요..^^

초코찌찌님의 요청으로 새로운 개념을 하나 가지고 왔습니다~

지난 번에는 메소드에 대해 알아보았습니다~
이번에는 클래스의 상속에 대해 알아보도록 합니다.^^

이 포스팅은 지난 

2012/01/30 - [Objective-C] - Objective C <5>. 클래스와 객체(인스턴스)<1>

2012/02/05 - [Objective-C] - Objective C <6>. 클래스와 객체(인스턴스)<2>

이 두개의 포스팅 지식을 필요로 합니다~

다 알고 계신가요?ㅎ

그렇다면 고고고고고고고고~~~~~~무비무비무비~~~~~~


# 상속이란?

상속이란 무엇일까요?

저는 쉽게 한마디로 말하면, 클래스의 확장 이라고 표현하고 싶네요.

즉, 이미 만들어져 있는 클래스에서 내가 원하는 부분을 추가하거나 변경하여 새로운 클래스를 생성할 수 있습니다.
 
하지만 여기에도 규칙이 있기 마련이죠..^^

상속에서는 부모클래스와 자식 클래스라는 개념을 가지고 말을 합니다.

자식 클래스는 부모 클래스를 상속 받는다고 표현합니다.

상속 받는다는 것은 원래 클래스에 추가나 변경을 한다고 말씀드렸죠?

그렇다면 부모클래스와 자식 클래스 중에 더 확장된 클래스는 무엇일까요?

네, 바로 자식 클래스이죠~

부모클래스 보다 자식 클래스가 더 덩치가 크다 이말입니다^^ (사실 그렇지 않을 수도 있습니다만, 개념상 편하게 이렇다고 합시다 ㅎ)

그림에서 보다시피 부모가 자식에게 자신의 대부분의 것을 물려줍니다.


자식은 물려받은 그것들에서 마음에 들지 않는 것이 있으면 바꾸기도 하고, 더 필요한 것이 있으면 추가하기도 합니다.

자 대충 감이 오시나요?

상속을 받게되면 부모 클래스의 헤더에 선언된 메소드와 변수가 자식에게 상속됩니다.
물론 모두 상속되는 건 아닙니다. 부모클래스에서 상속해주지 않겠다고 선언해 준 녀석이 있다면 그 녀석들은 상속되지 않습니다.

그럼 실질적으로 상속이 어떻게 되는지 한 번 볼까요?

아래 그림을 보면, 우리가 만들었던 클래스 입니다.
이 클래스를 만들때 대화상자에서 Sub class of... NSObject라고 했던 것 기억하시려나 모르겠습니다^^
지금 MyFirstClass.h 헤더파일을 보게되면 MyFirstClass는 NSObject를 상속받았음이 명시되어 있습니다.
그렇습니다. 모든 Objective-C의 class들은 기본적 NSObject를 상속받고 있습니다.
아래 그림처럼 직접적으로 받던지, 아니면 우리가 다음에 새로 만들어볼 MyFirstClass의 자식클래스처럼 다른 클래스를 거쳐 상속을 받던지간에 어찌되었든 상속을 받습니다.

자, 그럼 이 NSObject라는 녀석을 한 번 살표볼까요?

NSObject 에서 오른쪽 버튼 클릭을 하여 Jump to Definition로 향합니다^^

그러면 Foundation framework에 포함된 NSObject.h 파일에서 NSObject의 선언부를 볼 수 있습니다.

NSObject에 이런저런 많은 메소드들이 선언되어있네요^^

우리가 어떤 인스턴스를 만들어 줄 때, alloc , init 해줬던 것을 기억하시나요?ㅎ

고녀석들 요기있네요~~~~~~~~~ㅎㅎㅎ 말씀드렸듯이 모든 클래스들은 NSObject를 상속받기 때문에 어디서든지 alloc, init을 할 수 있는 것입니다.


# 상속 실습해보기

자, 대충 개념은 잡았겠다, 실습 한 번 들어가 봅시다 ㅎ

새로운 클래스를 만들기 위하여 New File... 합니다!


Cocoa의 Objective-C class를 선택해 주시고 Next~

자, 그 후에 여기서!! Subclass of MyFirstClass를 해 주는 겁니다!!

MyFirstClass를 상속 받겠다는 의미가 되겠습니다!!

그 후에 클래스명을 FirstChildClass로 합니다.

FirstChildClass.h로 이동해 봅니다.

MyFirstClass를 상속하고 있다고 명기되어 있습니다. 정말 딱 이거 하나 있는데 이 클래스에서 어떤일이 벌어졌을까요?ㅎㅎㅎ

심지어 구현부도 텅텅 비어있는 멍텅구리 같아 보입니다 ㅎㅎㅎ

자, 하지만 우리는 상속받고 있다는 것을 알기 때문에, 무작정 뭔가를 시도해 봅시다~

열시미 타이핑타이핑 ~_~ 자세한 소스 설명은 주석에 담겨있지요?ㅎ

짜잔~~~~~~~ 실행 결과입니다.

분명히 자식클래스는 속이 텅텅 비어있는 녀석 같아보였는데, 부모클래스에서 이미 만들어져 있는 메소드와 변수를 사용할 수 있었습니다.

캬~ 우리 모두 정말 부모님께 감사해야 합니다...ㅋㅋ


여하간 이것으로 상속에 대한 개념을 좀 알아봤습니다. 횡설수설이라 이해가 잘 되실지는 모르겠네요ㅠ_ㅠ

혹여나 이해가 되지 않는 부분 또는 잘못된 점이 있다면 댓글 부탁드립니다~^^

그럼 뿅!!!!!!!!!!!!!


by yagom

twitter : @yagomsoft

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓ 


Posted by yagom

댓글을 달아 주세요

  1. Favicon of https://winplz.tistory.com BlogIcon 윈플. 2012.03.28 15:17 신고  댓글주소  수정/삭제  댓글쓰기

    쉽게 잘 설명하셨군요.
    아마 (2)에서는 overriding에 대해서 다루 실 것 같군요?

    나중에 기회가 되신다면
    @property 를 하게 될 때 사용되는 retain, strong, weak 등에 대해서 정리한번 해주시면 좋을 것 같습니다
    생각보다 이유도 모르고 사용하는 사람이 많더라고요

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.03.28 17:24 신고  댓글주소  수정/삭제

      와우~ 역시 고수님은 눈치가 빠르십니다..ㅎㅎ
      들켜버렸네요+_+ㅋ
      흠...
      @property에 관한 설명은 아직 후일로 생각중이었는데, 고려해 보겠습니다.^^*
      사실 이번에 iOS 5.0에서 키워드들과 역할들이 변화되면서 조금 조심스럽습니다~ㅎ

  2. hyung 2012.11.19 13:18  댓글주소  수정/삭제  댓글쓰기

    와.. 야곰님 책하나 내심이 어떠신가요..
    솔직히 오늘 아침에 야곰님이 기초부터 다시 해보라고 하셔서
    어느세월에 그걸 하나.. 프로젝트 빨리 못하면 주임한테 혼나는데
    이러고 있다가
    그래도 속는셈치고 아침부터 계속 개념만 보다가

    딱 이 글 봤는데

    상속? 뭐지 그게.. 이러다가 뭔가 이거다!! 라는 삘이 와서 해보니
    제가 저번주부터 야곰님을 달달 볶던 그 문제가 해결 됬어요 ㅠㅠㅠ 너무 잘되요 ㅠㅠㅠㅠㅠㅠㅠ 아 행복해 ㅠㅠㅠ
    이래서 뭐든 기본이 없으면 안되는 거구나 싶더라구요
    히히힛 아무튼 너무너무 감사 드립니다.
    지금 완전행복함
    비행기타고 한국 돌아가서 식사라도 사드리고 싶은 심정임 ㅠㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.19 15:39 신고  댓글주소  수정/삭제

      ^^~ 저는 거짓말 하지 않습니다...ㅎㅎ
      기초를 쌓는 것이 가장 빠른 지름길입니다!
      앞으로 iOS 뿐만 아니라 어떤 프로젝트를 하더라도 꼭 잊지 않으셨으면 좋겠네요 ㅎ 아무리 바쁘고 촉박해도 정도를 걷는 것보다 빠른 지름길은 없다는 것을 ^^

      p.s 밥은 지금보다 훨씬 저에게 고마움을 느끼게 되는 순간이 오면 그 때 사주러 와주세요...ㅎㅎㅎ 1년이고 10년이고 20년이고 진심으로 기다리겠습니다 :)

  3. hyung 2012.11.19 16:35  댓글주소  수정/삭제  댓글쓰기

    정말 감사합니다 블로그 돌아보니 저만 이렇게 감사를 느끼는게 아닌거 같네요
    전 아직 어려서 잘 모르겠지만, 일도 하시면서 이렇게 틈틈이 관리 하시기도 정말 너무 힘드실거 같아요
    저같은 배우는 입장의 사람은 감사할 따름 입니다

    그나저나 산넘어 산이라고 저녀석 해결 했더니 또 다른녀석이 말썽이네요 ㅋㅋ..
    정말.. 하나하나 기능이 붙으면 재밌지만 그걸 붙이기가 정말 힘드네요^^..;;
    아무튼 힘내서 꼭 완성시키겠습니닷!~

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.19 17:05 신고  댓글주소  수정/삭제

      네,^^* 힘내시고 꼭 원하는 바를 이루시길 바랍니다!
      또 궁금한 것 있으면 언제든 말씀하세요 :)
      p.s. 제가 아마(아니... 확실히?) 동생일 것 같다는 생각이...ㅋㅋㅋ

  4. 첼로와짜짜 2012.11.26 18:48  댓글주소  수정/삭제  댓글쓰기

    잘봤습니다. 근데 상속부터 예제 클릭이 안되네요. 작아서 글씨가 잘 안보이네요 T^T

  5. formathead 2014.03.18 11:11  댓글주소  수정/삭제  댓글쓰기

    열심히 공부하고 있습니다. 너무 초보라 어디서 부터 시작해야 할지 막막했던차에 도움이 많이 되고 있습니다.

  6. 2017.08.24 16:56  댓글주소  수정/삭제  댓글쓰기

    죄송한데........
    이미지 크게 보기가 안되서.... 캡쳐부분을 하나도 모르겠어여...ㅠㅠㅠㅠㅠㅠㅠ


오늘의 주제

1. Delegate 
2. Data Source



열 여덟번째 시간입니다.^^

지난 번에는 맵뷰를 간단히 만들어 보았습니다~
정말 더 필요한거 없어요?
아무도 댓글도 반응도 추천도 없습니다...
저 블로그 접을까봐요...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

이번에는 중요한 개념중에 하나인 Delegate와 Data Source에 대하여 알아보도록 하겠습니다~

중요한 개념이므로 이해 될 때 까지~!
스따뚜~~~~~~~~~~~~


# Delegate???

Delegate. 델리게이트.
우리말로 번역하면 대리자 정도로 해석할 수 있겠네요.

말 그대로 Delegate는 누군가가 해야 할일을 대신 해주는 녀석이라고 생각하시면 됩니다. 조력자가 되겠지요.

말로만 이렇게 설명하면 잘 감이 안오시죠?

간단히 그림으로 알아봅시다.

지난 번에 만들어 보았던 맵뷰입니다.ㅋ
맵뷰는 뷰 컨트롤러 위에 올라가 있는 상태였죠~


그런데 맵뷰가 동작하는 동안 뭔가 자신이 하기 벅찬 일들을 누군가 해줬으면 합니다.
그럴때 누군가에게 자신의 상태를 파악해서 적절한 일을 해주기를 원할때 델리게이트 선언을 해 줍니다.

바로 이렇게 말이죠~


그러면 델리게이트로 선언된 객체는 자신을 델리게이트로 임명한 객체가 어떤일을 도와달라고 하면 지정된 메소드를 통하여 알아서 척척척 스스로 어린이처럼 처리해 주는겁니다 ㅎㅎㅎ
사실 이렇게 말로만 설명하면 잘 감이 안와요~_~

# Data Source???

또한, 데이터 소스라는 것은 말그대로 데이터의 근원, 원천 뭐 이런뜻인데요~
어떤 객체가 누군가의 데이터 소스로 선언이 되면 선언한 객체가 데이터를 필요로 할 때 지정된 메소드를 통하여 데이터를 넘겨주는 역할을 합니다.

바로 이렇게 되는 시츄에이션 입니다.


이렇게 개념설명만으로는 잘 모르시겠다구요?ㅎ

그럼 다음번에는 간단한 실습을 통해서 알아보도록 할게요~

I'll be back!

커밍 쑨~!

by yagom

twitter : @yagomsoft

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓ 

Posted by yagom

댓글을 달아 주세요

  1. chan 2012.03.30 10:50  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다~~

    다음예제 빨리 볼수 있으면 좋겠네요~~ㅎㅎ

  2. 궁금 2012.03.30 16:25  댓글주소  수정/삭제  댓글쓰기

    UIviewcontrooler 클래스를 만들고 , 그 클래스의 .h 파일에 아웃렛을 정의하면(예를들어서 texte) .xib에서 First owner로 연결하면
    예전에는 texte 로 보였던거 같은데 이제는 delegate로 보여요, 이거 왜 이러는지 아시나요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.03.31 01:17 신고  댓글주소  수정/삭제

      흐음..
      UIViewController를 상속받은 클래스에 IBOutlet으로 texte를 변수로 선언해 준 후에 xib파일에서 연결할 때를 말씀하시는 건가요?
      File's Owner로 부터 출발하여 연결대상(texte)로 연결할 때 그렇게 나온다는 것은 조금 이해하기 어렵네요^^;
      혹시 반대로 끌어 오신것은 아닌지요..?
      좀 더 자세한 설명이 필요하네요^^;

  3. 인절미후후 2012.04.05 15:15  댓글주소  수정/삭제  댓글쓰기

    강좌 항상 잘 읽고 있습니다.
    여러번 더 봐야겠어요.
    아이폰 강좌는 xcode업데이트 때마다 달라지는 인터페이스 덕분에 이전 버전의 강좌로는
    초심자들에게 벽에 막히는게 많습니다.
    최신 자료를 가지고 강좌해주는 점만으로도 큰 감사함을 느끼는 바입니다. ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.04.05 16:27 신고  댓글주소  수정/삭제

      아이쿠..^^
      다른 분들도 그때는 최신이셨을 텐데..ㅎㅎ
      강좌라고 하기도 부끄러운 수준입니다^^;
      더욱 분발해 보도록 하겠습니다~!
      댓글 감사드립니다~!
      필요한 것 있으시면 말씀해 주세요~

  4. Potomac 2012.04.13 04:49  댓글주소  수정/삭제  댓글쓰기

    그냥 눈팅만 하고 있었는데 필요한걸 말하라는 바람에 용기를 내어 적어요.

    버튼에 아이폰에 저장된 사진이나 그림을 불러와서 그 사진이나 그림으로 버튼을 계속 사용하고 싶은데요.
    사진을 이동시켜서 버튼에 적당한 부분이 표시되면 더 좋겠구요.
    물론 버튼의 위치와 크기는 그대로 유지하고 싶어요.

    궁금한건 많지만 다음에 또 물어보려구요.

    감사합니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.04.13 09:25 신고  댓글주소  수정/삭제

      ^^ 덧글 주셔서 고맙습니다.
      일단 이미지를 버튼이나 뷰로 불러오는 것에 대해서 조만간 포스팅 할게요~
      그런데 버튼 안에서 이미지를 원하는대로 움직이는 것은 조금 어려운 튜토리얼이 될 것 같네요..^^
      여기 블로그의 초급 수준을 조금 벗어나는 것이라, 일단 버튼에 사진을 불러오는 방법에 대해서는 먼저 포스팅 해 보도록 하겠습니다. 만약에 추후에 필요하시다면 요청하시면 예제 알려드리도록 할게요^^

  5. Potomac 2012.04.14 03:06  댓글주소  수정/삭제  댓글쓰기

    이렇게 바로 답장을 받는건 처음인것 같아요.
    개발자가 자기 사진을 넣는것 말고 아이폰 사용자가 자기 사진이나 그림을 넣는게 궁금해요.
    고마워요!

  6. Plateblack 2012.05.14 14:52  댓글주소  수정/삭제  댓글쓰기

    야곰님 강좌를 보며 Xcode로 프로그래밍을 하는데 푹 빠져있는 1인입니다^-^
    궁금한건 정말 많지만 하나만 꼽으라면... 음~
    아이폰과 데이터베이스를 연동해서 게시판을 만들어보는게 정말 궁금해요!
    웹서버 관련 지식이 너무 부족해서 어디서부터 손을 대야할지 막막하기만 하네요ㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.05.14 15:39 신고  댓글주소  수정/삭제

      ㅎㅎ.. 그정도는 지금까지 배운거로는 아직 어림없어요...ㅎ
      그래서 차근차근 해보려고 합니다~
      조금은 시간이 걸릴 것 같아요~
      물론 많은 분들이 그 부분 정말 하고 싶어 하시는 것 알고 저도 처음에 많이 하고 싶었으니까요~
      하지만... 걷기도 전에 뛸 수는 없잖아요 ㅎ
      차근차근 같이 가보도록해요~

  7. NewBie 2012.05.23 15:12  댓글주소  수정/삭제  댓글쓰기


    이 내용은 이제 슬슬 서버와 연동이 되는 부분을 가르쳐주시려고 하시는건가요? +_+ 기대가 되네요 ㅎㅎ

  8. SODA 2012.06.29 10:28  댓글주소  수정/삭제  댓글쓰기

    열혈독자입니다. 덕분에 좋은 정보 알찬 정보 많이 습득하고 있습니다.

    감사합니다.^___________^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.29 11:19 신고  댓글주소  수정/삭제

      안녕하세요 SODA님~!
      오랜만에 덧글로 뵙네요 :-)
      자주자주 들러주시고 불같은 덧글 부탁드립니다 ㅎㅎ
      좋은 주말 보내시길...:-)

  9. 딴또 2013.03.11 14:53  댓글주소  수정/삭제  댓글쓰기

    정말 열심히 강의 보고 있습니다. 힘내십시오. 열심히 응원합니다.

  10. 나리 2013.05.02 09:43  댓글주소  수정/삭제  댓글쓰기

    쉽게 강의해주셔서 감사합니다^^
    많은 도움 되고 있어요!

  11. Favicon of https://pgspace.tistory.com BlogIcon 찌열남 2013.12.19 13:10 신고  댓글주소  수정/삭제  댓글쓰기

    처음으로 댓글 남깁니다.
    손가락물론 눌렀습니다 ㅎㅎㅎ
    잘보고 갑니다~

  12. 최현진 2016.05.13 09:49  댓글주소  수정/삭제  댓글쓰기

    항상 잘 보고 있습니다 ^^

  13. 진아 2016.05.25 01:08  댓글주소  수정/삭제  댓글쓰기

    늘 눈으로만 보고 갔었는데 오늘은 댓글을 남겨봅니다. 친절하고 자세한 설명이 큰 도움이 된답니다!!
    야곰 블로그 화이팅 입니당!!


오늘의 주제

1. 메소드 선언하고 구현하기 
2. 메소드 인자 전달하기 

3. 반환값(return값)에 대해 알기 



여덟번째 시간입니다.^^
정말 오랜만의 포스팅입니다...ㅋ
오늘은 제 동생의 생일이랍니다!!!
뭐... 그렇다구요 ㅋㅋㅋㅋㅋㅋ

지난 번에는 이름짓기에 대해 조금 알아보았습니다.
처음부터 이름을 잘 짓는 습관이 필요합니다.
귀찮다고 a, b, c 이런식으로 이름 지어놓으면 같이 일하는 동료는 물론 자신 스스로도 하루만 지나도 코드를 읽을 수 없습니다...ㅋㅋ

자 그럼 잔소리 생략하고 설명 들어갑니다~

참..! 이거 보시기 전에 지난 포스트 2012/02/05 - [Objective-C] - Objective C <6>. 클래스와 객체(인스턴스)<2> 를 보고오시기를 추천드립니다^^
스따뚜~~~~~~~~~~~~


# 메소드의 모든 것

지난번에 쓰던 FirstProject를 계속 사용하도록 하겠습니다.
물론 없으신 분들은 매우 간단하므로 클래스 하나만 만들어 주시고 네모 박스 친 코드들만 다시 작성하셔도 무방합니다^^.
MyFirstClass에 인스턴스 메소드 세개를 만들어 줍니다.


자 이렇게 선언을 하는 것입니다.
 -(NSInteger) addTwoIntegerWithFirstInt:(NSInteger)firstInteger secondInt:(NSInteger)secondInteger;
메소드 기준으로 설명하겠습니다.

메소드 맨 앞의 - 는 이것이 인스턴스 메소드 라는 것을 말해주는 것입니다.
처음 괄호 안의 자료형은 이 메소드의 반환값(리턴값)의 자료형을 의미합니다. 이 메소드의 반환값은 NSInteger 자료형을 가지고 있군요. 자세한 설명은 아래에서 하겠습니다.
그 다음에 오는 것은 이 메소드의 이름입니다. 이 메소드의 이름은 addTwoIntegerWithFirstInt 입니다. 정확히 말하자면 addTwoIntegerWithFirstInt: secondInt: 입니다.
그리고 땡땡이 뒤에 오는 녀석들은 이 메소드에 들어가는 인자의 자료형과 이름을 뜻합니다. NSInteger자료형을 갖는 firstInteger와 secondInteger라는 이름을 가진 두 개의 인자가 전달되어 들어오네요. 이 역시 자세한 설명은 요 아래.

자, 그럼 반환값과 인자가 무엇이냐?

우리가 밥을 먹는다고 생각해 봅시다. 밥도 먹고 국도 먹고 반찬도 먹습니다. 이것을 인자라고 생각합니다.
그리고 우리는 뱃속의 여러 장기들에서 이 음식들을 소화하고 분해하고 찌꺼기는 분류해서 대변(똥ㅋㅋㅋㅋㅋㅋㅋㅋㅋ)으로 변환하여 배출합니다.

조금 감이 오시나요?
메소드는 어떤 특정한 일을 하는 마술상자 같다고 표현합니다.
여러 인자들을 받아들여서 이것을 메소드 고유의 특정한 방법을 거치고 가공하여 다시 뱉어냅니다. 이것이 메소드의 역할입니다.

그래서 받아들이는 값들을 인자값, 그리고 뱉어내는 값들이 반환값입니다.

하지만, 사람과는 약간 다르게 메소드라는 녀석은 먹지 않고도 뱉어낼 수 있고, 먹어도 뱉어내지 않을 수도 있습니다.
인자값이 없는 메소드도 있고, 리턴값이 없는 메소드도 있다는 말이죠..^^
또, 먹지도 뱉지도 않는 메소드들도 있습니다.

먹는게 없는 메소드는 인자가 없구요, 뱉는게 없는 메소드는 반환값 자료형의 종류가 void로 표기되어 있습니다.

이런 저런 메소드들을 보다보면 자연스레 알게되실거예요~

자, 그럼 본격적으로 메소드 구현을 해 봅시다.
헤더에서 정의해준 모양을 따와서 구현파일(.m)에서 구현합니다~


어...? 근데 이렇게만 해놓으니 왼쪽에 노란 삼각형 알림이 뜹니다.
눌러보면 이 메소드는 반환값이 있어야 한다고 친절히도 알려줍니다.
그렇습니다. 반환값이 명시된 메소드는 꼭 반환(똥을 싸야...)한다는 뜻입니다~ㅋㅋ
하지만 맨 아래 printFoo라는 메소드는 먹지도 뱉지도 않는 녀석이기 때문에 알림이 뜨지 않네요~^^

그럼 이쁘게 메소드를 구현해 볼까요?
자세한 설명은 주석에 있으니 잘 읽어보세요^^



자 클래스에 메소드를 구현했으니 이제 main에서 써봅시다~
자세한 설명은 주석에 써져 있습니다..^^


짠~ 결과화면 입니다.


여러분들의 예상과 맞았나요?
맨 마지막의 printFoo 메소드는, 제가 귀찮거나 깜빡했거나 해서 해보지 않은 것이 아니라 여러분들을 위해 남겨 놓았습니다.ㅋㅋㅋ
(양심이 있다면 이런소리 못하지..ㅋㅋㅋㅋㅋㅋㅋㅋㅋ)

여튼, 한 번 printFoo 메소드도 호출하여 결과를 보시기 바랍니다~

이상 메소드에 대해서 알아봤습니다~!

또 뭘 하면 좋을까요?ㅎㅎ



by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   

↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓
Posted by yagom

댓글을 달아 주세요

  1. 초코찌찌 2012.03.25 16:37  댓글주소  수정/삭제  댓글쓰기

    다음 강좌는 없나요 ? ㅠㅠ

    상속과 관련된 부분이라던지..오버로딩이라던지... 예외처리라던지 ..

    다른 사이트는 봐도 뭔말인지 모르겠던데 여기 블로그는 쉽게 설명해줘서 머리에 쏙쏙 들어오네요

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.03.26 09:26 신고  댓글주소  수정/삭제

      Objective-C에 대한 내용을 요즘 못하고 있었네요~ㅠ_ㅠ

      필요하신 부분 최대한 빨리 준비하도록 하겠습니다~!

      좋은 댓글 정말 감사드립니다!

      먼저 필요하신 부분이 있다면 상세히 말씀해 주세요~

      부족한 부분이 있다면 말씀도 해 주시구요..ㅎㅎ

      괜찮다 싶으시면 다른곳이나 다른사람들에게 소개도 해주세요ㅋㅋㅋㅋㅋ

      그리고 강좌라고 말씀해 주시니 부끄럽습니다..^^;

      저는 제 포스팅을 감히 강좌라고 생각해 본적이 없어요..ㅋ

      그냥 지식을 공유하며 같이 공부 할 뿐이죠^^

      도움이 되신다면 그것만으로 행복합니다~

      감사합니다^^

  2. GuruKuru 2012.04.16 12:32  댓글주소  수정/삭제  댓글쓰기

    잘보고있습니다! ^^

  3. 네모누리 2012.07.17 10:52  댓글주소  수정/삭제  댓글쓰기

    유용한 강의 감사합니다
    많은 도움이 되고 있어요

  4. poku 2012.08.23 15:34  댓글주소  수정/삭제  댓글쓰기

    잘보았습니다.. 똥이 조금 거슬렸지만..ㅎㅎ;

    근데 리턴값이 2개 이상인 경우는 어떻게 선어해야 하나요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.08.23 16:44 신고  댓글주소  수정/삭제

      안녕하세요 poku님~!
      찾아주셔서 고맙습니다 ㅎ

      리턴값은 1개 밖에 돌려줄 수 없습니다.

      그래서 NSDictionary등의 객체를 사용하여 여러 정보들을 묶어서 반환해 줄 수 있죠.
      아니면 C스타일로 포인터를 사용하여 인자를 넘겨서 값을 변경해 줄 수 있습니다.

      설명이 너무 어렵죠...ㅎㅎㅎ
      계속 보다가 NSDictionary쪽 포스팅을 보면 좀 더 감이 오실지도 모르겠네요^^;

  5. chosamong 2012.08.25 17:01  댓글주소  수정/삭제  댓글쓰기

    보면 볼수록 갈길이 멀구나 하는 생각이 드니.... OTL

    따라가다 보면 좀 감 잡힐 날이 오겠죠 ??

    감사 인사 꾸벅<(__)>

  6. hyung 2012.11.19 13:03  댓글주소  수정/삭제  댓글쓰기

    우호우호.. 이런식으로 쓰는 거였군요 ㅠㅠ

  7. 첼로와짜짜 2012.11.26 18:25  댓글주소  수정/삭제  댓글쓰기

    아니 어떻게 비싼 돈 주고 산 책보다 이게 더 잘 이해가되죠? 왜죠?

    진짜 책 던져 버리고 싶네요. 두권 다 번역본 샀는데 주식도 모르는 사람한테 주식으로 코드짜는거 알려주질 않나.

    너무 설명도 부족하고 완전 이해불가했었는데 단 몇페이지 정도로 이렇게 이해가 잘되게 써주시다니

    곰님 책 내시면 진짜 많은 초보들이 도움이 많이될거같네요. 정말 감사합니다. 업데이트좀 해주세요 T^T

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.26 18:37 신고  댓글주소  수정/삭제

      이해가 쉬운만큼 빠진부분과 부족한 부분도 많다는 뜻이겠죠?ㅎ
      여기에 없는 많은 내용들은 기초가 되고 난 후 찬찬히 알아가시면 좋을 것 같습니다.
      아무리 안좋은 책이라 하더라도 다른 책에서 볼 수 없는 내용들이 있는 법이니까요^^*

  8. yaHanGom 2013.01.26 19:54  댓글주소  수정/삭제  댓글쓰기

    안녕하세요-^^
    작년에 이맘때쯤 아이폰 공부하다 설명이 너무 어렵고 문법도 너무 와닿지 않아서
    책 덮었다가 다시 시작해 볼까 하고 시작하게 되어
    이 곳에 머무르게 되었습니다.^^

    참 설명이 좋네요-
    변수명과 메소드명, 인자값명 등등이 더 쉽게 되어있다면
    더 좋지 않았을까 하는 생각도 듭니다.
    물론 이해를 돕기위해 쉽게 해놓은 것이다. 이런식으로 하는 것을 권장합니다..
    라고 정리하여 마지막에 보여주어야겠죠 ㅎㅎ

    ㅎㅎ 제 괜함 바램을 주저리 써버렸네요.

    어쨌든 너무너무 감사하게 잘 보고 있습니다. 볼 때마다 view on 도 꾹꾹 누르고 있구요^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.01.26 20:50 신고  댓글주소  수정/삭제

      안녕하세요 :)

      이렇게 찾아주시고 좋은 덧글도 남겨주셔서 정말 고맙습니다 ^^*

      좋은 의견 주셔서 정말 고맙습니다 ㅎ

      자주자주 찾아주세요~ㅎ

      p.s. 저는 야한곰은 아닙니다...ㅎㅎ 왠지 괜시리 찔리(?)네요 ㅋㅋㅋ

      많이들 오해하시는 부분이라...+_+ㅎ

  9. 파워팰리스 2013.03.06 15:52  댓글주소  수정/삭제  댓글쓰기

    야곰님 강의는 정말 맛깔스럽고 맛좋아서,,, 머리 눈에 확확들어오네요,,
    매번 감사합니다.
    좋은 하루 되세요 ^^

  10. thanks 2014.03.14 16:18  댓글주소  수정/삭제  댓글쓰기

    잘 보고 배우고 있습니다. 감사합니다.


오늘의 주제

1. 네비게이션 컨트롤러를 이용한 화면전환 
2. ModalViewController 사용하기 



열 여섯째 시간입니다.^^

정말 오랜만의 포스팅입니다.ㅠㅠ
일단 감격의 눙물을 좀 닦고..ㅠ

요즘 제가 서식지를 좀 옮기기도 했고 이런저런 일들이 많이 겹쳐서 이제서야 짬을내 포스팅을 하네요ㅠ_ㅠ

맥북도 재구매 하였습니다 !

그럼 사설은 여기까지..ㅋㅋ

지난 번에는 addSubview:, removeFromSuperview, setHidden 등을 알아보았습니다.
개념이해는 잘 되셨는지요?
위에 메소드들은 개발문서를 보면 아시겠지만 view를 떼었다 붙였다 없앴다 보였다 하면서 화면을 바꿔줄 수 있는 녀석들입니다.

하지만 이번에는 view controller를 인자로 받아서 처리하는 메소드들을 다뤄봅니다.

물론 개념이 확립되어 계신 분들이라면 view controller자체는 화면에 보이지 않는다는 사실은 알고 계시겠지요? ^^*
어찌되었든 화면에는 view controller 안에 속해있는 view가 보이는 것이지요.

이해가 안되시면 이전 포스팅 :
2011/11/15 - [iOS Dev/함께해보기] - iOS개발하기 #7. 화면구조, Cocoa Touch Objects (2) 을 참고하세요~

자, 출발해 볼까요?ㅎ


# 네비게이션 컨트롤러 생성

자 지난번에 사용했던 프로젝트를 그대로 사용 합니다~

일단 두번째 탭의 화면을 네비게이션 컨트롤러 화면으로 바꿔 보겠습니다.

말이 좀 애매하긴 한데요, 일단 해봅시다^^

AppDelegate 구현파일로 가 봅니다.

우린 Second탭의 화면을 네비게이션 화면으로 바꿔주려 하는 것입니다.
아래 코드를 보면 viewController1과 viewController2가 생성되고 탭바 컨트롤러의 viewControllers에 세팅이 되고 있는것을 볼 수 있습니다.
자, 그럼 우리가 바꿔줘야겠죠? 

[##_http://blog.yagom.net/script/powerEditor/pages/1C%7Ccfile27.uf@121721474F60C3A406BA43.png%7Cwidth=%22824%22%20height=%22547%22%20alt=%22%22%20filename=%221.png%22%20filemime=%22image/jpeg%22%7C_##]
아래와 같이 코드를 살짝 바꿔줘 봅니다.
우리는 네비게이션 컨트롤러 myNaviViewController를 생성해서 viewController를 rootViewController로 설정하여 초기화 했습니다.
그 후에 viewController2대신에 탭바컨트롤러의 뷰컨트롤러에 넣어줍니다. 


실행서 보면 짜잔~~~~~~
네비게이션 컨트롤러가 대신 들어갔습니다.
어떻게 아냐구요? 파란 막대가 생겼죠?
근데 이게 네비게이션 컨트롤러가 생긴거라고는 확신할 수는 없어요.
그럼 네비게이션 컨트롤러의 동작을 확인해보면 확신할 수 있겠네요?
네~ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
 

[##_http://blog.yagom.net/script/powerEditor/pages/1C%7Ccfile10.uf@171721474F60C3A708BDF7.png%7Cwidth=%22396%22%20height=%22744%22%20alt=%22%22%20filename=%223.png%22%20filemime=%22image/jpeg%22%7C_##]
# push, pop viewcontroller 그리고 modal viewcontroller
 

자, 그럼 이제 동작을 하게 만들어 봅니다.
일단 SecondViewController.xib에 버튼 두 개를 올려놓고 이름을 이쁘게 넣어줍니다~


자, 그럼 버튼에 연결될 메소드를 생성해 줘야 하는데요, 저번에 소개해 드린바와 같이 이렇게도 생성이 가능합니다.
버튼에서부터 헤더파일의 interface내부에 오른쪽버튼(또는 컨트롤키)를 누른상태로 드래그 앤 드랍!!
그리고 Connection은 Action으로 해주시고, 이름은 이쁘게^^ 지금은 너무나 간단한 기능을 구현할 것이기 때문에 Arguments는 None으로 해줍니다. (Argument에 대한 자세한 설명은 다음에...^^)


헤더 파일에 보면 이렇게 이쁘게 정의되어있는 것을 확인할 수 있습니다.


게다가 구현파일에 와서 보면 거기에도 이쁘게 메소드가 만들어져 있습니다 ㅎㅎㅎ 아이 좋아~

그 속 안을 알차게 채워넣어 봅시다~^^


pushButtonClick메소드 안에는 임시 뷰 컨트롤러 하나를 생성해서 검은색 배경으로 설정을 해주어서 pushViewController 메소드를 실행합니다.
여기서 [self navigationController]는 이 SecondViewController를 컨트롤 해주는 네비게이션 컨트롤러를 뜻합니다.(우리 아까 AppDelegate에서 만들어 주었었죠?) 그녀석에서 새로운 뷰 컨트롤러를 집어넣겠다고 말해주는 겁니다. 

modalButtonClick메소드 안에는 네비게이션 컨트롤러를 이용한 것이 아닌 모달 뷰를 이용한 화면전환을 구현합니다.
모달 뷰가 뭐냐구요? 백이면 백 그냥 이따 실행해 보시면, 아~~~~~~~ 이거~~~~~~~ 하십니다.ㅋㅋㅋ
여기서는 약간 다른것이 아래 버튼을 코드로 구현해 놓은 부분인데요... 제가 뷰 컨트롤러 xib파일 하나를 더 만들기 귀찮아서 그런건 절대절대 아니구요..ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
그냥 버튼을 코드로 넣게되면 이렇게 넣는구나~~~ 그냥 한번 보시라고 넣어보았습니다. 암~ 그럼요~ 한번 쓰고 버릴 뷰 컨트롤러 xib파일 만들기 귀찮아서 그런거 절대 아녜요 ㅋㅋㅋ
여하튼 
presentModalViewController: animated: 메소드를 사용하여 모달뷰를 화면에 올릴 수 있습니다.
아래 버튼구현부에서 addTarget을 보시면 @selector안에 dismissModalViewControllerAnimated: 메소드가 들어가 있는 것을 보실 수 있습니다.
메소드 이름만 봐도 아~~~~~~~이게 뭐구나~~~~~~ 눈치 채셨길 빕니다. ㅋㅋㅋ

그럼 실행해 봅시다~

[##_http://blog.yagom.net/script/powerEditor/pages/1C%7Ccfile29.uf@1571B23D4F60C8153A8C3C.png%7Cwidth=%22396%22%20height=%22744%22%20alt=%22%22%20filename=%228.png%22%20filemime=%22image/jpeg%22%7C_##]
Modal 버튼을 눌렀을 때 Modal이 올라온 상태입니다.


Push버튼을 누르면 네비게이션 컨트롤러가 tempViewController 인스턴스 하나를 화면에 push합니다.
상단에 Second버튼은 Second 화면으로 pop 한다는 뜻이겠지요?ㅎ
화면을 push하면 pop해서 다시 뒤로 갈 수 있는 것입니다.
 


오늘 포스팅은 제가 쓰고도 뭐라고 횡설수설 했는지 모르겠습니다...

정말 정신없이 썼네요.

피곤해 죽겠어요ㅠㅠ

여튼 요거 개념 잘 해두시면 유용하실 거에요~

궁금한 것은 댓글 남겨주세요^^* 

어쩌면 생각보다 빨리 답변이 올라올지도 모르잖아요?ㅎㅎ


by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓
Posted by yagom

댓글을 달아 주세요

  1. Elian 2012.03.15 21:50  댓글주소  수정/삭제  댓글쓰기

    오늘 바빠서 못 보고 있다가 지금 딱! 들어오니 새 글이 딱!!

    잘 읽었습니다. 감사합니다 ^^

  2. Berry 2012.04.27 16:44  댓글주소  수정/삭제  댓글쓰기

    계속해서 강좌 잘 보고있습니다
    하나 궁금한게 생겼습니다!
    정말 간단한 부분일지도 모르겠지만
    PushButtonClick에서 검은색 바탕의 뷰를 생성하여서
    새로 뿌려주는것까진 알겠는데
    어느부분에서 Second라는 아이콘을 만들며 뒤로 돌아가는 기능을 하게하는지 이해가 잘 가지않습니다
    네비게이터를 설정하면 저절로 네비게이터바에서 처리해주는건가요 ?
    아니면 다른곳에 숨겨져 있는 기능인가요 설명좀 부탁드릴꼐요 !

    한가지만 더 질문 드릴꼐요
    버튼에 걸어둔 옵션(터치 업 인사이드 같은)을 해제시키려면 어떻게 해야하나요 ?
    혼자해보려다가 잘 안되서 급기야 버튼을 지우기까지 해봤는데 아직도 모르겠네요 ㅠㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.04.27 18:00 신고  댓글주소  수정/삭제

      1. 네비게이션 컨트롤러에서 자동으로 BackButton이 생성이 됩니다~^^ 물론 이 버튼도 커스터마이징 가능합니다.

      2. xib파일 안에서 말씀하시는 건가요? 아님 코드상에서 말씀하시는 건가요?
      음.. 위의 예제에서 본다면 xib에서 File's Owner 녀석을 우클릭 해보면 연결되어 있는 메소드 들이 나옵니다. 거기에 마우스를 올리면 옆쪽에 x표시가 생길거예요. 그녀석을 누르면 연결된 메소드가 해제 됩니다.

      위 예제상에서 해본 것은 아니지만 혹시나 해서 코드상에서 없애려면
      - (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
      메소드를 사용하시면 됩니다~^^

      충분히 설명이 되셨는지 모르겠네요..^^
      궁금하시면 언제든지 말씀해 주세요 ㅎ

    • Berry 2012.04.28 02:39  댓글주소  수정/삭제

      아하 그렇게 되는거였군요 ㅎㅎ
      친절한 설명 감사드립니다
      지금은 해볼수가 없고
      내일 아침에 바로 해보고
      안되는건 여쭤봐야겠네요 ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.04.30 09:56 신고  댓글주소  수정/삭제

      잘 해결 되셨는지 모르겠네요~^^
      또 들러주세요 ㅎ

    • Berry 2012.05.02 12:41  댓글주소  수정/삭제

      잘 해결되었습니다
      사정이 생겨 오늘에서야 해보는군요 ㅎㅎ
      오늘도 으쌰으쌰 힘을내며
      강좌 하나씩 밟아나가겠습니다 !
      좋은하루되세요 ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.05.02 13:12 신고  댓글주소  수정/삭제

      잘 해결되셨다니 정말 다행입니다~^^*
      좋은 하루 되시길~!

  3. 인절미후후 2012.05.21 15:00  댓글주소  수정/삭제  댓글쓰기

    이글에만 추천이 적네요 ㅎㅎ
    한 세번 넘어가는것 같은데 다시 볼수록 새로운 걸 알게 되는거 같아요 ㅎㅎ 잘보고 갑니다.

  4. 밤가시 2012.05.28 19:36  댓글주소  수정/삭제  댓글쓰기

    강좌 하나하나 정주행해서 실습해보고 있는데요..
    이 강좌에서 Close 버튼을 직접 구현한것 같이
    Push 버튼을 눌렀을때 tempView 의 Back 버튼도 구현해 보고 싶어서 아래와 같이 modal버튼에 있는 것을 약간 응용했습니다.

    UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [closeButton setFrame:CGRectMake(50.0f, 50.0f, 220.0f, 70.0f)];
    [closeButton addTarget:tempView action:@selector(popViewControllerAnimated:) forControlEvents:UIControlEventTouchUpInside];
    [closeButton setTitle:@"Back" forState:UIControlStateNormal];
    [tempView.view addSubview:closeButton];

    push 했으니깐 버튼 눌렀을때 Pop 해야 할것 같아서 selector의 action 을 저렇게 지정하였는데
    계속 에러를 내면서 죽어버리네요.
    어떻게 구현해야 하나요?? ^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.05.28 23:44 신고  댓글주소  수정/삭제

      ^^* 질문주셔서 고맙습니다~!
      이미 해결하셨을지 모르겠지만 버튼의 타겟이 잘못되었네요~!
      해당 메소드의 타겟은 뷰 컨트롤러가 아니라 그 뷰 컨트롤러를 컨트롤하는 네비게이션 컨트롤러 입니다.
      그러므로 타켓에 네비게이션 컨트롤러가 들어가야 맞습니다.^^*

  5. Favicon of http://www.freeism.co.kr BlogIcon freeism 2012.06.05 11:25  댓글주소  수정/삭제  댓글쓰기

    버튼 이벤트 생성할 때, 계속 오류가 나서 봤더니..

    - (IBAction)pushButtonClick: (id)sender;
    - (IBAction)modalButtonClick: (id)sender;

    로 해주면 정상적으로 동작하네요. xcode 버전 문제일지도 모르겠네요^^

  6. 궁금궁금 ~~ 2012.06.12 17:57  댓글주소  수정/삭제  댓글쓰기

    xcode 쌩초보 입니다 이렇게 저렇게 이해해보면서 따라하고 있는데
    modal버튼을 누르면 아래와 같은 에러와 함께 어플이 죽어 버리네요
    2012-06-12 17:50:51.263 ChangeViews[6215:f803] -[SecondViewController ModalBtnClick]: unrecognized selector sent to instance 0x688d680
    2012-06-12 17:50:51.325 ChangeViews[6215:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SecondViewController ModalBtnClick]: unrecognized selector sent to instance 0x688d680'
    어떤점이 잘못 된 걸까요 몇번이나 봐도 소스는 똑같은데..ㅜㅜ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.12 18:44 신고  댓글주소  수정/삭제

      SecondViewController.h에서
      - (IBAction)pushButtonClick:(id)sender;
      - (IBAction)modalButtonClick:(id)sender;

      SecondViewController.m 에서도
      - (IBAction)pushButtonClick:(id)sender;
      - (IBAction)modalButtonClick:(id)sender;
      로 변경해 주시구요...ㅎ

      만약에 그렇게 해도 되지 않으면... 처음부터 다시...^^; 는 농담이구요 ㅋ

      SecondViewController.xib 파일에서 File's Owner를 오른쪽 클릭한 후에 버튼에 연결되어있는 액션을 없애주시고 다시 한 번 연결해 보시기 바랍니다.

      혹시 안되면 다시 댓글주세요^^;

  7. 컴맹 2012.08.24 01:02  댓글주소  수정/삭제  댓글쓰기

    전 운이 좋은지 에러 없이 잘되네요 ㅎㅎ (잘 되도 불안하군요)
    다음 강좌인 map view 를 하려고 하는데 이번강좌의 소스를 사용한다고 해서 복습할겸 다시 와서 보고 갑니다~~
    덕분에 더 잘 알게 되었네요 ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.08.24 10:02 신고  댓글주소  수정/삭제

      안녕하세요 컴맹님~
      ㅎㅎ 잘 되도 불안한 것은 정말 좋은자세입니다 ㅎㅎㅎ
      언제 어디서 버그가 튀어나올지 모르니 항상 확인하고 또 확인해 봐야겠지요 ㅎㅎㅎ
      찾아주시고 덧글 주셔서 정말 고맙습니다:)
      또 놀러오세용 ㅎㅎ

  8. chosamong 2012.08.26 13:58  댓글주소  수정/삭제  댓글쓰기

    정말 정말 감사합니다.
    강좌를 차근차근 따라가면 정말 정말 기본기 튼튼한 자신을 보게 될 것 같은 기대감 ~ ^^;

    그런데 저는 왜 IB화면과 코드화면 나누기가 상하로만 되지요 ?
    야곰샘처럼 좌우로 놓고 싶은데 어떻게 하는지 모르겠어요.

    강좌는 진짜로 정말로 감사합니다. 꾸우벅 <(__)>

  9. 꾸앵 2012.10.11 11:46  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    ios 입문 3일차 초보 개발자입니다.
    현재 xcode 4.0 버전을 쓰고 있고 ios application 에서 windows-based application 으로 프로젝트 생성후

    탭바를 만들었습니다.
    4개의 탭 중에 3번째 탭에 모달뷰를 띄워서 로그인창을 넣고 로그인이 되면 모달뷰를 내리는 방법으로 프로젝트를 진행하려 하고있습니다.
    헌재 탭바 아이템번호를 찾아서 해당 번호일때는 모달뷰를 띄우게 코딩진행중인데
    모달버튼 클릭시 실행되는 코드를 그쪽으로 옮겼습니다
    헌데 self presentModalViewcontroller:tempViewCon animated:YES 에 노란줄이 가 있습니다.

    모달뷰를 만들고 쓰지 않았다는거 같은데 왜 그런걸까요...
    ios입문 3일차라... 모르는게 너무 많아요 ㅠ

    버전마다 너무 틀려서 강의를 봐도 다른게 많고...
    view-based windows-based 스토리 보드.. 당최 내가 할려는걸 어떤걸로 해야하는지도 모르겠고 ㅠㅠ
    @_@

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.10.11 17:32 신고  댓글주소  수정/삭제

      안녕하세요 꾸엥님 :)
      블로그를 방문해 주셔서 정말 고맙습니다.

      사용하신 메소드는 iOS6에서 사라진 메소드이기 때문에 경고가 뜨는 것 같습니다.

      iOS가 변경됨에따라 사라지거나 생기는 메소드들이 있습니다. 그 중에 하나라서 iOS6 이전에서는 동작하지만 iOS6부터는 동작하지 않습니다.

      http://winplz.tistory.com/entry/xCode-45-for-iOS-60-%EB%8B%AC%EB%9D%BC%EC%A7%84-%EC%A0%90

      이 포스팅을 참고해 보시면 도움이 될 것 같습니다 ^^*

    • 초보자99 2012.12.09 18:06  댓글주소  수정/삭제

      저도 같은 증세인데 링크 참고해도 어떻게 해결해야될지 모르겠습니다
      ㅠㅠ 솔루션을 제공해주시면 좋겠습니다.
      ------------------
      아 그래서
      [self presentViewController:tempViewCon animated:YES completion:nil];
      이렇게 수정했습니다. 따로 빨간글자나 노란글자는 보이지않습니다만, 괜찮은걸까요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.12.09 22:19 신고  댓글주소  수정/삭제

      네~ 맞습니다:)

  10. kimsdn 2012.11.25 06:04  댓글주소  수정/삭제  댓글쓰기

    복습중인데.. 한가지 질문드릴께요

    닫기버튼을 하드코딩 하지않고 xib파일에서 직접 만들고 붙일경우

    액션을 어떻게 줘야하나요??

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.25 20:12 신고  댓글주소  수정/삭제

      지금 올라온 모달뷰 같은 경우는 컨트롤러 자체도 코딩으로 만들어 줬기 때문에 버튼도 코딩해 준것이구요, 만약에 뷰컨트롤러 자체는 xib로 만들게 되면 위쪽의 2,3번 캡쳐 화면과 같이 연결해 주시면 됩니다.
      물론 버튼을 따로 빈 xib파일에 넣어서 하는 방법도 있지만, 보통 그런방법은 매우 귀찮아지고 머리아파지고 잘 사용하지 않기 때문에 생략하도록 하겠습니다..^^;

  11. hyung 2012.12.07 09:42  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님! 질문하나 드리겠습니다.

    저는 지금 UIViewController -> UITableViewController로 pushViewController 하고 싶은데 어제부터 잘 안되네요 ㅠㅠ

    저기 델리게이트 선언부분에
    sel.tabBarController들어간 부분 있잖아요..?
    아마 그쪽을 잘못 선언 해준거 같은데
    탭바가 아닌 경우는 뭐라고 해줘야 할까요?

  12. 헌트리스 2012.12.07 10:33  댓글주소  수정/삭제  댓글쓰기

    초보 질문입니다!!

    modalClickButton 만들 때,

    클릭버튼을 하면 새로운 모달창이 뜨는 거라고 생각하면 되죠?

    modal 이라는 개념이, 새로운 UIViewController 창을 띄우는 것인가요?

    push 와 modal 의 용어 정의 차이를 잘 모르겠습니다 ㅠ


    그리고,

    presentModalView... 이 명령어가 안먹힌다고 하여

    [self presentViewController:(UIViewController *)tempViewcon animated:YES completion:nil];

    로 수정하였습니다. 그런데 닫는 부분에서

    [closeButton addTarget:tempViewCon action:@selector(dismissViewControllerAnimated:YES completion:nil) forControlEvents:UIControlEventTouchUpInside];

    로 적었는데 에러가 나는군요 ㅠ 이 부분 수정을 어떻게 해야 하나요~?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.12.07 19:30 신고  댓글주소  수정/삭제

      [closeButton addTarget:tempViewCon action:@selector(dismissViewControllerAnimated: completion:) forControlEvents:UIControlEventTouchUpInside];

      으로 해보세요:)

  13. Aldo 2012.12.17 12:32  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, 너무고맙게 잘 보고 배우고있어요~^^
    질문 하나 할개요, 질문같지도 않은 질문이겠지만...
    첫번째로 올리신 이미지에서, 빨간상자 안의 아랫부분에

    self.tabBarController.viewControllers = [NSArray arrayWithObject:viewController1, myNavyViewController????, nil];

    ????여기에 들어가는 문자가 대체 뭐에요?? 1도 아니고 l도 아니고 !도 아니고, ...
    제가 사정상 아이패드로 게시글을 보는데, 해상도가 안따라줘서 저 문자를 제대로 못보여주는지도 모르겠지만...
    암튼, 모르겠어요 뭔글씨인지ㅠㅠ

  14. 김민국 2013.01.30 19:32  댓글주소  수정/삭제  댓글쓰기

    좋은강좌보고 열심히 공부하고있습니다!
    너무감사해요!^^

    질문하나 드릴게요 ㅎㅎ

    - (IBAction)pushButtonClick {

    UIViewController *tempViewCon = [[UIViewController alloc] init];
    [tempViewCon.view setBackgroundColor:[UIColor blackColor]];
    [[self navigationController] pushViewController:tempViewCon animated:YES];
    }

    여기서 self navigationController 이부분에서 네비게이션 객체가 있는데
    AppDelegate에서 secondViewController를 네비게이션컨트롤러에다가 추가해줬자나요

    이부분때문에
    세컨드뷰컨트롤러 객체에 네비게이션 객체가 있는건가요???

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.01.31 20:34 신고  댓글주소  수정/삭제

      어떤 뷰 컨트롤러 객체가 네비게이션 컨트롤러에 push되면 자동으로 그 객체의 네비게이션 컨트롤러 프로퍼티에 등록되게 됩니다 ㅎ

  15. 퐝칭칭 2013.03.28 15:52  댓글주소  수정/삭제  댓글쓰기

    이번 강좌도 잘보고갑니다 ^^ 추천꾸욱~
    근데 저는 modal view 화면에서 버튼안에 close 텍스트가 안뜨네요
    디버깅 과정에서

    경고 메시지 : 'presentModalViewController.animated:'is deprecated: first deprecated in iOS 6.0

    이렇게 뜨고요 이거 버전문제 때문인가요 ?
    아님 버전이랑 관계없이 다른문제 인가요 ?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.03.29 03:26 신고  댓글주소  수정/삭제

      덧글 고맙습니다 :)

      버튼 안에 글씨가 나오지 않는 것은 버전에 큰 관계가 없을거예요.

      혹여 오타가 있나 유심히 살펴보세요~

      경고메세지가 출력되는 이유는 iOS 6.0 부터 사라진 메소드를 호출했기 때문입니다.

      [self presentViewController:tempViewCon animated:YES completion:^(){}]; 으로 작성해보시면 경고문구가 없어질 거예요..ㅎ

      그리고 버튼또한 dismissModalViewControllerAnimated: 가 아니라

      dismissViewControllerAnimated:completion: 으로 바꿔서 넣어보세요~

  16. Hide 2013.11.11 21:36  댓글주소  수정/삭제  댓글쓰기

    감사합니다.