'아이패드'에 해당되는 글 67건

  1. 2012.06.14 iOS 6 beta 설치해보기 (3)
  2. 2012.06.13 iOS개발하기 #41. XML Parser (2) <TBXML> (29)
  3. 2012.06.11 iOS개발하기 #40. XML Parser (1) <UITableViewCell, UITableView> (14)
  4. 2012.06.08 iOS개발하기 #39. UISearchDisplayController(5) <UIImage, UITableView Section Header> (27)
  5. 2012.06.07 네트워크 상태 체크하기 (5)
  6. 2012.06.06 iOS개발하기 #38. UISearchDisplayController(4) <NSThread, Reachability> (10)
  7. 2012.06.04 iOS개발하기 #37. UISearchDisplayController(3) <UITableView, UITableDataSource> (29)
  8. 2012.06.04 누를 때 마다 이미지 바뀌는 버튼 (체크박스 버튼) (2)
  9. 2012.06.01 iOS개발하기 #36. UISearchDisplayController(2) <UISearchBar, NSThread, JSON, NSRequest> (31)
  10. 2012.05.30 iOS개발하기 #35. UISearchDisplayController(1) <UISearchBar, UITableView> (5)
  11. 2012.05.29 #pragma mark - 소스코드 이쁘게 관리하기 (5)
  12. 2012.05.26 iOS개발하기 #34. NSNotificationCenter (노티피케이션센터) (27)
  13. 2012.05.24 iOS개발하기 #33. Protocol, Delegate (프로토콜, 델리게이트) (31)
  14. 2012.05.21 iOS개발하기 #32. 피커뷰(UIPickerView) (26)
  15. 2012.05.17 iOS개발하기 #31. UIActivityIndicator, NSThread (18)
  16. 2012.05.11 iOS개발하기 #29. 경고창 (UIAlertView) (20)
  17. 2012.05.09 iOS개발하기 #28. 웹뷰 (WebView) <2> - delegate 사용해 보기 (25)
  18. 2012.05.07 iOS개발하기 #27. 웹뷰 (WebView) <1> (42)
  19. 2012.04.26 iOS개발하기 #26. 이미지 피커 (UIImagePickerController) <사진찍기, 사진 불러오기> (35)
  20. 2012.04.23 iOS Simulator에 사진 넣기 (6)
이번에 iOS 6 개발자 베타버전이 배포되었죠.

그래서 저도 설치해 보았습니다 ㅎㅎㅎ

한국어 siri 및 뭐 다양한 기능들이 있고, 페이스북도 들어가고...ㅎㅎ

오늘은 설치방법에 대해 한 번 알아봅니다~!

일단 애플 개발자 개정이 있어야 합니다. (무료 개발자 말고 $99 결제 한 개발자에 한함)

물론 설치하려고 하는 기기도 개발자 계정에 등록이 되어있어야 합니다.

http://developer.apple.com 에 방문하여

iOS Dev Center로 향합니다.ㅎ 

개발자 계정으로 로그인을 하면 아래와 같은 화면이 나옵니다.

iOS 6 SDK beta 탭에 들어가셔서 Downloads를 클릭!

 
일단 iTunes 10.6.3을 다운받습니다(기존의 아이튠즈를 업데이트 하셔도 됩니다.) 
그리고 자신의 기기에 맞는 iOS 6 beta 설치본을 받습니다.


다운로드가 완료되면 dmg형식으로 다운로드가 되어지는데요, 더블클릭하여 열어줍니다.


그럼 이렇게 장비에 잡힐거예요 ㅎ 그리고 이제 10.6.3 버전의 아이튠즈로 가 봅시다~


아이튠즈에서 기기 목록에서 일단 백업을 해 둡니다.
백업 안하시면 다 날아가요~~~~~~~~~!!


백업이 완료되면 아이튠즈에서 복원을 누르는데 OS별로 눌러야 하는 키가 다릅니다.
맥에서는 옵션+클릭, 윈도우에서는 쉬프트+클릭입니다.


그리고 우리가 받아두었던 그 ipsw파일을 선택 해 줍니다!


두구두구두구둑두구둑두구둑두굳구두굳구두굳구둑두구두구두구!
설치가 완료되면 아까 백업해 두었으니 백업에서 복원을 합니다.


복원이 완료되었다고 바로 연결을 해제하지 마세요!! 아래 사진처럼 복원 후에도 어플이나 데이터 설치를 위하여  계속 동기화 중입니다.

그러므로 동기화 완료가 될 때 까지 연결해제 하지 마세요~^^
물론 동기화 중에도 사용을 할 수는 있습니다~



Posted by yagom

댓글을 달아 주세요

  1. Seed Boom 2012.06.17 10:46  댓글주소  수정/삭제  댓글쓰기

    개발자 등록이 없어도 되나요??

  2. 나에게넌 2012.08.14 13:38  댓글주소  수정/삭제  댓글쓰기

    후다닥~~! 숑


오늘의 주제

1. TBXML로 XML파싱


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

지난 번에 테이블을 준비해 두었었죠?
오늘은 XML 파싱을 한 번 해보려 합니다.
본래 코코아 내에 NSXMLParser 라는 XML파싱 클래스가 존재 합니다.
그래서 그녀석으로 포스팅을 해볼까 하다가, 그녀석 보다 좋은 녀석이 있어서 소개 겸 진행해 보려고 합니다.

사용법도 훨씬 간단하고 속도도 훨씬 빠릅니다~!
NSXMLParser는 처음 파싱해보는 분들은 정말 어려워 하는 경향이 있습니다.
그래서 준비했습니다. TBXML...!

오픈 라이브러리 가져다가 잘 쓰는 것도 중요합니다 ㅎㅎㅎ

저도 처음 써보는데, 일단 해 봅시다 ㅎㅎ


# XML의 구조


지난 번에 예제로 쓰겠다고 했던 날씨 XML 데이터 입니다.
XML은 요소(엘리먼트), 속성 등을 알면 됩니다.

1번 : 엘리먼트 입니다. 저 줄 하나가 통채로 엘리먼트 입니다. 맨 위에 루트 엘리먼트가 current라는 이름을 갖고 있네요. 그 자식 엘리먼트가 weather구요, weather의 자식 엘리먼트들이 local이란 이름으로 쭈욱 나열되어 있는 모습입니다.
2번 : 엘리먼트 이름 입니다.
3번 : 속성 이름입니다. 저렇게 엘리먼트 내부에 들어가 있는 녀석을 속성이라고 부릅니다.
4번 : 속성값 입니다.
5번 : 엘리먼트 텍스트 입니다.

일단 이렇게 기본적으로 알고 가 봅시다~!

# TBXML 다운받기

http://www.tbxml.co.uk

TBXML 공식 블로그입니다. 영국사람이 만들었나 보네요 ㅋㅋ 들어가 봅시다.
다운로드 링크를 타고 가서 소스파일을 다운받습니다.
지금 최신 버전이 1.5 버전이라서 추후에는 어떻게 변경될지 모르겠지만 여튼 아직까진 이렇습니다 ㅎㅎ


압축을 풀면 폴더들이랑 파일들이 나와요~
그중에 제가 여기 집어 넣은 녀석들을 골라서 가져옵니다.
그리고 우리 프로젝트의 pch파일로 옵니다. 거기서 하나 정의를 해 주시구요. (이녀석이 뭔가는 별로 신경쓰지 않으셔도 됩니다.) 


그리고 프로젝트 타겟 속성으로 와서 라이브러리 추가 버튼을 눌러줍니다.


libz.dylib를 추가해 주시구요


이제 테이블뷰 컨트롤러 구현파일에 와서 헤더파일을 임포트 합니다.
그리고 이쁘게 코딩~ 코딩~
TBXML은 블럭코딩 방식을 사용하였는데 iOS4.0 이상부터 지원합니다. 일단 아래 보이는 코드들이 좀 생소하더라도 블럭 코딩이라는 것만 알아두시고, 일단은 넘어갑니다 ㅎㅎ


또 또 코딩합니다~ 스레드 만드는 것은 설명 필요 없겠죵? +_+
2012/06/01 - [iOS Dev/함께해보기] - iOS개발하기 #36. UISearchDisplayController(2)
2012/06/06 - [iOS Dev/함께해보기] - iOS개발하기 #38. UISearchDisplayController(4)
요기서 스레드에 대해 좀 볼 수 있을 거에요~


자, 여기까지 모두 잘 되었다면 요로케 로그가 찍혀야 합니다~!
오홍홍~_~


잘 나왔나용?ㅎㅎ
오늘 테이블에 뿌리는 것까지 해 보려 했는데, 일단은 여기까지만 해야겠네용~

지난 번에 잘 따라오신 분들이라면 이미 테이블에 넣는 작업을 하고 계시지 않을까 싶네요 ㅎㅎ

그럼 다음 번에 또 뵙도록 해요 :-)

by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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



Posted by yagom

댓글을 달아 주세요

  1. 인절미후후 2012.06.13 19:47  댓글주소  수정/삭제  댓글쓰기

    TBXML을 이전에 문서로는 봤었는데요(저는 이전에 테이블에 파싱해서 데이터 뿌려주는거 할때 NSXMLParser를 이용했었습니다.)
    야곰님 덕분에 오늘 접해보았습니다.
    스샷대로 따라가서 로그까지는 뿌려보았는데요..
    사용해본 후기를 적어보자면은 1.5버전은 블록코딩을 사용해서 좌절을...
    안에서 변수생성은 되는데 밖으로 변수를 보내거나 밖에 있는 변수를 데려와서 값을 넣어주는 방법을 모르겠더라구요..
    설상가상으로 해당사이트 API와 가이드라인을 찾아보는데 1.5버전의 메뉴얼은 없는거 같더라구요.
    그래서 결국 제 프로젝트에 적용을 못하고 NSXMLParser를 사용해서 마무리 했답니다 ㅎㅎ
    다음 강좌에 테이블 적용편을 보면 다시 한번 실습해보도록 하겠습니다.

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

      넵, ㅎ 저도 NSXMLParser를 포스팅 할까 고민 많이 했는데... 흠... 그거로 해볼껄 그랬나봐요^^;
      블록코딩을 했지만 우리는 데이터를 전달 해 줄 수 있는 많은 수단들이 있었잖아요?ㅎ 잘 기억해 보세요...ㅎㅎ
      조만간 그 베일을 벗겨드릴게요~
      저도 1.5버전에 대한 도큐먼트가 없어서 처음에 굉장히 헤메었는데 구글신께서 도와주셨죠 ㅎ
      항상 이렇게 오셔서 덧글도 주시고 항상 고맙습니다^^*

  2. 인절미후후 2012.06.14 10:34  댓글주소  수정/삭제  댓글쓰기

    NSXML파서는 관련 자료가 많으니까요~
    오히려 새로운 부분의 코딩을 접해서 저는 더욱 신이 납니다.
    오브젝티브씨도 그냥 자바처럼 씨처럼 사용 했는데 이번 강좌로 오브젝티브씨에 한발 더 다가서는 것 같아서
    머리는 복잡하지만 두근두근 합니다 ㅎㅎ
    단순히 외국자료의 번역을 소개하는게 아니라(시중에 그런 책/블로그 도 많잖아요.) 정형화된 방식이 아니라
    더욱 학습효과가 좋다고 생각합니다 다음 강좌가 기다려지네요 이전 강좌 복습 좀 해야겠네요 ㅎㅎ
    덕분에 xml파서 자료도 찾아보고 저는 아주 유익했습니다.

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

      그렇게 말씀해 주시니 저도 마음이 한결 놓이네요 ㅎ
      이렇게 덧글이 달리니 저도 아주 신이 납니다 ㅎㅎ
      요즘 바빠서 제대로 쓸 시간이 없는데, 일단 XMLParser 까지만이라도 최대한 빨리 마무리 지어야 겠네요 +_+

  3. Sio 2012.07.24 17:00  댓글주소  수정/삭제  댓글쓰기

    TBXML이라는 것도 있군요 ㅎㅎ 덕분에 block?코딩 이라는 것도 알게 되었습니다;;;
    처음 보는거라 이게 뭐지??? 했는데 아직도 신기합니다 ㅋㅋㅋ
    근데 아직도 뭔지 잘 몰라서 계속 구글링 중 입니다 ㅋㅋㅋ
    정말 계속 새로운 뭔가가 나타나는 것 같아요 ㅎㅎ

    잘보고 갑니다~!

  4. 나에게넌 2012.08.14 13:36  댓글주소  수정/삭제  댓글쓰기

    좋은 강의 감사합니다..
    NSXMLParser도 찾아봐야겠어요..

    TBXML이랑 메모리 사용량에선 비슷하지만 속도면에선 차이가 난다내요..
    http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project

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

      위 링크의 그래프는 저도 본 자료인데 Seconds To Parse라고 나와있죠 :)
      즉, 파싱에 걸리는 시간입니다.
      NSXMLParser보다 TBXML이 소요시간이 훨씬 짧은 것을 확인 할 수 있습니다 ^^~

    • 나에게넌 2012.08.14 18:05  댓글주소  수정/삭제

      그러네요..Speed만 보고 판단해버렸네요.. ㅎ

  5. seongkwon 2012.09.08 16:29  댓글주소  수정/삭제  댓글쓰기

    야곰님 ^^ 항상 강의 관련해서 자료 잘보고 있습니다.
    XML 파싱공부중에 TBXML로 XML파싱 부분을 완료하였는데 Log가 찍히지가 않습니다.

    모든 부분 똑같이 작성하였고, 에러는 없는데 하나 워닝이 있다면
    TBXML.m 파일에서 value = [NSString stringWithString:@""]; 이부분이 워닝이뜹니다.

    지우고 타입을 바꿔봐도 파싱자체가 되는거 같지 않습니다.
    제가 잘못한 것일까요?

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

      늦은 답변이지만... 혹시 TBXML 최신버전을 사용해 보셨는지요?
      이게 워낙 빨리빨리 바뀌는 IT시대라서 새로운 버전이 나왔을 수도 있어요~ iOS도 Xcode도 빨리빨리 변화하고 있으니까요^^;

  6. 꾸앵 2012.10.23 16:38  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. TBXML을 사용하는 강좌 감사합니다.
    헌데 진행하다가 문제가 생겨 이렇게 댓글남겨요
    뷰컨트롤러쪽에선 에러가 안뜨는데
    TBXML.M파일이랑
    TBXML+HTTP.M 파일에서 에러가 무려.... 9개나 잡히네요 ....

    http://blog.naver.com/storyphoto/viewer.html?src=http%3A%2F%2Fblogfiles.naver.net%2F20121023_160%2Fangel1004ppp_1350977758644y4S0a_PNG%2F%25BD%25BA%25C5%25A9%25B8%25B0%25BC%25A6_2012-10-23_%25BF%25C0%25C8%25C4_4.27.29.png

    소스 원본이 필요할려나요?? ㅠㅠ

  7. 꾸앵 2012.10.24 19:32  댓글주소  수정/삭제  댓글쓰기

    ARC를 제외시키고 나니 대부분의 오류들이 없어졌네요... 헌데 하나의 오류가 더 남긴 했는데
    pch 파일에서 오류가 발생하고
    CGG 4.2 Error
    Unrecognized command line option "-fno-objc-arc"

    라고 나오네요

    구글링 해보니 컴파일러를 GCC 에서 LLVM 으로 교체해보라고 하던데
    방법도 모르겠고.. 답답하기만 하네요 ㅠ

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

      http://useyourloaf.com/blog/2011/03/21/compiler-options-in-xcode-gcc-or-llvm.html
      이 글을 한 번 참고해 보시기 바랍니다 :)
      글에있는 스크린샷을 참고하시면 대충 어디있는지 짐작하실 수 있을거 같아요~ 아마도 프로젝트 속성에서^^

    • 꾸앵 2012.10.25 11:10  댓글주소  수정/삭제

      아... 빌드셋팅쪽에 있어서 바꿨어요 ^^;
      어쨌든 도움 감사합니다 ㅎㅎ

  8. 꾸앵 2012.10.26 11:42  댓글주소  수정/삭제  댓글쓰기

    이틀동안 이 오류가지고 허공에 삽질 열심히 해대고 있는데 ㅋㅋ ㅠㅠ
    ARC 관련해서 적용하면 다른오류 컴파일러 교체하면 또 이전오류 무한반복중.... ㅠㅠ
    구글링을 열심히 해도 딱히 이거다 라는 것도 없는 것 같고... 으앜ㅋㅋ

    TBXML+HTTP.m 파일의
    @autoreleasepool에서 Unexoected '@' in grogram
    으로 에러메시지가 나오는데.. 후... XML 파싱 힘드네요 ㅠ

    • 꾸앵 2012.10.26 11:55  댓글주소  수정/삭제

      블럭프로그래밍이 오토릴리즈풀을 파싱을 못한다는 것 같네요
      NSAutoreleasePool 클래스로 바꿔보라고 해서
      바꿨더니 잘되네요 크크...

      항상 고치고 보면 1분만에 고치는걸 안될땐 그걸 모르니...
      공부를 얼릉 열심히 해야할 듯 ㅠ

      해결했으니 다음으로 고고~

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

      ㅎㅎ 항상 해결하고 보면 정말 아무것도 아닌게 많죠^^;
      그런 사소한 것들이 쌓이고 쌓이다보면 어마어마해 지는 것입니다...ㅎㅎㅎ
      많은 도움이 되어드리지 못해 정말 죄송합니다. 그래도 해결되셨다니 다행이네요 ㅎ

  9. 초보에꿈 2013.01.10 16:35  댓글주소  수정/삭제  댓글쓰기

    열심히 강의를 듣고 따라하고 있는데요 ㅎㅎ

    // 파싱 시작
    [TBXML newTBXMLWithURL:weatherURL success:tbxmlSuccessBlock failure:tbxmlFailureBlock];

    이걸로 하니깐 계속 찾을수 없다고 나오고 .. 오류나서 ;;; 멀 잘못했나 싶었는데 ;;;;

    // 파싱 시작
    [TBXML tbxmlWithURL:weatherURL success:tbxmlSuccessBlock failure:tbxmlFailureBlock];

    이걸로 바꾸니깐 잘 되네요 ;;......newTBXMLWithURL 로 쓸려면 HTTP파일에 있는 것들도 다 바꿔야 하는건가요???

  10. 깊은물 2013.07.07 16:45  댓글주소  수정/삭제  댓글쓰기

    제가 버스 어플 만들어 볼라구 아이맥도 사고 xcode도 보고 어언 2년 가까이 되는데요

    야곰님의 xml파싱을 그대로 따라해서 빌드했는데..에러도 안뜨고 로그도 안나오는 상황이 되었습니다.

    뭐가 문제인지 봐주시면 정말 고맙겠습니다.

    테이블뷰에 뿌리기도 전에 로그가 안나타나요..흑흑..

    일단 xml parser 2차시 까지 따라서 소스 입력해 보았습니다.

    소스를 보여 드리고 싶은데

    파일 첨부하는 데가 없네요

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

      이 포스팅 자체가 오래된거라, TBXML 라이브러리도 좀 바뀌었을 것고... iOS 버전에도 변화가 많습니다 ^^;

      지금 아마 제대로 동작을 하지 않을 것 같습니다~

  11. 깊은물 2013.07.07 16:52  댓글주소  수정/삭제  댓글쓰기

    NSString *localStr=[itemDic objectAtIndex:@"local"];
    NSString *descStr=[itemDic objectAtIndex:@"desc"];
    NSString *taStr=[itemDic objectAtIndex:@"ta"];


    에서 빨간줄이 3줄 에러납니다.
    No visible @interface for 'NSDictionary' declares the selector 'objectAtIndex'

    http://cafe.naver.com/mcbugi/274136에 첨부파일2개 올렸습니다.
    2번째 첨부파일 보시고 가르침을 주십시오...


    왜 그럴까요? 흑흑...

  12. mainrichoo 2013.08.21 04:52  댓글주소  수정/삭제  댓글쓰기

    질문이 있어서 글 남깁니다...
    일단....tbxml버전 업뎃이 왜 안되지 왜 안되지 하면서 고생했네요..ㅠㅠㅠ

    일단 블럭코딩...혹이거 배울수 있는 강좌 좌표가 있으면 부탁좀드릴게요..ㅠㅠ

    그리고 중간에 ARC를 가능하게 해버리면 미리 작업해놓았던 ARC없이 짠 코드들에 영향을 주나요?
    예전에 ARC 설정하고 dealloc해버리면 오류났던것 같은데...궁금합니다...

  13. 콜필드 2013.08.24 00:42  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, 아이폰 앱 개발 중에 이 포스팅 발견하고 안도의 한숨을 쉬고 있습니다. 감사합니다.

    그런데 궁금한 점이 있는데, 이렇게 xml으로 저장된 데이터들을 테이블뷰에 뿌려줄 때, 그 데이터 양이 많아지면 문제는 없나요?

    예를 들어 항목이 1천개가 넘어가면 말이죠...

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

      안녕하세요 콜필드님 :)

      저도 iOS에서 테이블을 처음 쓸 때 그런 걱정을 했더랬죠..ㅎㅎ

      하지만, 우리가 보이기에 테이블이 엄청나게 길어 보이지만 실상은 Cell을 계속해서 화면에 다시 세팅해 주는 것이랍니다.

      이해가 되셨을까요..?

      즉, 테이블에 담을 데이터는 우리가 가지고 있지만 (string 데이터라고 해봐야 몇 천 몇 만개라도 메모리에 차지하는 영역은 별로 없다고 보시면 됩니다) 정작 화면에 보여주고 메모리에 올라와 있는 셀은 딱 우리가 보고있는 그 셀들 밖에 없다는 것이지요...

      음... 그래서 cell reuse identifier 이 있어야 하는 것이구요.
      음... 말로 하려니까 정말 어렵네요^^;

      조금 더 검색 해보시면 좋은 자료들이 나올 것 같아요.

      더 궁금하신 것이 있으면 언제든 말씀해 주세요 :)

      행복한 주말 되시길 빕니다!


오늘의 주제

1. XML 파싱을 위한 준비
2. 커스텀 테이블뷰 셀 만들기



마흔 번째 시간입니다.^^ ( *_* 벌써!!??? )

지난 번까지는 JSON 으로 내려온 데이터를 파싱해 보았습니다.
이번에는 XML을 파싱하는 방법에 대해 알아보도록 하겠습니다.
기상청에서 내려주는 날씨데이터를 가지고 파싱을 해 보도록 할거예요.
오늘은 파싱을 위한 커스텀 테이블 준비를 해 볼게요~

가봅시다~~~~~~~~~~~ ^0^


# 파싱을 위한 테이블 뷰 준비

우리가 파싱해 볼 기상청의 데이터 입니다.
http://www.kma.go.kr/XML/weather/sfc_web_map.xml
에 접속하면 내려오는 데이터 입니다.ㅎ
요녀석을 파싱해 봅시다~!


일단 새로운 테이블 뷰 컨트롤러를 만들어 줍니다.
New File...


UITableViewController 의 서브클래스로 만들어 주시구요~


그리고 루트 뷰 컨트롤러 (ViewController)에서 버튼을 만들어주고 액션을 연결해 줍니다.



그리고 헤더파일을 임포트 해주시고~


버튼 메소드에 적절히 테이블뷰 컨트롤러를 모달로 띄워줍니다~


# 커스텀 테이블 셀 만들기
그리고 이제 날씨 테이블을 위한 커스텀 셀을 만들어 보겠습니다~
New File...


iOS - User Interface - Empty를 선택해 줍니다


기기 패밀리는 아이폰~


이름은 요렇게~!

 

자 이렇게 xib파일이 만들어지면 Table View Cell을 하나 끌어오시고
크기를 가로 320px, 세로 80px로 설정해줍니다.



그리고 이미지뷰를 올려줍니다.
크기를 60*60, 위치 10,10으로 변경해주시구요~


그리고 태그를 10으로 설정해 줍니다. 나중에 태그로 이 이미지뷰의 포인터 값을 가져오기 위함이예요. 즉, 아울렛을 연결해서 변수로 만들어 주지 않더라도 코드상에서 태그를 가지고 이 객체를 불러올 수 있게 됩니다.


그리고 라벨을 넣어주고 태그를 지정해주시구요~


또 라벨을 넣고 태그를 넣어줍니다 ㅋㅋㅋ


그리고 또!!!!!!!!ㅋㅋㅋ


자, 이제 구현파일 .m으로 와서 태그를 해줬던 것을 사용하기 편하게 하기 위하여 enum을 하나 선언해 주시구요.


viewDidLoad 메소드에서 테이블의 가로 행 높이를 80으로 변경해 줍니다.
그리고 테이블 뷰 데이터 소스에 코딩을 이쁘게 해 줍니다.


자, 그리고 실행하면!?



네~ 아무것도 안나오죠 ㅋㅋㅋ
당연히 이미지뷰나 라벨에 아무것도 넣어주지 않았으니까요 ㅋㅋ
일단 오늘은 준비만 해둔거예요~

다음 번에 본격적으로 파싱해서 테이블에 데이터를 넣어볼게요~


by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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





Posted by yagom

댓글을 달아 주세요

  1. 생초보 2012.06.11 14:11  댓글주소  수정/삭제  댓글쓰기

    아흠흠 감사합니다 눈물이 앞을가리네요 ㅜㅜ

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

      ^^*
      도움이 되셨으면 하는 바람입니다...^^
      그나저나 NSXMLParser가 아니라 다른 녀석을 사용했는데, TBXML을 사용하였습니다. 수요일날 본문 포스트 예정입니다..^^

  2. 인절미후후 2012.06.25 21:00  댓글주소  수정/삭제  댓글쓰기

    간만에 뵙는거 같네요~
    지금은 안드로이드 작업 하느라 엑스코드 킬 여유가 없네요~
    잠깐 틈나서 1부터 다시 해보고 있습니다.
    볼수록 새로운 기분은 참 ㅎㅎ
    좋은글에 댓글이 적은게 아쉬워서 글 남깁니다 감사합니다~

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

      안녕하세요 인절미후후님~
      오랜만에 뵙네요 :-)
      저도 항상 뭐든간 볼 때 마다 새롭습니다...ㅎㅎ
      이렇게 덧글도 남겨주시고 항상 정말 고맙습니다.
      얼른 안드로이드 마치고 돌아오세용 ~_~

  3. 나에게넌 2012.08.14 11:51  댓글주소  수정/삭제  댓글쓰기

    커스텀셀 준비 과정..사뿐히 즈려 밟고 갑니다..

  4. Favicon of http://blog.naver.com/evanecen BlogIcon 커피홀릭 2012.08.30 14:36  댓글주소  수정/삭제  댓글쓰기

    처음에 아무것도 모를 때 야곰님 포스트보고 많이 이해했었는데
    xml파싱할 일이 있어서 검색하다가 또 도움받고 가네요 ㅎㅎ

    요기 나와있는 방법대로 해봐야겠어요~
    정말 감사합니다 ~ㅎㅎ

  5. asrada 2012.12.08 13:29  댓글주소  수정/삭제  댓글쓰기

    야곰님~!!
    저 정성이 느껴지는 스샷 잘 보고 배워갑니다
    차근차근 따라하니깐 진짜 잘되네요~신기하게도ㅎㅎㅎ

    근데 하다가 좀 막히는 부분이 있어서 여쭤볼게요
    xib 파일 만들어서 위의 방법처럼 셀을 커스텀해서 테이블 뷰에 띄우고
    여기에 switch를 추가해서 Switch 값이 변할때마다 작동하는 메소드까지는 잘 만들었는데요

    문제는 저 메소드 안에서 하고싶은 동작이 특정 셀을 보여줬다 안보여줬다하는 것인데 도통 어떻게해야할지 모르겠네요ㅠㅠ

    질문이 무지하지만 한수 가르침 부탁드립니다 ( __) 굽신굽신

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

      흠... 그렇다면 테이블뷰 델리게이트 중에 heightForRow였나... +_+

      그 메소드가 있는데, 그 값을 0으로 넣어주면 안보이게 되지 않을까요?ㅎ

  6. 잉여 2013.12.02 20:18  댓글주소  수정/삭제  댓글쓰기

    감사합니다 정말 간단하게 xml 파싱 성공하였네요

  7. 베어러블 2013.12.20 21:09  댓글주소  수정/삭제  댓글쓰기

    yagom님 제가 버스 어플을 개발하려고 하는데,, 버스앱 보면 노선번호 목록 보여준 다음에 원하는 노선을 테이블 뷰에서 클릭

    하게 되면 다음화면 넘어가면서 그 노선에 관한 정보들이 뜨잖아요?? 그 때 노선번호를 다음화면에 넘겨줘야 하는데,,

    어떤 방법을 써야 쉽게 할 수 있을까요 포스팅한 블로그들 다 뒤져 보면서 노티피케이션도 해보고 프로토콜도 해보고 했는데

    예제를 변형해서 하려고 해서 그런지 어렵고 잘 안되네요ㅠㅠ 좀 도와주시겠어요?

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

      음... 뷰컨트롤러 생성 메소드에다가 뒤에 인자 하나를 더 넣어서 메소드를 만들어 주면, init 할 때 원하는 인자를 넘겨줄 수 있어요. 이 방법으로 하시면 좋을 것 같아요. 말로 설명하니까 처음에 잘 이해가 안되실 수 있는데, 뷰 컨트롤러를 하나 만드시고 구현파일에서 initWithNib 메소드를 노려보시면 제가 무엇을 말했는지 눈치를 채실 수도 있을거예요..ㅎㅎ

    • 베어러블 2013.12.22 22:52  댓글주소  수정/삭제

      오오오 대박 멋진 생각이네요 ! 월요일에 한번 해봐야겠어요,ㅎ,ㅎ 감사해요


오늘의 주제

1. 이미지 웹에서 로딩하기 
2. 테이블 뷰 섹션 이름 넣기



서른 아홉번째 시간입니다.^^

지난 번에는 스레드 관리와 네트워크 상태 감지까지 해 보았습니다.
잘 실행 되시나요?
혹여나 부족한 부분이 있다면 꼭 댓글주세요~!

오늘은 이미지를 웹에서 로딩해서 테이블 뷰에 넣어주고, 테이블 뷰에 섹션 이름 넣는 것 까지 해보려 합니다.

우리가 이미 만들어 놓은 것들이 많으니 소스를 조금만 추가하면 될거예요~

자~! 출발!


# 웹 이미지 로드

우리는 지난 번에 item을 불러올 때 책 이미지에 대한 URL을 함께 받아왔습니다.
네, 이렇게 서버에서 정보가 내려올 때, 이미지 데이터를 직접 보내주지 않고 이미지의 주소를 보내줍니다.
혹여 이미지가 필요하면 받아가라~ 그런 뜻이겠죠 ㅎ
그래서 이미지를 불러와서 이미지 데이터를 각 item dictionary에 넣어주는 작업을 합니다.
item dictionary에 이미지를 넣어주고, 아래 테이블뷰 데이터소스 메소드에서 item 내부의 데이터를 불러와서 테이블뷰에 나타내게 되므로, 우리는 이 스레드에서 데이터를 딕셔너리에 넣어주기만 하면 되는거예요~ 플로우를 잘 이해해 보시기 바랍니다 ㅎ

또한, 지난 번에 제가 실수 한 부분중에 우리가 실행하고 있는 검색 스레드에서 테이블뷰의 데이터를 reload하는 부분이 있었는데요, 이는 잘못된 것이고 메인 스레드에서 변경해 주어야 하는 것이 맞습니다. 그래서 그에 관한 부분을 수정했습니다.


그리고 이제 위에서 말씀드린대로 데이터소스 메소드인 cellForRowAtIndexPath 메소드로 와서 이미지도 불러와서 셀에 넣어주는 코드를 넣어줍니다.


그리고 이번엔 책 말고 동영상도 로드해와 볼게요~ 
그런데 제가 작업하다 보니 지난번에 복사-붙여넣기 신공으로 코드를 작성하다 보니 오타낸 부분이 있더라구요 ㅎ
찾아서 이렇게 다시 바꿔주세용 ㅎ 


자, 그리고 이제 아까 책 이미지 데이터를 가져온 것과 마찬가지로 동영상 썸네일 이미지도 가져와 보겠습니다.
책 이미지 URL은 받아온 item 에서 'coverImage'라는 키값으로 찾을 수 있었는데, 여기서는 키값이 'thumbnail'로 되어있네요.
자세한 사항은 다음 오픈 API 의 동영상 검색 섹션을 참고하세요 ㅎㅎ
그런데 우리가 데이터 소스 메소드에 작성했을 때, 이미지를 꺼내오는 키워드는 'coverImage'였으므로 여기서도 item 딕셔너리에 넣어줄 때에는 'coverImage'라는 키로 넣어주었습니다.


이제 준비가 끝났으니 호출해 주어야 겠죠?ㅎ 책 검색 스레드를 만들어 준 것 같이 동영상 검색 스레드도 만들어 줍니다.


텍스트를 변화시킬때와 검색 버튼을 눌렀을 때 모두 해야 하므로 두 번 이렇게 생성해 주죠 ㅎ 
생각해 보니 이것도 따로 메소드로 만들어서 빼주는게 좋겠네요~^^


자, 그리고 실행해 봅니다~
그런데 두 가지 정보를 모두 가져왔는데, 어디가 어디껀지 구분이 잘 안가네요 +_+
섹션 헤더에 이름을 넣어서 구분을 지어보도록 합시다~



# 테이블 뷰 섹션 제목 달기

자, 이렇게 테이블뷰 델리게이트 메소드를 하나 더 작성해 줍니다.
책 검색 결과 섹션에는 Book이라는 제목을, 동영상 검색 결과 섹션에는 Video라는 제목을 넣어주었습니다~ 


짜잔~ 검색 해보시면 이런식으로 이쁘게 섹션이 구분되어지네요 ㅎ



그런데 제가 막 스크롤을 해 보던중 이상한 현상이 생겼어요 +_+
분명히 이미지가 들어가 있지 말아야 할 cell에 이미지가 박혀있는거예요 ㅎ


데이터소스에서 불러들일때 제대로 nil처리를 해주지 않아서 생기는 현상이예요 ㅎ
조건을 확인하고 검사해서 원치않는 다른 cell의 내용을 가져오지 않도록 처리해 줍니다.
왜 이런 현상이 발생하는지는 하아... 내용이 너무 길어져서... +_+
일단 cell을 만들 때 이런것에 주의해야 한다는 점 잊지 말아주세용~



이렇게 깔끔하게 처리해 주면 더이상 원치 않는 화면이 나타나는 것을 막을 수 있습니다~


자... 이렇게 오늘도 또 하나 해 보았네요~

포스팅이 점점 길어지고 있어요~ 할 내용들이 정말 많네용 ㅋ

이 모든 내용들을 따로따로 분리해서 할까도 생각해 보았지만 이렇게 묶어서 하나의 프로젝트로 진행하는 것이 실전 감각에 도움이 되실거라 생각하여 이렇게 진행해 보았습니다~

질문사항이나 요청사항 있으시면 댓글주세요~^^*

by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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



Posted by yagom

댓글을 달아 주세요

  1. lss 2012.06.19 11:38  댓글주소  수정/삭제  댓글쓰기

    안녕핫에ㅛ 강좌잘보고있습니다. 한가지 질문이있습니다.
    서치바와서치디스플레이컨트롤러를 동시사용할대요 서치바에 단어입력하잖아요...근데 입력할때마다
    검색해서뿌려주는데요 그렇게하지않고 다입력후 버튼을 눌렀을때 뿌려주고싶은데요...
    1.일단 단어입력때마다 검색하지않게하려면 어떻게해야하는지요?
    2.서치버튼눌렀을때 어떤메소드로 테이블뷰를 로드하는지요? UISearchDisplayController에도 reloaddata라는 함수가있긴한데 잘동작하지않네요

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

      1.
      http://blog.yagom.net/270
      iOS개발하기 #36. UISearchDisplayController(2) <UISearchBar, NSThread, JSON, NSRequest>
      의 내용을 보면 맨 처음에 나옵니다... :-)
      델리게이트에 보면 searchBar:textDidChange:
      라는 델리게이트 메소드가 있구요, searchBarSearchButtonClicked: 라는 메소드가 있네요.
      위의 메소드가 메소드명 처럼 글이 변경될 때 호출되는 델리게이트 메소드구요, 아래 것이 서치 버튼을 눌렀을 때 호출되는 델리게이트 메소드입니다.
      참고하시면 될 것 같구요...

      2.
      1번에 답변 된 내용에 포함되는 것 같네요.
      테이블 데이터를 다시 로드하려면
      [[searchDisplayController searchResultTableView] reloadData]; 라고 다시 로드하시면 됩니다.

      처음부터 차근차근 다시 읽어보세요...^^*
      충분한 정보가 될 것이라 생각합니다~
      또한 이 내용을 잘 이해하시려면 delegate와 dataSource에 대한 이해서 먼저 필요로 합니다. :-)

      좋은 정보 얻어가셨으면 좋겠네요~

  2. Have 2012.06.19 11:49  댓글주소  수정/삭제  댓글쓰기

    첫번째 screenshot 바로 아래 단락에 말ㅆ므 라는 오타가 ! ㅎㅎ

  3. ㅠㅠ 2012.06.26 18:52  댓글주소  수정/삭제  댓글쓰기

    //request 정보를 담은 딕셔너리 생성
    NSDictionary *videoRequestDic = [[NSDictionary alloc]initWithObjectsAndKeys:
    [searchBar text],@"key",
    @"video",@"requestKind",
    [NSNumber numberWithInt:1],@"pageNum",
    nil];
    [self readyForRequestWithDictionary:videoRequestDic];
    이부분을 넣으면 잘검색이 되는데 넣으면

    2012-06-26 18:52:09.922 SearchBar[4496:707] Reachability Flag Status: -R -----l- networkStatusForFlags
    2012-06-26 18:52:12.506 SearchBar[4496:6707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'
    *** First throw call stack:
    (0x3763a88f 0x3533f259 0x3763a789 0x3763a7ab 0x37f065b3 0xb7153 0x37e20a81 0x37eb4591 0x33eaf735 0x33eaf5f0)
    terminate called throwing an exception(lldb)

    이런 로그가 뜨네요 ㅠㅠ

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

      안녕하세요 :-)
      현재 로그만으로 본다면 어디선가 전달값이 nil이라는 메세지가 나오네요...
      어디선가 데이터를 넘겨줄 때 nil값이 넘어오면 Exception을 발생시키고 뻗어버리는 메소드 들이 있습니다.
      의심이 가는 부분의 데이터들을 로그로 찍어보시고 nil값이 나오는 녀석을 찾아서 수정해 주시면 될 것 같습니다 ^^*

    • ㅠㅠ 2012.06.27 11:18  댓글주소  수정/삭제

      감사합니다. 찾아보겠습니다.

      항상 잘보고있습니다. 아직은 모르는부분이 많지만 많은 도움을 받아갑니다.

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

      네 :-) 찾게 되시면 어디서 어떤 실수가 있었는지도 알려주시면 좋겠습니다.
      고맙습니다 ^^*
      자주자주 놀러오세요 ㅎ

  4. ㅠㅠ 2012.07.02 10:38  댓글주소  수정/삭제  댓글쓰기

    xml 설명하신거 보는동안 리플이 달려있었네요 ㅎㅎ
    해답을 찾았습니다.
    URL생성에서
    NSURL *url = nil;
    if([kindOfSearch isEqualToString:@"book"]){
    url = [NSURL URLWithString:@"http://apis.daum.net/search/book"];
    }else {
    url = [NSURL URLWithString:@"http://apis.daum.net/search/vclip"];
    }
    비디오 검색 URL생성이 빠져있어서 생성을 했더니 잘나옵니다.

    많은 도움이 됐습니다!

  5. Sio 2012.07.24 14:43  댓글주소  수정/삭제  댓글쓰기

    혼자 오타내고 에러나고 찾느라 삽질하고 ㅋㅋㅋㅋ
    그래도 어찌어찌 실행은 되었네요 ㅜㅜ ㅎㅎㅎㅎ

    잘보고갑니다~!

  6. 나에게넌 2012.08.14 11:02  댓글주소  수정/삭제  댓글쓰기

    동영상 thumbnail 가져와서 테이블에 뿌려주는 부분..필요한 부분이었는데..완전 감사합니다..
    오늘도 계속 흡입흡입..

  7. 컴맹 2012.09.12 04:37  댓글주소  수정/삭제  댓글쓰기

    워낙 강의를 잘해주셔서 UISearchDisplayController 5강좌를 다 보는동안 막힌적이 없었네요.^^
    좋은 강의 감사합니다.^^

  8. MHY 2012.09.20 10:31  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 네이버카페에서 YAGOM님 강좌글을 보고 오게 되었습니다.
    작성하신 글들을 보면서 공부하고 있는데 현재 내용중에 궁금한게 있어서 혹시 이글을 보신다면
    도움을 받고 싶습니다.

    위내용으로 제이슨으로 받은 내용을 테이블뷰에 표시되는것 까진 해보았는데 테이블뷰에서 셀을 선택했을때
    해당 내용을 세부적으로 보여줄수 있는 세부뷰를 만든다면 어떻게 해야 하나여..
    데이터 배열을 해서 표시하는것은 해보았는데 이부분을 어떻게 해야하는지 모르겠습니다.
    도움 부탁드립니다.

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

      그것은 테이블 뷰 델리게이트 메소드를 찾아보시면 나올거예요~
      지금 메소드 이름이 정확하게 기억이 나지 않지만...
      selectRow가 들어가겠죠?ㅎ

  9. 귀공자 2012.10.09 10:45  댓글주소  수정/삭제  댓글쓰기


    아 에러의 원인을 찾았네요..

    제가 강의 내용을 다시 훑어 보았는데



    -(void)requestSearch:(NSDictionary *)requestDic{
    }
    ....

    함수에서


    NSURL *url = nil;
    if([kindOfSearch isEqualToString:@"book"]){
    url = [NSURL URLWithString:@"http://apis.daum.net/search/book"];
    }else {
    url = [NSURL URLWithString:@"http://apis.daum.net/search/vclip"];
    }
    란 부분을 넣어 주셔야 할 것 같습니다.
    이런 부분의 언급이 없는 것 같습니다.




  10. 한소쿠리더하기 2013.02.01 00:44  댓글주소  수정/삭제  댓글쓰기

    다 구현하고 난뒤에 검색어를 입력하면서 간혹 검색어에 따라 에러가 나는 경우가 있습니다.
    Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 15 beyond bounds for empty array'
    같은 에러가 나는데...

    혹시 검색어가 입력되는 과정에서 텍스트가 달라질때 마다 처리되는 메소드에서 입력될때마다 받아오는 어레이가 달라지면서 딜레이가 걸린 이전에 처리하던 작업이 달라진 어레이에 대입된다던가 하는 경우도 있나요?

    예를 들어서 iphok를 입력할때, ipho까지 입력했을 때 결과가 100개인 어레이여서 for 문이 0에서 99까지 돌아가고 있는데 iphok가 되는 순간 결과가 더 적은 어레이로 바뀌면서 objectAtIndex:i에서 대입하는 어레이에 없는 인덱스에 대입이 되는 종류가 아닐까 싶기도 하고...

    같은 검색어를 입력해도 인디케이터가 다 돌아갈때까지 기다렸다가 한글자씩 천천히 입력하면 에러가 안나는데 빠르게 입력하면 저 에러가 종종 일어나는 것 같고. 에러가 났다 안났다 하니 원인을 알수가 없습니다.

    이미지를 어레이에 넣는 부분을 막으면 에러가 안나구요.

    일단 이미지가 nil이 아니면 이미지를 어레이에 추가하는 부분에
    if (i >= [videoItemArr count]) {
    break;
    }
    와 같이 i가 갯수보다 크거나 같으면 멈추게 하게 하겠다고 이거 넣고 나서는 오류가 안나긴 하는데...

    실제로 제가 예상한 것과 같은 일이 생길수도 있나요? 아님 다른 이유가 있을까요?

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

      아무래도 말 그대로 튜토리얼이기 때문에 완벽할 순 없습니다...ㅎ
      말씀하신 내용도 충분히 발생할 수 있는 여지가 많습니다 ^^;

  11. Favicon of https://gogodao.tistory.com BlogIcon rustyDAO 2013.02.18 16:59 신고  댓글주소  수정/삭제  댓글쓰기

    하 ~ 완벽해요 @.@ 완벽해 ㅠㅠ
    ㅋㅋ 갈수록 눈이 트이네요 ^.^

    url설정하는거 video따로 안해준거는 윗분들이 이미 댓글 다셨네요 ㅋㅋ 반년전에 ㅋㅋㅋ

    야곰님 빨리 쾌유하세요 ^^

  12. dklee7206 2013.07.10 16:15  댓글주소  수정/삭제  댓글쓰기

    안녕하세요~ 강의 잘 보고 있습니다. 중간 중간 따라하다 막히는 부분이 있어서요..
    혹시 강의 자료 소스코드 메일로 보내주실수 있을까요?
    dklee7206@naver.com 입니다.

    앞으로 왔다 갔다 하다가 흐름이 끊겨서요.. 틀린거 있는지 체크해보려구요..

    감사합니다.

  13. djsa 2016.04.17 12:24  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.강좌 잘 보고있습니다. api요청에서 NSURLConnection 이게 잘 안되더군요.ㅠ.ㅠ
    그래서 session으로 했는데 오류 뜨네요.
    제 다른 건 다 같고 http 요청 보내는 걸 이렇게 썼습니다.

    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *defaultSession =[NSURLSession sessionWithConfiguration:defaultConfigObject];
    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:request completionHandler:^(NSData *data,NSURLResponse *response, NSError *error){
    NSLog(@"Response:%@ %@\n",response, error);
    if(error== nil){

    NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    NSLog(@"Data = %@", text);
    NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

    NSLog(@"result:%@",resultDic);

    if([kindofSearch isEqualToString:@"book"])
    bookSearchThread = nil;
    else
    videoSearchThread = nil;


    }
    }];
    [dataTask resume];
    근데 로그에 이렇게 남습니다
    2016-04-16 20:11:25.123 GoogleMap[2608:647075] Percent
    2016-04-16 20:11:25.129 GoogleMap[2608:647931] Response:(null) Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSUnderlyingError=0x7fadcbf04340 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}, NSErrorFailingURLStringKey=http://apis.daum.net/search/book, NSErrorFailingURLKey=http://apis.daum.net/search/book, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.}

    제가 뭐 잘못했는지 도무지 모르겠습니다.

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

      안녕하세요 :)
      답변이 늦어 죄송합니다.
      구글에 iOS 9 secure connection이라고 관련 검색을 하시면 관련 내용을 찾아보실 수 있을 거예요 :)

오늘은 네트워크 상태 체크하는 방법에 대해 간략하게 소개합니다~

네트워크 상태 체크하는 API는 따로 없지만 애플에서 공식적으로 클래스를 제공해 주고 있습니다~

# '나는 고수다' 하시는 분들은

1. Reachability Link 를 들어가서 샘플코드를 다운로드 받은 후에 Classes 폴더 내부의 Reachability 헤더와 구현파일을 자신의 프로젝트로 가져온다.
2. Systemconfiguration.framework를 추가한다.
3. 사용을 원하는 곳에 Reachability.h 를 임포트하여 사용한다.
4. 간략한 소스를 원한다면 Classes 폴더 내의 AppDelegate 구현파일을 참고한다.
5. 만약 Reachability를 넣고 링크 에러가 난다면 글 맨 아래를 참고한다.

# 위의 내용이 이해가 안간다 하시는 분들을 위해 깨알 캡쳐~

먼저, Systemconfiguration 프레임 워크를 추가합니다.

 



그리고 이쁘게 클래스 파일을 가져오기 위해 그룹도 하나 만들고 Reachability라고 이름 지어 줍시다~

 
그 후에 직접 클래스 구현 파일을 가지러 가야겠죠?ㅎ

요기 Reachability Link 를 따라서 가 봅시다~

여기서 Download Sample Code 를 클릭!


다운로드 받고 압축을 풀면 이렇게 파일들이 나타나는데요~
여기서 Classes 폴더에 들어가보면~~~


이런 녀석들이 있는데, 그 중에 Reachability 라는 두 녀석을 끌어서 아까 만들어둔 그룹으로 끌어옵니다~


이렇게 화면 나오면 파일 추가 해주시구요~


 Reachability 헤더를 임포트 합니다.



그리고 네트워크 체크 메소드를 구현해 주고, 원하는 상황에 체크하여 알림을 주면 끝~!



#만약 링크 에러가 나다면!?
Reachability.m 파일이 타겟지정이 되어있는지 확인합니다~!




by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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




 

Posted by yagom

댓글을 달아 주세요

  1. 앱만들자 2012.07.29 09:06  댓글주소  수정/삭제  댓글쓰기

    잘보고 배웁니다ㅡ 감사드립니다...

    tcp/ip소켓으로 통신하는데 안되는 부분이 있어 질문을 드립니다........

    소켓이 잘되는데 아이폰의 전원 버튼과 그냥두면 화면이 검정색으로 되는 절전모드로 바뀌는데 이때 소켓 tcp/ip 네트워크가 끊어짐니다... 끊어진후 다시 어플 실행하면 잘되는데 네트워크만 끊어진 상태로 되는데 왜 그런지? 아니면 애플 정책이라 그런지
    아니면 background모드로 갈때 어떤 설정을 해야하는지 모르겠네요
    조언 부탁드립니다...

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

      안녕하세요 앱만들자님.
      구글에 검색해 보니 젤 처음 글에서 해답이 나오네요~
      검색어 : iOS Socket background
      http://stackoverflow.com/questions/8973252/presistent-socket-in-background-ios
      참고하시기 바랍니다.

  2. 나에게넌 2012.08.14 09:59  댓글주소  수정/삭제  댓글쓰기

    나는 고수다!!!!!!!!!!!!!! 가 아닌데..발도장 찍고 갑니다..

  3. 새벽다섯시반 2013.06.24 16:15  댓글주소  수정/삭제  댓글쓰기

    잘보았습니다 야곰님 ㅎㅎ
    궁금한게 있는데요. 네트워크를 실시간으로 체크를 하고 싶은데 어떤식으로 하면 될까요?
    ios버전도 달라져서 지원안되는 부분도 꽤 있더라구요,;
    설명 좀 부탁드려도 될까요?

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

      안녕하세요 :)

      저도 네트워크 실시간 상태체크 때문에 고민을 많이 했었는데요...

      결론은 공식적인 방법으로 불가능하다 입니다.

      실시간으로 네트워크가 아예 끊겼다, 살았다 하는 것은 이것으로 체크할 수 있지만

      네트워크가 연결되어있긴 하지만 통신이 제대로 이루어지고 있다.. 는 공식적으로 체크할 수가 없습니다...^^;

      * 실시간 체크를 네트워크가 끊어짐을 실시간으로 체크하는 방법이라고 말씀하신거면 Reachability로 검색하시면 많이 나올거예요 ^^


오늘의 주제

1. Thread 중지하기
2. 네트워크 상태 체크



서른 여덟번째 시간입니다.^^

그 전에 오늘은 현충일이네요!
나라를 위하여 목숨을 내던진 우리 선조님들에게 경의를 표합니다. 진심으로 고맙습니다.

지난 번에 테이블에 파싱 결과를 뿌려주는 것을 해 보았는데요, 코드에 결점을 발견하게 되어 수정사항과 보강사항에 대하여 포스팅 합니다.
이렇게 자꾸 예외상황에 대해 코드를 추가 해 주고, 실수 한 부분에 대해서는 다시 작업을 해 주어야 겠지요..ㅋㅋㅋ
이 또한 프로젝트를 진행하는 묘미 아니겠습니까..ㅋㅋㅋ
여하튼 한 발 늦춰 가더라도 틀린 부분을 다시 짚고 넘어가기 위해 포스팅 하므로, 급한 마음 조금만 누그러뜨리시고 봐주시기 바랍니다~

자, 그럼 가봅시다~!

# Thread 중지(취소)하기

일단 스레드 중지를 위해서 중복적으로 사용되는 코드들을 메소드로 묶어서 구현하였습니다.
그리고 검색 바에서 사용자가 취소버튼을 눌렀을 때, 스레드가 취소되고 검색이 중지되어야 하는 것이 맞으므로 검색바 델리게이트 메소드 중에 하나인 searchBarCancelButtonClicked 메소드를 이용해 취소시에 중지하도록 구현하였습니다. 부족한 부분을 하나씩 보강해 나가는 것이죠...^^;


그리고 네트워크를 사용 중일 때에는 네트워크 인디케이터를 켜줘서 사용자에게 네트워크를 사용중임을 알려주어야 합니다.
만약 네트워크 상태 인디케이터를 켜지 않는다면 애플의 검수과정에서 어플 등록이 반려(리젝)될 수 있습니다. 사실 네트워크 인디케이터는 // 결가 값 받기 라는 주석이 처리되어 있는 부분 위쪽에 구현하는 것이 더 정확하겠네요^^;
또, 지난 번에 스레드를 cancel 이란 메소드로 취소 했던 부분이 있는데요, 제가 개발문서를 보면서 이게 과연 취소하는 것이 맞나 싶을 정도로 직접적인 취소에 관한 언급이 없었습니다. 그래서 다시 구글링해서 찾아본 결과 그것은 스레드 자체에 취소 명령을 내리는 것이 아니라 스레드가 취소 될 예정이다, 라고 스레드에 표시만 해 놓는 역할이었습니다. 그래서 스레드가 관할하고 실행하고 있는 메소드 내에서 스레드가 취소예정이라고 판단이 들면 자기 스스로 종료를 해야 한다는 것이었습니다. 
그래서 추가적으로 코드를 넣어주어야 했습니다. 이로서 스레드가 완전히 멈추게 되었습니다.


자, 그리고 또 빠뜨린 것이 있었는데요, 네트워크 상태 체크하는 부분입니다.
아무리 검색기능이 잘 구현되어 있더라도 네트워크에 접속되어 있지 않다면 무용지물입니다...^^
네트워크 상태를 미리 체크하여 사용자에게 알려줄 수 있도록 처리해봤습니다.
일단 프레임워크 하나가 필요합니다.
프레임워크 추가를 해 봅니다. 아래 그림을 봐도 되구요
2012/03/29 - [iOS Dev/깨알 Tips] - Xcode4에서 Framework & Library 추가하기 를 참고하셔도 좋습니다.


SystemConfiguration.framework 를 추가합니다.


그리고 네트워크 상태체크에 필요한 소스파일들이 있는데, 그녀석들을 넣어줄 그룹을 하나 만들어 봅시다.
Root폴더(여기서는 WithYagom 이라는 노란 폴더) 에서 우클릭해서 New Group 를 클릭!
새로운 그룹이 만들어지면 Reachability라는 이름으로 만들어 줍시다~


그리고 이제 그 필요한 녀석들을 찾아 떠나봅니당 ㅎ

Reachability라는 녀석을 애플에서 제공을 합니다. 그녀석을 받아올거예용ㅎ

Link : Reachability 

링크를 따라가서 Download Sample Code 라는 녀석을 클릭~!


다운받아서 압축을 풀어보면 이렇게 풀리는데요~
Classes 라는 폴더에 들어가 보면~~~~~


요렇게 네 파일이 있는데 그 중에 Reachability 두 파일을 쭈욱 끌어다가 아까 만들어둔 그룹으로 끌어옵니당~
사실은... 이렇게 따라하는 방법이 정석이지만, 우리는 지금 ARC를 사용하고 있기 때문에 이 방법으로 하면 에러가 나고 말거예요 ㅠ_ㅠ


그래서 제가 ARC 사용 중 ARC가 아닌 것들을 사용할 수 있는 방법을 포스팅 해 두었습니다~
화내지 마세요~ 뿌잉뿌잉~
2012/08/13 - [iOS Dev/깨알 Tips] - 특정파일 ARC 제외시키기
파일들을 추가 한 후 위의 포스팅을 따라하시면 됩니다 :)

 



그럼 이렇게 파일 추가 옵션이 나오겠죠?
추가합니다용~ㅎㅎ 


일단은 헤더에서 우리는 경고창을 띄운 후 사용자가 클릭하면 모달뷰를 종료시키려고 하니까, 얼럿뷰 델리게이트를 선언해줍니다.


그 후에 구현파일에 와서 Reachability 헤더를 임포트 해주고 


얼럿뷰 델리게이트 메소드를 구현해 주구요~
네트워크 상태 체크를 위한 메소드 하나를 만들어 줍니다.
저는 isNetworkEnable 이라는 메소드를 만들어 주었구요~
처음 로드 되었을 때 실행되는 viewDidLoad 메소드에 네트워크 상태 체크를 해보고 연결이 되어있지 않으면 경고창을 띄우고 취소 버튼을 누르면 모달뷰를 종료하도록 처리했습니다~



### 혹시나 Reachability를 사용할 때 링크 에러가 나시는 분들은 이렇게 타겟 지정이 되어있나 확인해 보세용~



자, 이렇게 오늘도 알차게 코드를 완성해 나가고 있습니다용~ㅎㅎ
한 걸음 한 걸음 해가면서 기초도 다지고, 개념도 익히며 나가보려 해요~

조금 어렵고 힘들고, 조급함이 느껴질 수 있겠지만, 천천히 따라오세요~^^*

필요한 부분이나 궁금한 점 댓글 남겨주세요!


by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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



Posted by yagom

댓글을 달아 주세요

  1. Favicon of http://blog.naver.com/wallabi BlogIcon 지호지호지호 2012.06.06 19:15  댓글주소  수정/삭제  댓글쓰기

    실명을 걸고 글을 남깁니다. 거의 매일매일 IOS 개발로 글을 올리시는 그 열정과 실력에 감탄하며 특히나 지금 저도 겁나게 고생하고 있는 UISearchBar의 사용(Daum API사용)을 올려주셔서 이틀밤을 샌 저는 맨붕과 함께 무한한 감사를 느끼고있습니다. 제가 다음 API의 로컬 기능과 지도 기능을 이용하여 목록 및 지도를 만들고 있는데 혹시나 주소 검색하는 기능도 알려주셨으면 합니다. 에...또.....제가 허접해서 그러는데 이상하게 시뮬레이터를 구동한다음 국가변경으로 한국으로 변경해도 키보드에 글로벌 표시가 뜨지 않는데 그거에 대해 조언도 남겨주셨으면 합니다. 사랑합니다.(남자입니다. 죄송합니다.)

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

      일단 키보드는 팁 게시판으로 내일 올려드리겠구요~
      로컬 기능 사용하는 것은 어차피 다음 API 가이드 따라서 제가 설명해 놓은 포스팅과 적절히 섞어서 보시면 될 것 같아요^^;
      제가 해 놓은 것 기반으로 따라하다가 막히는 부분 있으면 따로 질문 부탁드릴게요^^.
      요즘 저도 프로젝트 때문에 정신이 없어서 자세히 해 드리지 못하는 점 정말 죄송합니다 ㅠ_ㅠ
      막히는 부분 질문 주시면 언제든 답변 드릴 준비 되어있으니 도전해 보시길 권해드립니다^^...
      6월 8일날 SearchDisplayController 추가 포스팅이 올라오니 참고하세요~!

  2. Sio 2012.07.24 12:32  댓글주소  수정/삭제  댓글쓰기

    하.. 제대로 따라 했는데도 몇번이고 확인 했는데도 에러가 나서 한참이나 뭐여 이건 ㅜㅜ 상태였습니다 ㅜㅜㅋㅋㅋㅋ
    근데 완전 간단히 해결 ㅡㅡ;;;;

    저는 isNetworkEnable 이 viewDidLoad보다 아래 쪽에 있으면 에러가 나더라구요 ㅜㅜ

    및에 있다고 못찾아 온건지;; 다음부턴 위치도 보면서 코드를 작성해야겠어요 ㅜㅜ ㅋㅋㅋ
    암튼 잘보고갑니다~!~!~!

  3. 나에게넌 2012.08.14 09:51  댓글주소  수정/삭제  댓글쓰기

    날이 밝음과 동시에 오늘도 폭풍흡입합니다..이러다가 머리가 컬투보다 커질 기세네요...(컬투형들 미안요;;)

  4. Favicon of https://gogodao.tistory.com BlogIcon rustyDAO 2013.02.18 14:36 신고  댓글주소  수정/삭제  댓글쓰기

    야곰님 Run 버튼 우측에 WithYagom(플젝이름) > iOS Device 해 놓으면 맥이랑 연결된 iOS장치에서 디버깅되는건가요??
    으난왜안되짘ㅋ 아이폰5도 안되고 뉴패드도 안되고,,,버전 맞추는거 다 한거 같은디.ㅠㅠ 맨날 iPhone 6.0 Simulator로 맞춰놓고 디버깅하고있어요 ㅋㅋㅋ

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

      혹시 개발자 무료계정을 쓰고 계신가요?
      만약 유료 계정이라면
      Xcode - Window - Organizer - Device 에서 해당 디바이스를 포털에 등록 후 시도해 보세요 :)

    • 김다오 2013.02.20 11:38  댓글주소  수정/삭제

      아 ~ 되네요 ㅋㅋ 꺠알 팁도 얻어가네용 감사감사 ㅎㅎ

  5. Chris Jeong 2013.08.17 13:17  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 안드로이드 개발하다 근래에 IOS로 넘어온 사람입니다.
    우선 감사하다는 말씀 드립니다 ㅠㅠ 정주행 해보니 ios의 구조에 대해 점점 감이 오네요.

    한가지 질문 드리고 싶은게 있는데 이 예제의 스레드에서 cancelled를 체크하는 구문이 네트워크 커넥션을 마친 다음 네트워크 상태바를 끈 후에 하도록 되어있는데 이렇게 구현한 이유가 있는지요? 메소드 시작 부분에서 isCancelled를 체크하는 편이 부하를 줄이는 데에 좋지 않은지 궁금해서 여쭤봅니다.

    다시 한번 좋은 포스팅 감사합니다!!

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

      안녕하세요, 크리스님 반갑습니다 :)
      메인 스레드에서 볼 때는 새끼 스레드를 통한 비동기 통신이지만, 데이더를 받아오는 새끼스레드 내에서는 동기 통신을 하기 때문에 (NSData *response 쪽을 보시면 동기통신으로 결과값을 가져옵니다) 값을 가져오는 동안에는 체크를 하지 못하구요, 가져온 후에 스레드가 취소된 상태면 거기서 마쳐버리도록 한 것입니다.
      즉, 동기 통신을 들어가기 전에는 순식간에 처기가 되기 때문에 그다지 취소 플래그가 큰 의미가 없다고 판단한 것입니다.
      이해가 되셨는지요..?
      제가 틀리거나 잘못 설명한 부분이 있다면 꼭 다시 알려주시면 고맙겠습니다 :)
      찾아주셔서 영광입니다 ^^


오늘의 주제

1. 테이블 뷰에 파싱결과 뿌리기


서른 일곱 번째 시간입니다.^^

지난 번에는 웹에 자료를 요청하고 JSON으로 결과를 받아 파싱하는 과정까지 해 보았습니다.
잘 실행 되셨나요?
계속해서 코드의 양이 늘어나고 어려워 지고 있습니다 +_+
코드의 양도 많고 해야 할 것도, 처리해 줘야 할 것들도 많기 때문에 코드에 일일히 설명을 자세히 달기가 더 어려워지고 있습니다 ㅠ_ㅠ

여러분께서 부족한 부분은 질문을 주셔서 채워주셔야 합니다~!

그럼 오늘 또 차근차근 스텝을 밟아 나가 볼까요?ㅎ

렛츠고~~~~~~~~~


# 테이블뷰에 결과 띄워주기

자, 파싱된 결과를 활용해 주어야 하기 때문에 적절히 딕셔너리와 배열 포인터를 헤더에 선언해 줍니다.


변수를 만들어 줬으면 초기화와 마무리는 꼭 해주어야 하는거 잊지 않으셨죠?ㅎ


그리고 조금 더 편하게 읽을 수 있도록 enum 하나를 만들어 주었습니다.
enum에 대해 잘 모르시겠다구요?
2012/05/24 - [C] - C <20>. enum 요녀석을 참고해 주세요 ㅎ


그리고 이제 본격적으로 코딩에 들어갑니다~
지난 번에 요청을 해서 결과를 딕셔너리로 받아왔죠?
그녀석을 이제 적절히 포인터 변수에 넣어주고, 우리가 정말로 필요로 하는 item 녀석들을 따로 보관해 주기 위해서 Mutable Array를 만들어 줍니다.
우리가 웹에 요청하였을 때 반환되어 오는 데이터들에 대해 궁금하시다면 http://dna.daum.net/apis/search/book 에서 자세히 확인해 보세요 ㅎ


그리고 재검색을 할 때에는 지난 자료들은 필요가 없어졌으니 다시 초기화 해줄 필요가 있어서 초기화 메소드를 따로 만들어 주었습니다.
그래서 다시 검색을 하고자 할 때 초기화 메소드를 먼저 호출해 주고 시작하게 했습니다.


또한 우리는 한꺼번에 모든 검색결과를 보여줄 수 없으니 일부분만 검색 결과를 받아오게 됩니다. 그런데 남은 검색결과가 더 있다면 테이블의 맨 아래 셀을 눌렀을 때 데이터를 더 불러오도록 하려고 매번 검색 후에 이것이 검색이 끝났는지 체크를 합니다. 그 메소드를 구현해 주었구요.
본격적으로 테이블 데이터소스 코드를 넣어줍니다.
간략한 설명이 코드와 함께 주석으로 있으므로 참고하시구요...
데이터 소스 메소드들의 리턴값(반환값)들로 테이블이 움직인다고 해도 과언이 아닙니다. 동작을 잘 파악해 보도록 하세요.
참고로 return ... 이 호출되게 되면 그 메소드는 반환값을 전달한 후 더이상 진행되지 않고 끝나버립니다.
이해가 되지 않는 부분이 있다면 5번 더 코드를 해석해 보시고 더 생각해 보세요. 그리고 정 모르겠으면 그 때 댓글 주세요 ㅎ 스스로 연구해 봐야 실력이 팍팍 늘어요 ㅎ



이제 거의 다 왔습니다 ㅎ
데이터소스의 마지막 메소드를 이렇게 채워줍니다.
바로 각각의 셀(테이블의 칸칸)을 만들어 주는 메소드입니다.
지난 번에 복사해온 코드에서 약간 변경이 되었으니 처음부터 하나하나 잘 코딩해 보세요.
여기서도 마찬가지로 retrun 이라는 키워드가 나오면 반환값을 주고 메소드는 종료되어버립니다.
왜 중간에 뜬금없이 마지막 셀을 체크하는 조건문이 나왔는지 잘 생각해 보세요.


자, 이렇게 필수 코딩은 마쳤구요, 마지막으로 아까 위에서 만들어준 초기화 메소드로 처음 초기화와 마무리를 세줄에서 한 줄로 다시 간략화 해줬습니다. ㅎ 이것이 메소드의 힘이죠? >_<ㅋ


실행하고 검색해 보았습니다.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아 근데 왜 이따위로 나오죠?ㅋㅋㅋ
저도 잘 모르겠습니다 +_+
일단 대충 뭔가 맞는거 같긴 한데 왜 이렇게 나오는지는 저도 몰라서 급 패닉상태에 빠졌습니다.
이번 포스팅은 제가 다 해보고 포스팅 하는게 아니라 저도 해보면서 포스팅 하는거라 이런 결과가 나왔네요 =_=ㅋㅋㅋ
다음 오픈 API도 처음 써보는거라..ㅋㅋㅋ
여하튼 뭐 이런식으로 나왔습니다!!ㅋ


다음번에는 책의 대표이미지를 웹에서 불러와서 셀에 넣어주는 과정을 해 볼게요 ㅎ

다음 포스팅도 기다려 주실거죠? +_+ㅋ

아... XML은 언제하지..ㅋㅋㅋㅋㅋㅋ 곰방할게용~


by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

  1. 2012.06.20 17:54  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

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

      아직 소스코드를 열어보지 않아서 잘 모르겠지만, 일단 추측을 남겨드리면
      현재 저 title이라는 녀석은 그 상위 딕셔너리에서 title이라는 키로 연결되어있는 하위 딕셔너리입니다.
      그러므로...
      저거보다 상위 딕셔너리를 item 딕셔너리라고 한다면.
      NSString *contentStr = [[item objectForKey:@"title"] objectForKey:@"content"];

      이런식으로 하면 내용물을 뽑아올 수 있겠군요..^^

      답변이 늦어서 벌써 해결하셨으려나요..ㅎ

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

      소스 코드를 보니 로그로 찍어보신 rrr이란 녀석이 배열로 되어있군요.
      배열안에 딕셔너리들이 들어가 있습니다.
      [[rrr objectAtIndex:indexPath.row] objectForKey:@"content"];
      이런식으로 추출할 수 있을 것 같습니다~!

    • 페이퍼 2012.06.21 16:22  댓글주소  수정/삭제

      완전 yagom님 덕분에 모르는게 하나씩 풀려갑니다.~^^
      대박 감사드려요~!..
      언제 한번 찾아뵙고 많은걸 여쭤보고 싶습니다.^^ㅎ

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

      네~^^ 언제든 환영합니다 ㅎ
      블로그도 자주자주 놀러오세요 ㅎ

  2. Favicon of https://icenacho.tistory.com BlogIcon 은빵(은또구리) 2012.07.19 16:34 신고  댓글주소  수정/삭제  댓글쓰기

    강좌 잘보고있습니다~
    궁금한점이 하나 있는데
    저는 야곰님처럼 비디오/북 처럼 2가지 이상을 가져오는게 아니고
    하나에 대한 데이터만 가져오고있는데
    그래도 쓰레드를 쓰는게 좋은가요 ???

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

      네, 만약에 통신하는 메소드를 쓰레드 없이 메인쓰레드에서 실행하게 된다면 그 통신이 끝날 때 까지 앱은 먹통이 될 것입니다. 물론 비동기방식의 통신을 사용하면 자동으로 쓰레드로 붙여줄 것입니다.
      만약 풍선팡님의 경우에는 비동기방식의 통신을 사용하신다면 알아서 스레드가 생성되기 때문에 크게 무리는 없을 것으로 생각됩니다...^^
      지금 보시면 리퀘스트에서 sendSynchronousRequest를 보내는데, 이 방식이 동기 방식입니다.
      그리고 비동기방식(asynchronous) 방식에 대해서도 검색해 보시면 분명 자료가 나올거에요^^

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

      흐허허 제가 반대로 말씀드렸네용~ 댓글 수정했습니다.
      저도 가끔 헷갈려서 +_+ㅋ
      제가 사용한 방법은 동기(Synchronous)식입니다.
      비동기(Asynchronous)방식을 사용하시면 됩니다.
      풍선팡님 블로그에 적어두신
      http://eunrocket.tistory.com/160
      글에 보면 비동기방식으로 작성되어 있네요 :)

  3. Favicon of https://icenacho.tistory.com BlogIcon 은빵(은또구리) 2012.07.20 12:15 신고  댓글주소  수정/삭제  댓글쓰기

    감사합니다~ 찾아볼꼐요^^!

  4. Sio 2012.07.20 17:10  댓글주소  수정/삭제  댓글쓰기

    안녕하세욤~! *^^*
    으~~ 오늘도 어렵군요 ㅡㅡ;;;;ㅋㅋㅋ
    음.. 코드에서요 objectForKey에 들어가는 @"channel"이라던가 @"requestKind" 같은 애들은 어디서 오는 아이들인가요 ㅜㅜ;;
    channel은 JSON결과 값을 받은 거에서온것 같은데 맞는지 모르겠고..
    또 맞다면 이런 명칭을 가졌다는 것은 어떻게 알수 있나요?

    별거 아닌 쉬운걸 질문하는 건가... 앞서 나온건데 제가 대충한건가 해서 뭔가 물어보기도 민망하네요 ㅜㅜ;;;;
    근데 헷갈리기 시작하니깐 끝이 없어서 질문합니다 ㅜㅜ

    아 그리고요 동영상 아이템 배열을 초기화 하는 곳에서요 그림에선 bookItemArr라 되있는데 videoItemArr이 아닌가요????

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

      안녕하세요 Sio님~
      오늘도 붙같은 덧글 고맙습니다 :-)

      첫 번째 질문은 정독해 보시면 충분히 답을 얻으실 수 있다고 생각이들구요 ^^

      두 번째 질문은 Sio님 말씀이 맞습니다 ㅎ
      복사 붙여넣기의 폐해지요 ㅎㅎ +_+

  5. 나에게넌 2012.08.13 18:59  댓글주소  수정/삭제  댓글쓰기

    강의 잘 보고 있습니다..계속적인 복습이 필요할 것 같네요..

    질문 있어요!!

    tableView Delegate numberOfRowsInSection에서
    마지막 줄에 return 0; 이 뜻하는 건 뭔가요??

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

      만약 switch문에서 적절한 section 값이 아니라서 switch문 안에서 return하지 않고 밖으로 나온다면 적절한 값이 section값으로 들어왔다고 볼 수 없습니다.

      그렇기 때문에 numberOfRowsInSection 메소드, 즉 '테이블의 각 섹션에 줄 수' 를 리턴해 주는 메소드 이기 때문에 제대로 된 값이 오지 않았으므로 이 테이블은 유효하지 않다. 즉, 이 테이블의 줄 수는 0개이다. 라고 리턴해 주는 것이지요.

      오늘 불같은 덧글 정말 고맙습니다.
      너무 빨리 흡입하시면 탈납니다 ^^;

  6. 2012.09.13 16:46  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  7. 2012.10.22 17:09  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

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

      안녕하세요 ㅇㅈㅁ님 :)
      말씀해주신 내용만으로는 제가 뭐라고 답변해 드리기가 곤란하네요^^;
      좀 더 정확한 정보가 필요할 것 같습니다...ㅎ

  8. 초보에꿈 2013.01.09 10:26  댓글주소  수정/삭제  댓글쓰기

    열심히 따라 하고 있는데 ㅠ_ㅠ... 리스트가 나오지 않고 있네요 ;;;.. 이게 어떤 문제인지 .. 프로젝트를 다 날려서 다시 코딩했는데도

    변한건 없어서 ;;... 여기서 막혀버리네요 ^^;;;... 어디가 문제인지도 모르겠습니다...

  9. 초보에꿈 2013.01.09 14:42  댓글주소  수정/삭제  댓글쓰기

    daum api 가 바뀐듯 싶은데요 요청변수에 output 이 json 일경우 callback 을 써야 한다고 되있더라구요

    이럴경우엔 어떤식으로 수정해야 하는지 .....

    로그로 리스트는 잘 나오는데 배열에 담을수가 없네요 ;;... ㅠ_ㅠ

  10. hongs 2013.01.28 18:26  댓글주소  수정/삭제  댓글쓰기

    배열에 데이터는 들어가 있는데
    '[[searchDisplayController searchResultsTableView] reloadData];'를 호출해도
    '- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView'이 호출되지 않는 이유는 뭐가 있을까요?
    '- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText'에서 테이블이 갱신되는 것을 보면 delegate와 file's owner 연결은 이상없는 것 같은데요.
    reloadData를 호출해도 테이블 갱신이 안되서 테이블에 데이터를 못 불러오네요.

  11. hongs 2013.01.28 23:31  댓글주소  수정/삭제  댓글쓰기

    근데 희한한게 테이블 갱신은
    '- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText' 메소드가 호출될 때만 되네요. -_-;;
    UISearchDisplayController 이거 참 이상해요.

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

      오이잉 그런가요?
      저도 알지 못했는데요+_+
      이상한 일이군요... 아직도 계속 그러신가요?
      reloadData
      호출하면 갱신이 되어야 할텐데...
      여기 뭔가 두 가지 답변이 있는 것 같은데 도움이 되면 좋겠네요~
      http://stackoverflow.com/questions/4702945/reloading-displaying-searchresultstableview-of-uisearchdisplaycontroller-after

  12. hongs 2013.01.30 11:44  댓글주소  수정/삭제  댓글쓰기

    UISearchDisplayController라는게 검색바와 테이블뷰를 같이 제공해주는 컴포넌트이다 보니 테이블 뷰 커스터마이징에도 제한이 있는 것 같고. 이 컨트롤러의 목적도 검색버튼 이벤트를 통해서 네트웤으로 데이터를 가져와서 뿌려주는 경우보다는 DB나 배열 등 이미 존재하는 데이터를 가지고 텍스트를 입력할 때마다 검색결과를 갱신해서 보여주는 경우에 더 적합한 것 같습니다.
    이런 종류의 편의를 배려한 컨트롤러보다는 그냥 뷰 단위로 세세하게 따로 쓰는 게 상용어플에서는 더 맞는거 같네요. 고객의 요구사항이 어떻게 나올 지 모르니 -_-;

    [searchResultsTableView reloadData]가 안먹는거는 정말 치명적이군요. 제가 잘못하고 있는건지는 모르겠지만. 기존에 테이블뷰 쓸 때는 잘만 썼는데 -_-;;

  13. 한소쿠리더하기 2013.01.31 12:40  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 ^^
    강좌 진심으로 감사드리며 보고 있습니다.

    지금까지 쭉 따라오다가 이 강의에서 에러가 났습니다.
    검색 창에 검색어가 들어가는 순간 앱이 죽더라구요.
    에러 메시지를 살펴보니


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    에서 문제가 생기더라구요.

    도움말을 봐도
    important: You must register a class or nib file using the registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier: method before calling this method.
    라고 되어 있는데 registerClass:forCellReuseIdentifier: 메소드로 클래스를 등록하라는 소리 같은데 어떻게 해야될지 좀 막막하고 ...

    좀더 찾아보니 위 메소드 대신에

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    를 사용하면 된다고 해서 사용해봤더니 잘 작동하더군요.

    (참고사이트
    http://stackoverflow.com/questions/12737860/assertion-failure-in-dequeuereusablecellwithidentifierforindexpath)

    그래서 다시 봤더니 이게 야곰님께서 포스팅하신 원래 메소드였다는;;;

    아마 임시로 테이블클래스 만들어서 긁어올 때 생기는 디폴트 값이
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];에서
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];바뀌어서 생긴 문제 같습니다.

    위 사이트 댓글을 읽어보면 셀이 nil인지 체크할 필요가 없게 한 훌륭한 발전이라고 한 것도 있고 막 화내는 사람도 있는데요 ㅋㅋ

    궁금한 것은 도움말에 있는 것 처럼 처음 메소드를 registerClass:forCellReuseIdentifier: 메소드로 클래스를 등록해서 사용한다면 어떻게 해야하는 걸까요?

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

      ㅎㅎ xib파일에서 Identifier를 정해 줄 수 있어요. 그 부분을 말하는 것 같은데요.

      그래도 해결 방법을 찾으셨다니 다행입니다 ㅎ

  14. 카피커피코피구피 2014.05.13 16:32  댓글주소  수정/삭제  댓글쓰기

    뒤늦게 ios 개발을 배우다가 야곰님을 알게됐는데 정말 대단하십니다.
    매일 매일 한 강의씩 따라하면서 잘 배우고 있습니다.
    그런데 요번 강의부터 막히는 부분이 발생해서 머리가 터질거 같네요.
    배열에 검색결과를 가져오는것 까지는 확인했는데 View에 뿌리는 부분에서 자꾸만 앱이 죽네요.
    Stack Overflow 사이트에서도 답을 못찾았습니다.

    실행하면
    // 검색 결과가 나왔으므로 테이블을 새로 고침
    [[searchDisplayController searchResultsTableView] reloadData];
    이 줄에서 "Thread7:signal SIGABRT"가 발생하여 죽네요.

    죽을 때 발생하는 로그 메세지는 다음과 같습니다.

    2014-05-13 16:24:08.088 MyWebView[1386:61b] -[UISearchBar searchResultsTableView]: unrecognized selector sent to instance 0x1084b380
    2014-05-13 16:24:08.101 MyWebView[1386:61b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UISearchBar searchResultsTableView]: unrecognized selector sent to instance 0x1084b380'
    *** First throw call stack:
    (0x150f012 0x1334e7e 0x159a4bd 0x14febbc 0x14fe94e 0x557a 0xd7f805 0xd7f764 0x92b7a5b7 0x92b64dce)
    libc++abi.dylib: terminate called throwing an exception
    (lldb)

    도와주세요.
    참고로 저는 xcode 4.6.3을 쓰고 있습니다.

'아퐁'님의 요청으로 만들어 보았습니다~

버튼을 누를 때 마다 이미지가 바뀌도록 설명해 달라고 하셔서 해 봅니다.

일단 추천 한방 어떠세요 ㅋㅋ



시작!

화면에 버튼을 올리고 액션을 연결해 줍니다.


그리고 버튼에 사용할 이미지를 프로젝트에 추가해 주고, 버튼 이미지를 눌리지 않은 상태로 변경해 줍니다. 



그리고 요로코롬 깔쌈하게 메소드를 코드로 채워주면 끝~!


잘 되나 확인해 볼까요?ㅎ

 

굿 웍~!



↓↓↓도움이 되었다면 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 고맙습니다~ ↓↓↓


Posted by yagom

댓글을 달아 주세요

  1. 인절미후후 2012.06.14 15:42  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다~
    제가 얼마전 버튼의 텍스트를 변경하는데서 안되서 조금 고생을 했었습니다.
    버튼에 아웃렛과 액션을 연결시켜주고
    버튼클릭시에 해당 버튼의 텍스트를 변경시켜주려고 했었는데요
    action매서드{
    if(isOn){
    btn.titleLable.text = @"Off";
    isOn = NO;
    }
    }
    대강 이런식으로 했더니 안되더라구요.

    위의 소스처럼
    [publicButton setTitle:@"ON" forState:UIControlStateNormal];
    으로 변경하니까 되더라구요~
    이 글을 이전에 잘 읽어뒀더라면 구글검색하는 고생을 안했을텐데 ㅎㅎ;
    그리고 보다가 알게된거는 변수를 따로 안주고 태그값을 변경시켜주는 부분도 좋고
    버튼을 따로 아웃렛변수로 안주고 액션에서 가져오는 id값을 가져와서 버튼으로 바꿔주는 부분 너무 편리해 보이네요
    지금까지는 저럴경우 항상 아웃렛주고 액션 주고 두번 고생을 했었는데 앞으로는 그 부분의 작업은 줄어들게 되겠네요
    정말 감사합니다!!


오늘의 주제

1. UISearchBarDelegate
2. Daum Open API
3. NSThread
4. JSON parsing (JSONSerialization)



서른 여섯 번째 시간입니다.^^

지난 번에는 계속 포스팅을 위해 이것저것 준비를 해 두었지요?
지난 번 포스팅에 계속 이어지는 포스팅 입니다~
2012/05/30 - [iOS Dev/함께해보기] - iOS개발하기 #35. UISearchDisplayController(1)

오늘은 스레드와 리퀘스트 그리고 JSON 파싱에 대해 중점적으로 진행해 봅니다.

자~ 출발합니다~!


# UISearchBar

일단, 검색바에 검색어를 입력하였을 때, 그리고 검색 버튼은 눌렀을 때 검색을 시작하려고 합니다.
그래서 검색바 델리게이트 레퍼런스로 와서 그에 상응하는 메소드를 가져옵니다.
아래 두 메소드를 클릭해서 전체 메소드를 복사해서 SearchViewController.m 구현파일에 붙여넣어 주세요.


# Daum Open API

그리고 우리가 검색하려는 내용이 도서와 동영상이었습니다. 그래서 다음에 오픈 API를 이용해 보려고 합니다.
http://dna.daum.net/apis/search/book
으로 이동합니다.


일단 API사용을 위해서는 인증키를 받아야 하는데요, 키발급관리 메뉴에서 검색 API의 인증키를 받습니다.


그럼 바로 이렇게 인증키가 발급될거예요~ 창을 닫지 말고 두세요 ㅎ



# NSThread, JSON parsing (JSONSerialization)
 

그리고 이제 우리는 웹으로 데이터 요청을 할텐데요, 그 전에 웹 요청은 스레드로 요청을 하는 것이 좋으므로 스레트 객체 두 개를 선언해 줍니다.


그리고 초기화와 끝내기를 잊지 말아야 겠죠?ㅎ


자, 그리고 본격적으로 오늘의 코딩입니다.
자세한 설명은 코드에 주석으로 달려있는데요, 추가적으로 필요한 설명이 있으면 꼭 댓글주세요~^^*


여기 오류가 하나 있는데요 ㅠㅠ
나중에야 발견해서 캡쳐를 다시 못했네요.
searchBarSearchButtonClicked 메소드에 1, @"pageNum" 을 [NSNumber numberWithInt:1], @"pageNum" 으로 바꿔주세요.
아래 메소드에는 잘 해놓고 위에는 제대로 안되어있네요 ㅠ_ㅠ


코드를 작성하고 실행을 해 봅니다.


그리고 디버그창에 이런 외계어 같은 로그가 남는다면 정상입니다 ㅋ
만약에 result에 에러코드가 떨어진다면 Open API 페이지에 에러코드에 관한 설명이 있으니 참고하세요 ㅎ


자, 오늘은 JSON파싱까지 무사히 해 봤습니다~!

일단은 책 검색까지만 해 봤는데요, 다음번에는 이 정보들을 테이블뷰로 띄워보는 것 까지 해 보려 합니다.

기대해 주세용~_~

질문은 댓글로 주세요^^&


by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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



Posted by yagom

댓글을 달아 주세요

  1. 아퐁 2012.06.03 16:12  댓글주소  수정/삭제  댓글쓰기

    다음강의는 커스텀버튼 해주시면 안될까요??
    누르기 전 이미지와, 누른후 이미지를 다르게 설정할수있게요
    부탁드릴게요

  2. 2012.06.15 19:12  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

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

      개발문서에 보니 파싱 결과값이 에러가 나오는 것은 에러가 발생하였을 때 발생한다고 합니다.
      결과값 출력로그 부분에 error를 로그 찍어보시면 어떤 에러인지 파악할 수 있지 않을까 사료됩니다...^^
      아니면 데이터값이 잘 받아져 오지 않았을 수도 있을 것 같습니다.
      일단 처음에 json 파싱 전의 데이터가 잘 수신이 되는지 먼저 로그를 찍어 확인해 보세요..^^

      워낙 경우의 수가 많다보니 딱 이거다 라고 말씀드리기가 힘드네요ㅠ_ㅠ
      또 안되면 말씀해 주세요~!

    • 2012.06.17 17:55  댓글주소  수정/삭제

      비밀댓글입니다

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

      메일주소를 남겨주시면 메일 드리겠습니다..^^

  3. 2012.06.20 13:28  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

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

      소스 확인해 보았습니다. :-)
      힌트를 드리겠습니다~!
      딕셔너리 키값은 대소문자를 구분합니다..^^*
      제가 또 밥 좋아하는 건 어떻게 아시고 ㅎㅎㅎ
      살짝 기대해 봅니다 ~_~ㅎㅎ

  4. 2012.06.20 15:57  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

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

      하하~ 네, 정말 간단한거라 대접(?) 받기도 민망하죠~^^;
      정말 꽉 막히는 부분이 생기면 직접 와서 물어보셔도 돼요~ 물론... 제가 거주하는 지역과는 지하철로 4~50분 정도 소요되는 거리지만...^^;ㅎ 잘 해결하신 것 같아 기쁘네요 ㅎ

  5. 나에게넌 2012.08.13 17:48  댓글주소  수정/삭제  댓글쓰기

    무사 통과합니다..강의 감사합니다.

  6. 2013.01.07 18:22  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

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

      안녕하세요 :)
      방문 고맙습니다~
      그 부분은 Daum쪽에서 API가 변경되면 변경 될 수도 있는 부분인 것 같습니다 ^^

  7. 블랙덤보 2013.01.29 12:09  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰선생님 강좌 잘 듣고 있습니다.
    문의 사항이 있어서 댓글달아봅니다.
    잘 구현되지만 검색 시 키보드를 클릭하면 Thread 1: signal SIGABRT 라는 메시지와 함께 다운이 되는데요.
    어떤 문제 일까요? 꼬인 부분이 있는지 다시 프로젝트를 시작했는데도 동일한 증상이 나타납니다.

    항상 강의에 감사드립니다.

    • 블랙덤보 2013.01.29 15:41  댓글주소  수정/삭제

      pageNum 부분을 수정하니 정상 작동이 되는군요....
      강좌 감사드립니다^^

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

      선...선생님까지야;;;ㅎ

      들러주셔서 정말 고맙습니다 ㅎ

      해결되셨다니 다행입니다.ㅎ 빨리 답변드리지 못해서 죄송합니다 ㅠ

  8. Favicon of https://gogodao.tistory.com BlogIcon rustyDAO 2013.02.26 15:42 신고  댓글주소  수정/삭제  댓글쓰기

    야곰님 오랜만에 인사드리네요 ^_ㅠ
    몸은 많이 괜찮아 지셨어요?? 빨리 나으셨으면 좋겠어요 ㅠㅠ

    혹시, c#으로 웹서비스 만들어 보셨어요?? -_-.... c#으로 웹서비스 함수 만들고,, 야곰님이 다음 api 호출 하셨던 처럼

    매개변수 이런것들 맞춰서 호출하는데 안되네요 궁시렁궁시렁.......ㅋㅋ 윈도우에서 웹함수 테스트할때는 제이슨 형식으로

    잘 되는데 으흐,,,,,,,,, 혹시 해보신적 있으신가여...? ㅠ

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

      음...
      이 저주받은 몸뚱아리가 나아질 생각을 잘 안하네요 ㅠㅠ
      글쎄요... 그 방법은 제가 사용해보지 않아서 딱 어떻게 하라고 말씀을 드리기가 힘드네요 +_+ 죄송합니다..ㅠ

  9. 딴또 2013.03.22 15:19  댓글주소  수정/삭제  댓글쓰기

    감사합니다.

  10. mmbp 2013.04.26 17:47  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.
    NSDictionary *bookRequestDic = [[NSDictionary alloc]initWithObjectsAndKeys:[searchBar text], @"key", @"book", @"requestKind",[NSNumber numberWithInt:1], @"pageNum", nil];

    이렇게 고쳤는데도, Thread 1:signal SIGABRT 나오면서 실행이 되지 않습니다 ㅠㅠ

    log창에는 *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<SearchViewController 0x9176a40> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key refreshButtonClicked.'
    *** First throw call stack 이렇게 나오는군요.으앙 해결책을 모르겠습니다ㅠㅠ

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

      NSDictionary *bookReqeustDic = @{ [searchBar text], @"key", @"book", @reqeustKind", [NSNumber numberWithInt: 1], @"pageNum"}; 으로 바꿔보세요..^^

  11. mmbp 2013.05.03 12:33  댓글주소  수정/삭제  댓글쓰기

    며칠 다른 일 때문에 못 보았습니다.
    NSDictionary *bookRequestDic = @{[searchBar text],@"key",@"book",@"requestKind",[NSNumber numberWithInt:1], @"pageNum"};
    이렇게 바꿨는데, Expected ';' at end of declaration 이라고 나오면서 build failed나와요 ㅠ

    NSDictionary *bookRequestDic = @[[searchBar text],@"key",@"book",@"requestKind",[NSNumber numberWithInt:1], @"pageNum"];
    이렇게 바꾸면 빌드는 되는데, 시뮬레이터에서 ViewController 에서 Search 버튼 누르면 종료되어 버립니다 ㅠㅠ

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

      iOS 버전업이 되어서 맞지 않아 동작하지 않는 것일 수도 있는데요...
      제가 원본 소스를 잃어버려서 지금 테스트를 해 보기가 조금 거시기해요 ㅠㅠ

  12. 김현수 2013.07.05 14:56  댓글주소  수정/삭제  댓글쓰기

    저기...
    테이블뷰 인터페이스빌더에서 생성도 안했는데
    나오는건 뭐죠;;??
    쭉 읽어보고 왔는데
    테이블뷰를 어찌불러오는지 설명이없네요

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

      UISearchDisplayController는 검색결과가 테이블뷰에 나오는 컨트롤러이기 때문에 따로 테이블뷰를 생성하지 않아도 나오게 됩니다.

      그래서 TableViewDelegate와 DateSource같이 UISearchDisplayController에서 delegate와 dataSource를 가지고 비슷한 처리를 해주죠~

  13. 2013.07.24 14:45  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

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

      - (void)searchBarSearchButtonClickedUISearchBar *)searchBar
      메소드는 서치바 델리게이트 메소드로서, 서치바에 검색 버튼을 누르면 동작하는 메소드입니다.
      즉, 검색 버튼을 누르면 위의 메소드가 실행이 되구요,
      이전에

      - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
      메소드는 서치바에 우리가 글자를 입력할 때 호출되는 메소드입니다.

      즉, 우리가 검색창에 텍스트를 입력하면
      - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
      메소드가 호출되고, 그 안에서 검색 준비를 위하여 readyForRequestWithDictionary메소드가 호출이 된 후, 준비가 끝나면 스레드를 통하여 requestSearch 메소드가 호출이 되는거지요.

      델리게이트의 동작방식에 대해 잘 이해가 안가신다면 제 블로그에 포스팅이 있으니 참고하시면 되겠습니다 :)

  14. 프로그래밍구 2013.12.06 02:02  댓글주소  수정/삭제  댓글쓰기

    질문있습니다.

    현재 뷰디드언로드 메세드가 사라졌는데
    쓰레드 관련해서도 메모리해제에 전혀 개발자가 개입하지안해도되나요??

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

      안녕하세요, :)
      프로퍼티만 잘 설정해 주시면 큰 문제는 되지 않을거예요.
      좀 꺼림칙하다 싶으시면 dealloc 메소드를 오버리드해서 구현하시면 됩니다. 다만, [super dealloc] 은 안써주셔도 되구요 ㅎ

  15. 손현 2014.04.04 10:24  댓글주소  수정/삭제  댓글쓰기

    뒤늦게나마 뒷북쳐서 운영자님 죄송합니다..

    질문할게 있어서요.

    코딩을 다 끝냈는데..

    이부분에서 계속 터집니다..ㅜㅜ

    NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableContainers error:&error];

    -------------------------------------------------------------------------------
    *여긴 오류메세지..ㅠ입니다.

    2014-04-04 10:13:34.804 Parser[988:4c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'

    *** First throw call stack:

    (
    0 CoreFoundation 0x017ee1e4 __exceptionPreprocess + 180

    1 libobjc.A.dylib 0x0156d8e5 objc_exception_throw + 44

    2 CoreFoundation 0x017edfbb +[NSException raise:format:] + 139

    3 Foundation 0x012b3bd2 +[NSJSONSerialization JSONObjectWithData:options:error:] + 67

    4 Parser 0x00002bff -[ViewController requestSearch:] + 847

    5 Foundation 0x011c4a07 -[NSThread main] + 76

    6 Foundation 0x011c4966 __NSThread__main__ + 1275

    7 libsystem_pthread.dylib 0x01f2e5fb _pthread_body + 144

    8 libsystem_pthread.dylib 0x01f2e485 _pthread_struct_init + 0

    9 libsystem_pthread.dylib 0x01f33cf2 thread_start + 34
    )

    libc++abi.dylib: terminating with uncaught exception of type NSException

    (lldb)

    계속 이런 오류가 뜨는데 xcode5로 만들고있습니다.

    뭐가 문제인지 모르겠어요.. response가 계속 nil 값이던데.. 그래서인지..

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

      response가 nil로 오면 딕셔너리로 변환을 할 수 없기 때문에 익셉션 에러가 발생합니다. response가 nil이 왔다면 요청이 잘못되었을 것 같습니다.


오늘의 주제

1. UISearchDisplayController 


서른 다섯 번째 시간입니다.^^

지난 번에까지는 객체간의 데이터 전달에 대해 알아보았습니다.
잘 알아두셔야 할 부분들일 거예요 ㅎ

오늘 부터 시작할 포스팅은 꽤나 길게 이어질 것 같습니다.

여러분께서 원하던 기능들을 많이 많이 해볼거거든요..ㅎ

제목은 UISearchDisplayController 지만 이 안에는 엄청나게 많은 내용들을 담게 될 것입니다.

요 녀석에 많은 것을 활용 해 볼 수 있는 요소들이 있거든요 ㅎ

자 일단 결론부터 말씀을 드리자면 

검색결과 컨트롤러 다루기
테이블뷰 다루기
검색바 다루기
스레드 다루기
URL Request 전송
JSON 파싱
XML 파싱

여러분들께서 궁금해 할 만한 내용들을 대폭 담아 볼 예정입니다.

원래 다른거 할 것들이 조금 더 있었는데, 많은 분들이 얼른 해달라고 요청해 주셔서 더 빨리 진행하게 되었습니다.

그만큼 조금 복잡하고 어려운 포스팅이 될 것이라고 생각하지만, 여태껏 잘 따라오셨다면 몇 번 보고 이해하실 수 있을 정도라고 생각이 듭니다.

물론 전제로는 앞의 제 포스팅을 완벽히 이해하고 있다는 전제하에 시작합니다.

그럼 이번에도 힘겨운 여정을 떠날 준비가 되셨나요?ㅎ

출발해 볼까요~?


p.s 기대되신다면 추천 한 방 어떠세용 ㅎㅎ




# UISearchDisplayController

왜 검색 컨트롤러를 사용하느냐...

우리가 이제 몇 번의 포스팅으로 진행해 나갈 프로젝트를 간략히 설명드리겠습니다.

검색 컨트롤러를 이용하여 Daum 책 검색, Daum 동영상 검색을 통하여 결과를 가져와서 파싱한 다음 테이블뷰에 뿌려주고,

테이블 뷰를 선택하면 해당 결과 페이지로 이동하는 녀석을 만들어 볼 것입니다.

자 그러기 위해선 우선 검색 결과 컨트롤러를 사용하기 위하여 뷰 컨트롤러를 하나 생성해 줍니다.


그 화면에 Search Bar and Search Display 라는 이름의 객체를 하나 얹어 줍니다.


그리고 Search Display Controller 라는 녀석을 헤더에 아울렛을 하나 연결 해 주세요~


자, 그리고 새로운 화면을 띄워주기 위해서 우리가 메인으로 쓰고있던 ViewController에서 버튼을 하나 추가해 주고 액션을 연결해 주세요~


그리고 구현파일 ViewController.m으로 와서 헤더 임포트 해주시고~


모달뷰를 띄우는 메소드를 구현해 줍니다 ㅎ


자, 우리는 이 검색 컨트롤러에 대해 잘 모릅니다.
일단 뭐 죽이되는 밥이되든 그녀석의 레퍼런스를 찾아 들어가 봅니다.


항상 그렇듯 Overview에 이 클래스에 대한 개요가 나옵니다.
이녀석이 어떤 녀석인지 알아봅시다.


일단 뭐 테이블에 검색결과를 뿌려주는 녀석 같습니다. ㅋㅋㅋ
이녀석을 사용하려면
1. 검색 결과 테이블의 데이터 소스 구현
2. 검색 결과 테이블의 델리게이트 구현
3. 검색 출력 컨트롤러의 델리게이트 구현
4. 검색바의 델리게이트 구현
순대로 구현을 하라고 하네요~
일단 말 잘 들으면 좋습니다 ㅋㅋㅋ


일단 테이블뷰의 데이터 소스를 먼저 구현해 보려고 합니다.
필수로 구현되어야 할 메소드가 있나요?
네.. 있죠~ 그런데 이녀석들 구현하기가 너무 귀찮습니다~


그래서 테이블 뷰 서브 클래스를 하나 만들어 봅니다. 이거 임시적으로 만드는 거예요~


그래서 구현파일에 가보면 데이터 소스와 델리게이트 모두 친절하게 구현이 되어있습니다.
#pragma mark - Table View data source 부터~ 아래쪽에 있는 델리게이트 메소드까지 쭈욱 끌어서 복사합니다~


바로 여기까지용 ㅋ


그리고 필요없어졌으니 가차없이 지워버립니다. ㅋㅋㅋ
네비게이터에서 두 파일을 선택하고 delete -> Move To Trash 입니다~


자 그럼 위에서 1,2 번은 구현이 되었으니 3번을 구현해야 할 차례인데, 일단 보니 필수적으로 구현해야 할 메소드가 없네요?ㅎ 
그럼 일단 스킵합시다~


또 4번 째 검색 바 델리게이트 또한 필수 구현 메소드가 없네요~
그럼 요녀석도 잠시 스킵합니다 ㅎ


그리고 이제 다시 검색 뷰 컨트롤러로 돌아와서 화면에 툴바를 먼저 얹어 주시구요~ 바 버튼 네 개를 넣어줍니다.
그리고 웹뷰를 올려주세요~
각 버튼은 액션을 연결해 주시고, 웹뷰는 아울렛을 연결해 주세요~
바 버튼들 어떻게 처리하는지 모르신다면 
2012/05/07 - [iOS Dev/함께해보기] - iOS개발하기 #27. 웹뷰 (WebView) <1> 를 참고해 주세요~


그리고 친절하게 버튼 메소드들도 구현해 줍니다~ 웹뷰를 보셨다면 어떤 버튼들인지 감이 오시죠?ㅎ
밑에 경고들은 일단 무시하세요~ ㅎ 다음에 설명드릴게용~



자, 이렇게 하고 실행 해 보세요~

덩그라니 검색 화면만 나오고 뭐 검색결과도 안나오고..ㅋㅋ

일단 우리는 아직 밑장만 깔아놓은 거예요~

아휴~ 준비하는데도 참 힘드네요 ㅎㅎㅎ

이제 다음 포스팅 부터 본격적으로 이것 저것 해볼게용~

기대해 주세요~!


by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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



Posted by yagom

댓글을 달아 주세요

  1. 생초보 2012.05.30 19:40  댓글주소  수정/삭제  댓글쓰기

    와우~ 드디어~ 올것이 왔군요~ 감사합니다

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

    쉬어가는 코너2 군요..긴장하며 다음장으로...

  3. 어려워 ㅠㅠ 2013.03.18 22:44  댓글주소  수정/삭제  댓글쓰기

    친절하고 자세한 강좌 잘 보고 있습니다.
    항상 감사하구요
    건강하세요 ^^

  4. 딴또 2013.03.22 14:19  댓글주소  수정/삭제  댓글쓰기

    오~~~ 기대감에서 오는 이 짜릿함은 뭐지??? ㅋㅋ

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

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

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

#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. NSNotificationCenter


서른 네 번째 시간입니다.^^

지난 번에는 델리게이트 프로토콜을 이용하여 데이터를 주고 받는 것을 해 보았습니다.
어떤가요 흥미로우신가요?ㅎ
프로토콜을 사용하여 통신하는 방법도 있지만, iOS에서는 또하나의 흥미로운 기능을 제공합니다.
바로 노티피케이션 센터라는 녀석인데요, 우리가 푸쉬 알림 받는 그 노티피케이션이 아닙니다 ㅎㅎ
그럼 일단 한 번 시작해 보도록 하겠습니다.

그 전에 딕셔너리에 대한 이해가 조금 필요로 합니다.
2012/04/20 - [Objective-C] - Objective C <11>. 딕셔너리, 배열 ( NSDictionary, NSArray )

자 떠나볼까요?ㅎ
고고씽~~~~~~~~~~~~


# NSNotificationCenter?

노티피케이션센터라는 녀석은 어떤 녀석일까요?ㅎ

일단 그 전에, 우리가 다른 객체와 데이터를 주고 받을 수 있는 방법에 대해 잠깐 언급해 보도록 하겠습니다.

첫째로는 직접 주고 받기가 있습니다.
말 그대로 서로 다른 객체를 참조하여 메소드 또는 프로퍼티를 통하여 직접 주고 받는 방법입니다.
여기서 우리는 사용하지 않도록 하겠습니다. 
굉장히 지저분하며, 효율적이지 못하고 이것저것 꼬일 가능성이 크기 때문입니다.
저도 처음 델리게이트 프로토콜이나 노티피케이션에 대해 알지 못했을 때에는 종종 사용했는데, 지금 보면 정말 왜 이모냥으로 만들어 놨나 싶을 정도로 거지같습니다..ㅋㅋ
그러니까 아~ 그런게 있구나~ 정도만 알아두세요 ㅎ

둘째로는 지난 번에 알아보았던 프로토콜을 이용하여 통신하는 방법입니다.
나름 깔끔하고 효율적인 것 같아 보이죠^^

셋째로는 오늘 알아볼 노티피케이션 센터를 통하는 방법입니다.
개인적으로는 가장 깔끔하고 작업능률면에서 효율적이라고 생각합니다.
프로토콜을 이용했을 때에는 어쨋든 내가 그녀석의 델리게이트다, 데이터소스다 라고 선언을 해 주어야 하고, 이것 저것 그래도 손이 가는 편입니다.
그런데 노티피케이션 센터를 통하게 되면 그런 수고를 덜 수 있습니다.
하지만 수고가 덜어지는 만큼 위험도 도사리고 있을 수 있다는 점 명심하세요 ㅎ

자, 그럼 노티피케이션 센터라는 녀석은 무슨짓을 하는가 살펴봅니다~


자, 노티피케이션 센터가 하는 역할입니다.

객체간에 서로 누가 누군지는 전혀 알 수 없습니다만, 노티피케이션 이름만 알고 있다면 노티피케이션 센터에다가 나 이런 노티피케이션을 날렸으니 너가 알아서 처리해! 라고 명령하는 것입니다.

그럼 노티피케이션 센터는 그 해당 노티피케이션을 기다리고 있는 객체에게 해당 명령을 수행하도록 명령하게 되는 것입니다.

대충 감이 오시나요?ㅎ

그럼 한 번 실습을 해봐용 ㅎ



# 실습해보기

자, 일단 먼저 어떤 명령을 수행할 객체 클래스에 노티피케이션 센터에 자신이 할일을 등록하는 것 부터 시작합니다.

우리는 지난 번에 했던 델리게이트 프로토콜 대신에 노티피케이션으로 변경하는 작업을 해볼거예요~ㅎ

ViewController.m으로 옵니다.

처음 로드될 때 노티피케이션 센터에 자신이 할일을 등록해 줍니다.

그리고 주의할 점은 자신이 사라져 해제가 될 때 또는 그 일을 더이상 하지 않아야 할 때, 노티피케이션 센터에 더이상 자신은 일을 하지 않는다고 다시 알려주어야 합니다.

또한, 노티피케이션을 받아서 일을 처리하는 메소드는 꼭 인자를 NSNotification으로 받아와야 합니다. 그래서 지난 번에 사용하던 메소드를 수정할까 새로 만들까 하다가 새로 만들어 주었습니다.ㅎ
이 NSNotification 객체 안에는 몇몇 정보들이 들어가 있습니다.
노티피케이션 이름, 노티피케이션과 관련된 객체, 그리고 userInfo라는 딕셔너리가 포함되어 있습니다.

우리는 데이터를 주로 userInfo라는 딕셔너리를 통하여 전달을 하게 될 것입니다.
그래서 조~ 밑에 노티피케이션 송출 부분에서는 userInfo라는 곳에 딕셔너리를 넣어서 보내줄거예요~

노티피케이션 센터는 우리가 굳이 별도로 만들어 줄 필요는 없습니다. 기본적으로 제공되고 있는 기본 노티피케이션 센터가 있으니 걱정하지 않으셔도 됩니다.

코딩을 해 봅니다 ㅎ


몇 줄 없죠?ㅎ

그런데 사용할 때에는 더 몇줄 없습니다 ㅎㅎ


따지고 보면 수정되는 거는 세줄이네요 ㅎ
지난 번에 사용하였던 프로토콜 호출 부분은 주석처리를 해 두었습니다~!

그리고 실행!!


짜잔~~~~~~
아주 잘 동작하네용 ㅎㅎㅎ

어때요~
참 쉽죠잉?ㅋㅋㅋ

오늘 해본 내용은 꽤나 자주 사용해야 하고, 중요한 부분인데 금방 끝나버렸네요 ㅎㅎ

추가적으로 궁금한 것이 있으면 댓글주세요^^*

그럼 이만, 뿅~!


by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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



Posted by yagom

댓글을 달아 주세요

  1. 인절미후후 2012.06.26 16:03  댓글주소  수정/삭제  댓글쓰기

    활용적인 측면에서는 정말 중요한 내용이라고 생각되지만 구현하는 방법에서 약간 어려운것 같기도 하네요
    어렵다기보다 어디에 활용해야 할지 잘 모르겠다는 뜻이에요.

    데이터의 전달 방법적인 측면도 있지만 해당 액션을 등록해놓고 리시버가 그 액션을 받으면 트리거처럼 이벤트를 발생시켜주는 것 같은 느낌도 드네요 . 여러글을 읽다보니 제 글도 정신이 없네요. 잘 읽고 갑니다.

    설정내용을 저장하는 방법처럼 계속 그 값을 보관해서 여러 뷰에서 사용할 수 있는 방법과는 다른것 같네요.

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

      어디에 활용해야 할지는 제가 오늘 달아드린 댓글 중에도 있겠네요 :-)

      물론 계속 다음 또 다음 포스팅을 읽어가다 보시면 어디서 어떤식으로 써야 할지 조금은 느낌이 올 수 있을 것 같습니다 ^^* 중간중간 제가 사용해 보았거든요..ㅎ

      음... 해당 액션을 등록해 놓고 특정 이벤트가 발생하면 리시버에게 해당 액션을 명령하는 것이 더 맞다고 볼 수 있을 것 같습니다... :-) 물론 보는 관점의 차이와 사용 상황에 따른 차이는 있겠습니다만...^^

      마지막줄에 하신 말씀은 잘 이해를 못하겠네요 ㅠ_ㅠ

      불같은 덧글 고맙습니다...ㅎㅎ

  2. 인절미후후 2012.06.28 15:02  댓글주소  수정/삭제  댓글쓰기

    저의 미천한(읽기 힘든) 댓글에 신성한 댓글 달아주셔서 감사합니다.

    마지막 댓글은 어플내부에 옵션이 있는것들 있잖아요 설정값을 저장해서 가져다 쓰는 경우를 얘기한 것입니다.
    어플들 보면 옵션같은 .. 아직 옵션을 제대로 구현해보지는 않았지만 파일/디비 에 저장해놓고 불러다 쓰는게 맞겠죠.
    아니면 다른 여러 방법이 있기도 하겠지만..

    여러뷰에서 사용한다는 말이 좀 오해를 부른것 같네요.

    제가 요새 정신이 없다보니 .. 글쓸때 한번더 생각해야 겠어요..
    차가운 머리를 하고 글을 적어야 하는데;;

    커뮤니케이션은 개발자의 중요 스킬중 하나라고 생각해요..(패시브)
    야곰님처럼 불같은 감성과 냉철한 이성을 가지고 글을 적으려고 노력하겠습니다!

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

      어이쿠 무슨 말씀을 그리 하십니까...ㅎㅎ
      물론 설정내역 저장은 파일저장 또는 서버저장으로 하는 것이 맞겠죠 ^^
      저도 냉철하지 못해서 자주 실수하곤 합니다 ㅠ_ㅠ
      냉철한 이성과 불같은 감성을 갖추어야 하는데 아직 너무 부족합니다..ㅠ
      어떤 직종이든간에 커뮤니케이션은 정말 중요한 것 같습니다 ㅎ
      항상 덧글 이렇게 주셔서 정말 고맙습니다 :-)
      소통에 게을리 하지 않겠습니다. ㅎ

  3. Sio 2012.07.19 17:52  댓글주소  수정/삭제  댓글쓰기

    확실히 이전 강의인 프로토컬과 델리게이트 쓸때보다 코드도 적고
    간단해 보이기는 하는데 ....
    ㅋㅋ 아직 지식이 부족해서 그런지 어디다 써먹이야 할지는 감이 안오네요
    노티피케이션 관련 소스 같은것도 더 찾아서 뭐에 써먹었었나 봐야겠어요 ㅜㅜ ㅎㅎㅎ
    잘보고 갑니다~~!!

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

      나중에는 아주 유용히 잘 활용하실 날이 올거라 생각합니다 ㅎㅎㅎ
      다음 번에 개발하다가 문득 아! 이런게 있었지! 라는 생각이 들 때가 올지도 모릅니다 ㅎㅎ

  4. 나에게넌 2012.08.13 16:00  댓글주소  수정/삭제  댓글쓰기

    위 서문에 Notification 쓰면 수고가 줄어드는 만큼 위험도 도사린다고 하셨는데..
    어떤 위험이 다가올런지요 ㅎㅎ

    그럼 차라리 delegate를 쓰는게 좀 더 안전한 방법일까요??

    위 댓글처럼 시기적절하게 활용할 수 있다면 코딩실력이 한단계 발전할텐데요.. 그게 어렵네요 ㅎ

    강의 감사합니다..

  5. Favicon of http://koreawolf.tistory.com BlogIcon 안승진 2012.08.17 14:03  댓글주소  수정/삭제  댓글쓰기

    정말 이해하기 쉽게 설명하셨네요.+_+/
    실습하기 전까지만 읽어도 이해가 되어었습니다.. +_+
    다른 사이트 글보다가 이게 뭐 이랬는데 하하;;;

    감사합니다.

  6. 김다오 2013.02.19 18:34  댓글주소  수정/삭제  댓글쓰기

    야곰님 ~ 정말고맙습니다 ㅋㅋㅋㅋ
    정말 유익하네요 ㅋㅋㅋㅋ

  7. 바른생활 2013.04.08 16:43  댓글주소  수정/삭제  댓글쓰기

    어우~~~ 감사합니다.
    C++로 3D를 하는데, 모바일 쪽에서 뭐좀 해볼라치면 자꾸 objective-c가 발목을 잡네요.
    막막했는데 많은 도움이 되었습니다.
    감사합니다.

  8. 에고공 2013.05.08 13:26  댓글주소  수정/삭제  댓글쓰기

    노티피케이션 알아볼려고 돌아다니다가

    http://seonho.blogspot.kr/2012/10/ios-nsnotificationcenter.html
    이 블로그에 위 본문 내용의 스샷이 고대로 들어가있고,
    어떠한 언급도 없는것 같아서.. 알려드려요.
    뭐 나쁜의도겠냐만은..
    그래도 아셔야 할 것 같아서..

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

      안녕하세요 에고공님 :)
      관심 가져주셔서 정말 고맙습니다 ㅎ
      의도가 어찌되었든 말없이 가져가는 것은 옳지 못하지만, 웹이라는 공간의 특성상 어쩔 수 없는 현상이기도 한 것 같습니다 ^^...
      좋게 좋게 쓰인다면 크게 나무랄 것도 없지요..^^

  9. 2013.05.20 21:40  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  10. dklee7206 2013.05.21 13:47  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 항상 감사히 잘 보고 있습니다.

    ViewController.m에서
    -(void)setLastAddressWithNoti:(NSNotification *)noti {
    NSDictionary *notiDic = [noti userInfo]; ******< 이걸 만들어주고..
    NSString *lastAddress = [notiDic objectForKey:@"lastAddress"];
    NSLog(@"lastAddress = %@",lastAddress);
    [lastAddressLabel setText:lastAddress];
    }

    ViewControllerforWeb.m에서도


    //noti를 위한 딕셔너리 생성 후 기본 노티피케이션 센터에 노티피케이션 전달
    notiDic에 넣어주는데..>******* notiDic = [[NSDictionary alloc]initWithObjectsAndKeys:lastAddress,@"lastAddress",nil];
    NSLog(@"notiDic : %@", notiDic);


    두 부분이 헷갈리고 이해가 잘 안되서요..

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

      ViewController에서는 노티피케이션에 싣고 보낼 데이터(userInfo)를 만들고 노티피케이션을 쏩니다.

      그러면 ViewControllerForWeb에서 노티피케이션을 받고 전달된 데이터(userInfo)를 가져오는 것입니다.

      노티피케이션에 포함되어 전달되는 데이터는 Dictionary 형태가 되어야 하며, Dictionary데이터는 userInfo라는 이름으로 들어옵니다.

      노티피케이션은 특정 상황에서 발송을 할 수 있고, 데이터도 함께 보낼 수 있기 때문에, 특정 상황이 발생했을 때 여러 수신자가 노티피케이션을 받아서 일괄적으로 처리를 할 수 있기 때문에 유용합니다. :)

      윈도우에서는 메세지와 같은 역할이라고 볼 수 있겠습니다...(아마도?)

  11. dklee7206 2013.05.21 21:55  댓글주소  수정/삭제  댓글쓰기

    클래스 중에


    -(void)setLastAddressWithNoti:(NSNotification *)noti {
    NSDictionary *notiDic = [noti userInfo];
    NSString *lastAddress = [notiDic objectForKey:@"lastAddress"];
    NSLog(@"lastAddress = %@",lastAddress);

    [lastAddressLabel setText:lastAddress];

    }

    여기서 [noti userInfo]; 이게 뭘 의미하는지

    [[NSNotificationCenter defaultCenter]postNotificationName:@"setLastAddress" object:nil userInfo:notiDic]; 여기서
    userInfo:notiDic이랑 위에거랑 같이 혼동이 되서 미치겠네요.. ㅠㅠ

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

      변수명이 같아서 혼동이 되시는 것 같은데요.
      postNotification이라는 메소드는 노티피케이션을 송출하는 메소드입니다.

      즉, userInfo로 세팅될 딕셔너리가 notiDic이라는 딕셔너리라는 뜻이구요,

      받는 쪽에서는 노티피케이션에 실려온 userInfo를 꺼내는 것에 불과합니다.

      보내는 쪽과 받는 쪽의 notiDic 변수명을 각각 다르게 하더라도 똑같이 동작을 합니다.

      저것은 객체 자체가 움직이는게 아니고 포인터변수(즉, 객체의 주소)만 옮겨주는 것이기 때문에 변수명은 큰 의미가 없습니다.

      [noti userInfo]를 사용하는 이유는 수신된 NSNotification의 객체인 noti에서 userInfo인 딕셔너리를 꺼내와야 우리가 전달된 데이터를 활용할 수 있는 것이기 때문이죠.

      NSNotification 문서를 보시면 userInfo에 대해 나와있을 거예요.

      저도 처음에 헷갈렸던 부분이기도 합니다 ^^;

      예제 말고 스스로 다른 예제 프로젝트를 만드셔서 직접 여러개 만들어서 노티피케이션을 송출해보고, 받아보는 것을 해보시면 차츰 이해가 되실 거라고 믿습니다 :)

    • dklee7206 2013.05.23 14:20  댓글주소  수정/삭제

      자세히 설명해주셔서 감사합니다 ^^ 이해가 잘 되었습니다.

  12. 2013.05.21 22:02  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

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

      노티피케이션은 수신하고 있는 객체들이 일괄적으로 어떤 일을 처리하고자 할 때 주로 쓰입니다.
      그러니까 노티피케이션을 받는 다른 객체들이 무언가를 실행하기 원할 때 노티피케이션을 송출하게 되는 것이지요.

    • dklee7206 2013.05.23 14:21  댓글주소  수정/삭제

      설명 감사드립니다!

  13. Favicon of http://fldragonn.blog.me BlogIcon 미르룡 2013.07.08 10:37  댓글주소  수정/삭제  댓글쓰기

    ^^ NotificationCenter를 사용할 일이 있었는데 역시 yagom님의 글을 보니 한 번에 이해가 됩니다.
    가장 중요한 핵심을 간단한 그림으로 설명해 주셔서 큰 도움 받았습니다. 항상 좋은 정보 잘 보고 있어요.

  14. nely 2014.03.13 16:55  댓글주소  수정/삭제  댓글쓰기

    좋은 글 감사합니다~~~


오늘의 주제

1. Protocol
2. Delegate 만들어 보기



서른 세 번째 시간입니다.^^

지난 번에는 유저의 응답을 받아 볼 수 있는 피커뷰에 대해 알아보았습니다~
이번에는 프로토콜이라는 것에 대하여 알아보도록 할게요~
잘만 사용하면 좋은 녀석입니다 ㅎ

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





# Protocol이란?

네트워크에서 프로토콜이라 함은 일종의 통신규약을 말하는데요, Objective-C에서는 약간 다른 의미로 사용됩니다.
음... 뭐 굳이 말하자면 클래스간의 통신 규약이라고도 말할 수 있겠네요 ㅎ
프로토콜은 일정한 메소드를 통하여 클래스 간에 통신을 할 수 있는 통로를 제공합니다.
어떠한 객체에서 다른 객체로 데이터나 메세지를 전달하고 싶을 때 사용할 수 있습니다.

말로는 잘 느낌이 안오시죠?ㅎ
그런데 이렇게 말씀드리면 느낌이 조금 오시려나요?ㅎ

이 프로토콜이란 친구를 사용하여 코코아 터치에 많이 사용되고 있는 위임패턴(Delegation Pattern)을 구현할 수 있습니다.

그럼 기본적으로 클래스에서 제공되는 델리게이트 메소드 말고 우리가 직접 델리게이트 프로토콜과 메소드를 만들어 보는 시간을 갖도록 하겠습니다.ㅎ

# Delegate 만들어보기

이번 실습에서는 ViewController의 한 라벨에다가 ViewControllerForWeb에서 우리가 불러왔던 웹페이지의 마지막 주소를 세팅하는 것을 해보겠습니다.

그러려면 일단 ViewController에 라벨을 하나 넣어줘야겠죠?ㅎ
라벨을 넣어주시고 아울렛을 연결해 줍니다.


그리고 이제는 프로토콜 생성을 위하여 ViewControllerForWeb.h로 옵니다.
거기에 프로토콜을 작성해 주고, 프로퍼티로 델리게이트를 만들어 줍니다.
@required와 @optional은
말 그대로 다른 객체와 프로토콜을 통해 연결했다면 꼭 구현해줘야 하는 메소드이다. 선택적으로 구현해 주어야 하는 메소드이다를 구분해 준 것입니다.
지난 번에 피커뷰에서 피커뷰 델리게이트 중에 필수적으로 구현이 되어야 하는 메소드가 있었지요? 그것을 생각하시면 편할거예요.


그리고 ViewControllerForWeb.m에서 헤더에서 만들어준 델리게이트를 synthesize로 받아줍니다.


그리고 우리가 마지막으로 ViewControllerForWeb을 닫을 때 프로토콜을 통하여 ViewController로 메소드를 호출합니다.


그리고 이제는 ViewController로 돌아와서 델리게이트로서의 역할을 하도록 세팅해 주고, 메소드 들을 선언해 줍니다.


그리고 구현파일 ViewController.m으로 돌아와서 실제적으로 메소드를 구현해 줍니다.
또, ViewControllerForWeb의 객체를 생성해 줬을 때, 자신을 델리게이트로 설정을 해 줍니다.



자, 이제 실행해 볼까요?ㅎ

이렇게 웹페이지를 띄웠다가~


닫고 이전 화면으로 돌아가면~ 맨 마지막에 요청하였던 페이지의 주소가 라벨에 세팅이 되어있음을 확인 할 수 있습니다 ㅎ


아까 구현해놓고 실행하지 않았던 빨간색으로 글자 바꾸는 메소드는 여러분께서 한 번 적절히 활용해서 꼭 실행해 보시기 바랍니다 ㅎ

정말 중요한 개념인데 금방 끝냈네요~

굉장히 중요한 내용 중에 하나이기 때문에 혹여나 이해가 안되시거나 부족하다 싶으면 꼭 말씀해 주세요.
보강설명 들어가겠습니다...ㅎ
사실 지금 좀 부족한 감이 있습니다만, 여러분의 피드백이 필요한 시점입니다 ㅎㅎ
피드백 없으면 이 내용은 포스팅이 또 안나오겠지요..ㅎ

by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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



Posted by yagom

댓글을 달아 주세요

  1. 생초보 2012.05.25 17:37  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님~~ 생초보에용

    이것저것 혼자 공부중인데 딱 막히는게 한가지 잇어서,,,
    염치불구하구 다음강좌는 요런거 좀 다뤄 주시믄 어떻실란지요ㅡㅡ;;

    거진 며칠째 헤메고잇는게,, NSXMLParser 이녀석입니다

    월 500원짜리 웹호스팅도 가입해서 xml 파일 올려놓고 테이블뷰에 뿌려주려고
    구굴링, 맥부기 모두 뒤져서 코딩 해보고 있는데,,,,,완전 멘 붕 상태입니다..

    시간 나실때 부탁드려요~

    감사합니다




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

      ㅎㅎ 고녀석 조만간 하려고 했습니다~
      일단 테이블 뷰 먼저 포스팅 나가고 고거 바로 합니다~ㅎㅎ
      조금만 기다려 주세용~_~

  2. 인절미후후 2012.06.26 15:46  댓글주소  수정/삭제  댓글쓰기

    아 정말 어렵네요 중요한 개념이고 자주 보이는건데
    잘 알아야 응용을 할텐데..
    두어번 더 봐야될거 같습니다.

    프로토콜, 데이터소스, 델리게이트,
    프로토콜은 뭐뭐 쓰겠다고 선언해주는 것이고,
    데이터소스는 써야할 데이터를 셋팅해주는 애고,
    델리게이트는 사용할 때 가져다 쓰는거고..자바에서의 인터페이스라고도 하던데

    아 프로토콜이랑 델리게이트 헷갈리네요.. ㅎㅎ 사용할때는 델리게이트, 선언시는 프로토콜 이라고 생각하고 있습니다

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

      이녀석들은 중요한 수준 그 이상입니다~!

      델리게이트, 데이터소스는 프로토콜의 일종이라고 생각하시면 됩니다.

      프로토콜은 객체간에 서로 약속한 메소드를 호출 할 수 있게 해 주는 역할이 되겠습니다.

      데이터소스는 약속된 메소드를 통하여 지정된 데이터를 가져올 수 있으며, 델리게이트는 특정 상황에 대한 반응을 메소드를 통해 구현할 수 있도록 해 준것입니다.

      덧글을 제가 써놓고도 무슨말인지 알쏭달쏭 하네요 =ㅅ=

      여하튼 정말 중요한 것 이상의 내용임에는 틀림없습니다.

      꼭 이해하고 숙지하셔야 할 내용입니다~!

  3. Sio 2012.07.19 17:29  댓글주소  수정/삭제  댓글쓰기

    으... 이건 뭔가 많이 사용해 봐야 아! 이거구나~ 라고 확실히 알것 같네요 ㅎㅎㅎ
    오늘 배울 것들로라도 이것 저것 응용해 봐야겠습니다 ㅜㅜ ㅋㅋ
    그럼 다음 강의로 고고~~

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

      네, 정말 기본적인 개념이지만 처음엔 참 이해하기 어려운 내용중에 하나일 것입니다.
      힘내세요^^*
      천천히 오세요~
      너무 빠르면 탈나요 ㅎㅎㅎ

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

    폭풍 흡입!!! 완전 중요한 내용 감사합니다..

  5. Dklee7206 2012.10.17 00:56  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.. 좋은글 많이 보고 있습니다.
    많이 어렵네요... ㅠㅠ 왜 써야하는지 부터도 잘 모르겠고..
    이유같은것 좀 보충해서 알려주시면 많이많이 감사할께요~

    내일도 좋은 하루 되세요~

  6. hyung 2012.11.30 11:44  댓글주소  수정/삭제  댓글쓰기

    오늘은 델리게이트를 공부하겠어요! 이제 회사일 따윈 모름 ㅋㅋㅋㅋㅋㅋㅋ

  7. Favicon of https://lifeones.tistory.com BlogIcon Hue Kim 2013.03.20 14:49 신고  댓글주소  수정/삭제  댓글쓰기

    너무 좋은 자료들 감사합니다.

    포스팅 하느라 시간도 엄청오래걸리셨을텐데..

    고생많으셨어요..ㅠㅠ 저도 비슷한거 해볼려다..하나 작성하고 포기했었는데..;;..

    대단하십니다!!!

  8. dklee7206 2013.05.13 11:34  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 따라해 보고 있는데요. ViewControllerforWeb.m
    [self changeFuncButton: UIBarButtonSystemItemStop]; 이부분에서 에러가 나서요
    메소드 구현된 부분 있을까요?

  9. dklee7206 2013.05.14 17:20  댓글주소  수정/삭제  댓글쓰기

    안녕하세요~ 역시나 이해가 안됩니다~ ㅠㅠ
    델리게이트 선언해준 이후부터 조금만 더 자세히 부연 설명 부탁드려요.. 주석으로 설명 해주셔도 되구요..
    감사합니다~


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

      어떤 부분이 잘 이해가 안가시는지요...?ㅠㅠ
      http://blog.yagom.net/179
      이쪽 참고해 보셨나요? :)

    • dklee7206 2013.05.16 10:47  댓글주소  수정/삭제

      네 안녕하세요. 개념적으로 약해서 이해를 못하고 있는것 같습니다..
      따로 공부해보고 궁금한점 질문 드릴께요..

    • dklee7206 2013.05.16 16:26  댓글주소  수정/삭제

      프로토콜 구현하는쪽과 받아들이는 쪽 이런 부분이 구분이 잘 안되고 컨트롤러 각각의 역할이 뭔지 개념이 잘 안잡힙니다. ㅠㅠ

  10. dklee7206 2013.05.18 11:21  댓글주소  수정/삭제  댓글쓰기

    델리게이트 프로토콜은 꼭 ViewControllerForWeb에서 선언해주어야 하는건가요?
    그리고 델리게이트로서의 역할을 하기 위해서 ViewController.h에서 메소드와 여러가지를 구현해줘야 한다고 설면해주셨는데 서로의 관계가 잘 이해가 되지 않는데 조금만 더 설명해주시면 감사하겠습니다.

  11. dklee7206 2013.05.19 18:10  댓글주소  수정/삭제  댓글쓰기

    @property (weak, nonatomic)id<viewControllerForWebDelegate>delegate;
    이 부분은 왜 만들어주는 건지 잘 모르겠습니다..

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

      답변이 늦어져 죄송합니다 ^^;
      프로토콜은 음..... 일종의 서로간의 통신이죠?

      프로토콜은 꼭 해당 뷰컨트롤러에서 생성해주지 않아도 됩니다.
      하지만 그 프로토콜을 사용하려면 프로토콜을 사용하고자 하는 컨트롤러에서 내용을 알고 있어야 하므로 구현된 소스파일이 import되어야겠지요 :)

      ViewController가 ViewControllerForWeb의 대리인이 되려면, 해당 프로토콜을 충족시키는 메소드 등이 필요합니다.
      @required에 선언된 메소드가 ViewController에 꼭 구현이 되어있어야 하구요, @optional에 선언된 메소드는 말그대로 있어도 없어도 됩니다.

      그리고 @property (weak, nonatomic)id<viewControllerForWebDelegate>delegate;

      의 의미는 viewControllerForWebDelegate 프로토콜을 따르는 id형의 delegate라는 이름을 가진 변수를 property선언해 주겠다는 의미입니다.

      그래서 이 컨트롤러의 대리인 역할을 할 객체가 자신을 이 프로퍼티에 세팅하게 되는거지요.

      iOS에서 기본적으로 delegate를 달고 있는 녀석들 (UITableView 등)의 레퍼런스 도큐먼트 보시면 delegate가 어떻게 선언되어 있는지 확인해 보세요 ㅎ

      id는 어떤 객체든지 가리킬 수 있는 포인터 형이구요.

      꼭 이 예제가 아니더라도 몇 가지 메소드를 더 만들다 보시면 감이 오실거예요^^;

      보고 이해가 안되면 직접 프로젝트 만드셔서 이것저것 해 보시면 더 빨리 이해되실 거예요 ㅎ

      더 설명이 필요하시면 말씀해 주세요~

  12. Favicon of http://ohsdsl@naver.com BlogIcon hahahaha 2013.09.11 14:58  댓글주소  수정/삭제  댓글쓰기

    storyboard를 이용하여 사용하고 있습니다.

    ㅠㅠ Label이 주소로 안바뀌어서요..

    web 버튼 클릭해서 갈떼 delegate:self 를 어떻게 해야할지 모르겠네요..
    이부분 말고는 다 똑같이 진행한 상태입니다.

    아니면 다른 문제가 있을가요?

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

      ViewControllerForWeb.h 파일에서 delegate 선언부에서 id 앞에 IBOutlet 이라고 써 준 후 저장하시고
      스토리보드에 가셔서 아울렛 연결해 주시면 됩니다.

    • Favicon of http://ohsdsl@naver.com BlogIcon hahahaha 2013.09.12 10:55  댓글주소  수정/삭제

      outle을 어디로 연결을 해야하는건지 궁금합니다.

      지금 스토리보드상에서 아울렛이 연결되는데가 없어서요 ㅠ

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

      일단 스토리보드를 쓰지 않고 해 보세요..

      스토리보드는 앱 구조와 동작 흐름을 익힌 후에 사용하여도 늦지 않습니다...

      스토리보드 절대 쉬운게 아녜요

  13. 안녕하세요? 2013.11.04 23:42  댓글주소  수정/삭제  댓글쓰기

    안녕하세요? 델리게이트에 대해 검색하다가 고수님의 의견을 여쭙고자 들리게 되었습니다. A클래스에서 B클래스에 있는 b메소드를 호출한다고 할때, 예전에는 classB *B = [[classB alloc]init ]; 한다음, [B b]; 이렇게 호출했었거든요. 그런데 B클래스의 특정한 메소드의 경우 호출은 되는데 A의 Array를(이 Array는 Plist파일에 저장한 다음 해당 위치에서 불러옴) 불러올때 Array값이 null 로 들어오더라구요. B클래스의 다른 메소드에서는 Array값을 제대로 받아오는데 왜 특정 메소드에서만 받아오지 못하는지 도무지 원인을 알 수가 없었습니다. 그러다가 해당 메소드를 Delegate선언해서 쓰니까 값을 제대로 받아오더군요. 혹시 원인을 알 수 있을까요? 그리고 classB *B = [[classB alloc]init ]; [B b]; 이렇게 Delegate선언 없이 쓸때의 문제점은 무엇이 있는지 알려주시면 정말 감사하겠습니다.

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

      안녕하세요?
      alloc, init 한다는 것은 새로운 객체가 생성되는 것이기 때문에 클래스 이름이 같더라도 서로 다른 녀석들입니다.
      포스팅 중 클래스와 객체에 대하여 보시고 조금 더 생각해 보시면 알 수 있을지도 모르겠습니다 :)
      방문해 주셔서 고맙습니다!

  14. 감사합니다! 2014.03.05 11:35  댓글주소  수정/삭제  댓글쓰기

    정말 감사합니다.
    해당 강의로 프로토콜을 거의 이해하게 되었습니다.
    책은 봐도 잘 모르겠던데 님 강의를 한번 보게되니 바로 이해하게 되네요.


오늘의 주제

1. UIPickerView
2. UIPickerViewDelegate 
 



서른 두번째 시간입니다.^^

지난 번에는 뺑글이를 돌려보셨겠지요?ㅎ
오늘은 사용자의 입력받기를 해 볼까 합니다~
그 중에 하나로 피커뷰를 해 볼게요~

그 전에 이제껏 우리가 사용했지만 제대로 알지 못했던 NSArray에 대해 조금 알아보고 오시면 좋겠습니다.
Objective-C 카테고리에 포스팅이 되어있어요^^*
2012/04/20 - [Objective-C] - Objective C <11>. 딕셔너리, 배열 ( NSDictionary, NSArray )

자, 다 보셨으면 출발 해 볼까요?ㅎ
스따뚜~~~~~~~~~~~~
전에 추천 한 방 어떠세요?ㅎ 저에게 큰 힘이 됩니다~^^*




# 피커뷰란? 

피커뷰에는 크게 두 가지 종류가 있습니다.

데이트피커뷰, 피커뷰.

말 그대로 날짜 선택 뷰와 일반적인 선택 뷰.

이렇게 두 가지가 있습니다.

날짜선택 이라고 하니까 어떤 녀석인지 감이 확 오시나요?ㅎ

맞습니다 바로 그 녀석입니다~

오늘 해 볼 녀석은 일반적인 피커뷰 입니다.

이녀석만 되면 뭐 날짜 선택 정도야 레퍼런스 보면서 충분히 하실 수 있으리라 믿습니다^^*

# UIPickerView


이제껏 사용하였던 프로젝트 그대로 계속 사용합니다~ㅎ
ViewController.xib에서 ViewController.h로 아울렛과 액션을 그림과 같이 연결 해 줍니다.
(이 정도는 이제 설명 안해드려도 할 수 있으시겠죠? +_+)


자, 그리고 우리는 PickerView를 사용할 것인데...
항상 말씀드리듯이, 이 얼굴마담들은 지 할일을 안합니다...ㅋㅋ
그리고 자신을 나타낼 데이터들을 어디선가 뽑아와야 합니다.
그래서 우리는 ViewController를 PickerView의 데이터소스이자 델리게이트로 선언해줍니다.

그리고 우리는 피커뷰에서 음악 이름을 선택하는 것을 만들어 보려 합니다.
음악 제목들이 들어갈 NSArray를 클래스 멤버 변수로 선언을 해 줍니다.
그리고 아까 잘 연결 하셨으면 아래처럼 아울렛과 액션이 잘 작성이 되어있을 거예요~


자, 저렇게 선언해 주시고 빌드(커맨드+B)를 해 봅시다.
아마 생전 처음보는 Warning이 발생할거예요~
잘 노려보세요 ㅎㅎ
일단 음악 이름이 들어갈 배열을 초기화 해 주시구요 ㅎ


경고를 다시 읽어봅시다.

프로토콜의 메소드가 완성되지 못했다고 지껄이는거 같죠?ㅎㅎ

맞습니다. 누군가가 누군가의 델리게이트 또는 데이터소스의 역할을 수행한다고 선언했으면 꼭 필수적으로 구현되어야 하는 메소드가 있을 수 있습니다.

피커뷰 같은 경우에는 필수적으로 구현되어야 하는 메소드가 있습니다. 그래서 경고를 띄워주는 것입니다.
 
그리하여 무슨 메소드가 꼭 필수로 들어가야 하는지 레퍼런스 탐험을 해 봅니다.

피커뷰 데이터 소스 레퍼런스를 봅니다.
두 메소드 전부 필수(required) 메소드이군요.
필수이므로 살짝 복사해서 ViewController.m으로 가져옵니다 ㅎ


피커뷰 델리게이트에는 필수 메소드는 없네요~ 하지만 우리가 필요한 메소드가 있을 것 같네요~
빨간 네모 쳐진 메소드의 설명을 읽어보면 열(row)를 선택했을 때 호출되는 메소드라고 설명이 있네요~
유저의 선택에 대해 응답하여야 하므로 복사해 옵니다~



자, 그리고 이쁘게 코딩을 해 볼까요?ㅎ 뭐, 설명은 역시나 주석에^^*



실행해 봅시다~! 어!?
요상합니다~ 평소에 보던 모습이 아니죠?ㅎ 위치도 이상하고... 물음표만 나오고 ㅠ


그럼 소스코드를 살짝 고쳐봅시다~


이번엔 위치가 이쁘게 잡혔네요~
그럼 물음표는??? 대체 왜 나올까요?? 저 물음표대신 내가 원하는 것이 나오게 하려면 어떻게 할까요?
음... 저 데이터는 어떻게 가져와야 할까요?ㅠ
그렇죠~
데이터소스에서 건져올 수 있겠죠?ㅎ 역시~!


데이터 소스의 메소드를 살짝 만져 줍시다 ㅎ


짜잔~~~~~~ 이쁘게 나오네용 ㅎㅎ


이렇게도 해 줄 수 있습니다. 이건 어떻게 했냐구요?ㅎ
레퍼런스를 뒤적뒤적 해보시면 나오겠죠?ㅎ






오늘은 추가적으로 혼자 해 볼 것들을 던져 드리겠습니다 ㅎㅎ

1. 바로 위의 그림처럼 셀렉트 인디케이터가 나오도록 옵션을 줘 보세요 ㅎ

2. 미완성인 이 예제를 제목을 선택했을 때 그 음악이 실행이 되도록 수정해 보세요~

3. 여러개의 컴포넌트를 가지는 피커뷰를 만들어 보세요~

답은 공개하지 않습니다~ 여러분의 몫입니다 ㅎ

그럼 오늘은 여기 까~~~~~~~지~~~~~~~!


by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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



Posted by yagom

댓글을 달아 주세요

  1. 초보 2012.05.29 20:34  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님
    블로그 잘 보고 있습니다

    위 예제를 따라했는데 피커뷰에 물음표도 안 나타나고 노래 제목도 안 나타나요 ㅠ.ㅠ

    도와 주세요

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

      1차적으로 두 번째 그림에서 피커뷰 데이터소스와 델리게이트로 선언을 해 주었는지, 그리고 2차적으로 selectAudioName 메소드에서 델리게이트와 데이터소스를 잘 세팅해 주었는지 확인해 보세요.
      상황을 정확히 모르니 제가 대답해 드리기가 참 애매하네요^^;

  2. 인절미후후 2012.06.26 15:25  댓글주소  수정/삭제  댓글쓰기

    피커뷰 강좌 잘보았습니다.
    역시 문제를 내면 답글이 적어지나봐요 ㅎㅎㅎ
    저는 대강대강 해보았습니다.

    그냥 이러면 되겠지...하고 연결만 ㅎㅎ
    저 피커뷰안에서 코팅되는 애도 인디케이터라고 하는군요 셀렉트 인디케이터 새로운 인디케이터 하나 더 알아갑니다~(그래봐야 총 세개..)

    강좌 감사합니다 ㅎㅎ

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

      ㅎㅎㅎ...
      마무리 문제가 문제였을까요?ㅎㅎ

      피커 뷰 안에서 그 파란 줄로 현재 선택된 녀석들을 알 수 있게 해주는 녀석도 인디케이터라고 합니다 ^^*

  3. Favicon of https://winplz.tistory.com BlogIcon 윈플. 2012.06.26 16:45 신고  댓글주소  수정/삭제  댓글쓰기

    올만에 피커뷰 공부하면서 무한으로 돌리는 문제에 대해 고민하고 있습니다.
    기존에 해결했던 방식이
    1. 데이터를 반복으로 집어넣기
    2. 처음 위치를 가운데로 놓기
    3. 선택되면 % 를 이용해서 중간 위치로 돌려놓기
    이 방식으로 해결을 했는데요. 생각해보니 무한이 아니더라고요.
    뭔가 좋은 해결책이 없을까요? (아니면 제가 놓친 레퍼런스가 있을까요?ㅠ)

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

      제가 지금 레퍼런스를 찾아보지 않고 그냥 제 생각을 말씀드려보면...^^

      위의 제 예제에서 볼 때
      titleForRow
      didSelectrow
      메소드에서 각각

      return [audioNameArray objectAtIndex:row % [audioNameArray count]];

      return [audioNameLabel setText: [audioNameArray objectAtIndex:row % [audioNameArray count]]];

      로 처리해 주시면 되지 않을까요...?ㅎ

  4. Favicon of https://winplz.tistory.com BlogIcon 윈플. 2012.06.26 21:04 신고  댓글주소  수정/삭제  댓글쓰기

    음.,, 단순히 데이터를 표시해주는 부분을 고쳐서는 안되더군요.
    [pickerView selectRow:row inComponent:component animated:NO];
    이 부분으로 처리해야 될 것 같은데 생각인데 titleForRow 함수안에서는 제대로 실행되지 않네요 ㅎㅎ;
    결국 처음방법으로 합의봐야될 듯싶네요~

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

      음.. 그렇군요~
      제가 직접 해보지를 못해서 잘 판단이 서질 않네요..ㅎ
      데이터의 양이 극도로 많지 않다면 1번도 임시 해결책이 될 수 있겠네요 ^^*
      제가 정신이 없어서 직접 해보지 못하고 적절한 답변을 드리지 못해 죄송합니다 ㅠ_ㅠ

  5. Sio 2012.07.19 16:14  댓글주소  수정/삭제  댓글쓰기

    2번 문제덕에 삽질좀 많이 했습니다 ㅋㅋㅋㅋ
    노래가 한곡만 나오고 처음 선택된 녀석만 나와서는 ㅡㅡ;;ㅋㅋ

    그래도 어찌어찌 해결되니 성취감이~ ㅎㅎㅎㅎ
    오늘도 잘보고갑니다~!

  6. 서동휘 2012.08.07 11:18  댓글주소  수정/삭제  댓글쓰기

    [[[UIApplication sharedApplication] keyWindow] addSubView:pickerView];

    selectAudioName이란 함수에서 이 부분을 쓰니

    No visible @interface for 'UIWIndow' declares the selector 'addSubView'라는 문구가 뜹니다. ㅠㅠ

    흠.. 무슨 말일까요.,.ㅣ.

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

      안녕하세요 서동휘님~
      UIWindow 클래스에 addSubView라는 메소드가 선언되어 있지 않다는 경고문구 입니다...
      에러가 나서 실행이 안되나요?
      iOS 몇 버전에서 그렇게 나오나용?

  7. 서동휘 2012.08.07 18:06  댓글주소  수정/삭제  댓글쓰기

    으이그ㅠㅠㅋㅋ다시 쓰니까 이런 오류가 사라지네요 ㅠㅠ

    성실한 답변 감사합니다 ㅎㅎ 매번 배우고 갑니다^^

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

    쭈욱 잘 보고 있습니다..감사합니당

  9. dklee7206 2013.05.12 02:24  댓글주소  수정/삭제  댓글쓰기

    잘 보고 있습니다. 감사합니다.
    피커뷰 관련해서 질문드려요.. 화면에 다른곳 터치하면 피커뷰 내려가는 이벤트 구현하려고 하는데요.
    쉽게 할 수 있는 방법이 있을까요?

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

      가장 쉬운 방법이라면...
      꼼수로.. 화면에 투명 버튼을 하나 올려두고 그 버튼에서 피커뷰 내리는 메소드랑 연결해주면 되겠죠? ^^

  10. dklee7206 2013.05.13 09:42  댓글주소  수정/삭제  댓글쓰기

    네 감사합니다~ 그렇게 한번 해보겠습니다. ^^*

  11. 리얼왕초보 2013.07.29 19:18  댓글주소  수정/삭제  댓글쓰기

    주옥같은 강좌 잘 보고있습니다~^^
    질문에 답변도 너무 잘 해주셔서 공부하는데 힘이나고 도움이 많이 되고있습니다~

    지난번에 맥부기에서는 1번문제만 해결했었는데
    다시 한 번 보니까~
    1,2,3번 다 해결했네용~^^ 야곰님 덕분입니다~
    감사합니당~~

  12. 어제 글을남긴것같은데.. 2013.11.11 12:02  댓글주소  수정/삭제  댓글쓰기

    어찌된 영문인지 글이 지워져 있네요.
    ios7 이랑 xcode 업데이트 후 갑자기 문제가 생겼는데요,

    키 윈도우에 올린 피커뷰를 최상위로 올리는 명령어가 이상하게 동작합니다.
    피커뷰가 ios7 이 되면서 디자인이 달라졌던데 그래서 그런걸까요 ?

    예전엔 최상위로 올라오던 메뉴가 갑자기 최상위로 올라오지 않네요ㅠ

    어떻게 해야 할까요?

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

      음... 글쎄요^^;

      저도 해보니 iOS7에서 안되고 있어요. 왜 그런지는 아직 시간이 없어서 파악을 해보지는 못했는데, 구글링 해보시면 힌트를 얻지 않을까 싶습니다..

  13. 으아.. 그냥 2013.11.12 13:05  댓글주소  수정/삭제  댓글쓰기

    버그같은데 혹시라도 해결 방안을 알게되면 코멘트 주세요~
    매일 들리고 있습니다 ㅠㅠ

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

      새로 프로젝트를 만드셔서

      AppDelegate에서 첫 런칭 메소드에

      [self.window makeKeyAndVisible];

      써주시고,


      - (void)viewDidAppear:(BOOL)animated
      {
      [super viewDidAppear:animated];

      UIWindow *keyWindow =[[UIApplication sharedApplication] keyWindow];
      UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:keyWindow.bounds];
      [pickerView setBackgroundColor:[UIColor redColor]];
      [pickerView setDelegate:self];
      [pickerView setDataSource:self];
      [keyWindow addSubview:pickerView];
      }

      이렇게 한 번 해보세요.

      viewDidLoad 말고 viewDidAppear를 사용하여 뷰가 나타난 후에 한 번 해보세요~

  14. 아하 2013.11.12 20:06  댓글주소  수정/삭제  댓글쓰기

    해결 방법을 알았어요.

    현재 야곰님 소스처럼 버튼 터치액션후 키윈도를 위로 올려서 썼었는데,

    갑자기 원래 있던 파란틀에 흰배경 피커뷰 틀이 사라지고

    이번에 ios7에 업데이트 된 피커가 들어오면서 생긴 문제였군요.

    위에 주신 소스보고 피커뷰 소스 배경색을 흰색으로 넣고나니 기본으로 제공되는 피커뷰처럼 동작하네요^^

    제가 구현해둔 앱 배경색이 흑색이라 아무것도 안나오는것처럼 보였는데,

    백그라운드컬러 주신거보고 힌트얻어서 해결했습니다 ^^;

    빠르고 친절한 답변 감사합니다 ~ ^^


오늘의 주제

1. UIActivityIndicator
2. NSThread



서른 한 번째 시간입니다.^^

지난 번에 소리재생을 했는데, 화면이 멍 때리는 현상이 발생하였죠?ㅎ
자, 그녀석을 해결할 방법을 찾아봅시다.

그리고 로딩할 때 그냥 로딩되면 심심하니까 뺑글이도 한 번 넣어줘 봅시다~
스따뚜~~~~~~~~~~~~

그 전에 추천 한 방 어떠세요?ㅎ 저에겐 큰 힘이 됩니다 +_+ㅋ

# NSThread

일단, 화면이 멈추는 것 먼저 해결을 해 보도록 할게요.

스레드 라는 녀석이 있습니다.

우리가 이제까지 일반적으로 코드를 통해 동작시킨 녀석들은 거진 다 메인 스레드에서 동작을 하게 됩니다.

그런데 메인 스레드에서 무슨 일을 명령을 하면 어떤 한 일처리가 끝나기 전까지는 다른 일처리를 하지 못합니다.

다시 말해서 음악 플레이를 준비해! 라고 명령을 하면 음악 준비에 너무 열중 한 나머지 화면처리를 하지 못한다는 뜻입니다.

그래서 버튼이 퍼렇게 남아있고 화면이 멈춘 것처럼 보이게 되는 것이죠.

그래서 우리는 명령을 여러 줄로 분산시켜서 여러개의 명령은 한 번에 처리하도록 처리해 줄 수 있습니다.

그것을 스레드라고 합니다.

그래서 화면처리는 메인스레드에서, 로딩이나 파일 처리는 다른 새끼 스레드에서 처리를 하게 해 줍니다.

화면 처리는 메인스레드에서만 해줘야 합니다..^^

그래서 우리는 음악 로딩과 플레이 명령을 다른 스레드에서 동작하도록 구현해 보도록 할거예요~

간단합니다 ㅎㅎㅎ

코드 몇 줄로 끝!

지난 번에는 버튼을 누르자 마자 해당 명령들을 실행을 했는데, 이번에는 명령들을 새로운 메소드에 넣어주고, 기존 메소드에서는 버튼을 누를 때 스레드를 생성해 주는 코드로 바뀐거예요~^^

ViewController.m으로 이동합니다~


자, 마법처럼 파란 멍 때리는 현상이 없어졌죠?ㅎ

화면처리는 메인스레드에서 해주고, 음악 파일 준비와 실행은 새끼 쓰레드에서 처리를 하기 때문이예요 ㅎ
 
# NetworkIndicator, UIActivityIndicator
 

자, 이번에 뺑글이를 넣어 봅시다~

뺑글이의 종류는 크게 두 가지, 네트워크 인디케이터, 액티비티 인디케이터가 있습니다.

네트워크 인디케이터는 말 그대로 네트워크를 사용한다는 의미로 보여주구요, 액티비티 인디케이터는 뭔가 자료처리를 하고 있음을 보여주는 녀석입니다.

두 녀석 다 화면에 표시해 보도록 할게요. 물론 실제로는 불필요하게 네트워크 인디케이터를 사용해서 오해를 살 필요는 없겠죠?ㅎ

일단 헤더파일로 와서 액티비티인디케이터를 하나 선언해 줍니다.


그리고 viewDidLoad 메소드에서 nil로 초기화를 해 주구요~


인디케이터를 생성해 주는 메소드를 추가해 줍니다.
아까 말했듯이 화면처리는 메인 스레드에서 해줘야 하는데 액티비티 인디케이터는 화면처리에 속하므로 메인스레드에 넣어줘야 해요~
네트워크 인디케이터는 이것과는 좀 별개라 상관이 없는데 액티비티 인디케이터는 이렇게 처리를 해주어야 합니다...ㅎㅎ


자, 이렇게 다들 잘 나오시나요?ㅎ

저는 잘 나오네용 ㅋㅋㅋ

이렇게 오늘도 하나 툭 내려놓고 갑니다~

또 필요한 것 있으시면 댓글 주세요~^^

저 그럼 이만 물러가 보도록 하겠습니다~!


by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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



Posted by yagom

댓글을 달아 주세요

  1. 뺑글이 2012.05.19 00:16  댓글주소  수정/삭제  댓글쓰기

    저... 뺑글이가 돌아갈때 자신이 가지고있는 gif이미지를 사용할수는 없나요?

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

      물론 가능합니다만 커스터마이징을 해야하지요...^^
      http://blog.blackwhale.at/?p=336
      여기를 참고해 보시기 바랍니다~

  2. 인절미후후 2012.06.07 19:44  댓글주소  수정/삭제  댓글쓰기

    인디케이터 사용법도 다양하군요~
    제가 이 코드 다 해보기 전에는 히든으로 해서 닙파일에 불러놓고 쓸때만 비지블해서 사용하는건가 했는데
    야곰님의 코딩습관이 보이는거 같기도 하고 제가 안쓰는 방식으로 구현하시니 뭔가 더 깊이가 있어 보이네요
    좋은 실습 해보았습니다. 감사합니다~

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

      사실 이것도 인디케이터 정지 메소드를 따로 구현하고 메인스레드에서 호출 해 주었어야 했는데 잘못 처리를 했어요^^;
      저는 너무 부족합니다^^;
      항상 과찬의 말씀 겸허히 듣겠습니다.
      댓글 정말 고맙습니다 ㅎ
      또 놀러오세요^^~

  3. 인절미후후 2012.06.26 14:52  댓글주소  수정/삭제  댓글쓰기

    차근차근 해보는데 의문이 생기더군요
    음악이 재생되는 중에 홈버튼을 눌러서 홈으로 가니 음악소리는 안나는데 백그라운드에서는 음악이 재생되고 있군요
    다시 아이콘을 클릭해서 어플로 가보니 홈버튼 누르기전의 음악이 아니라 계속 음악이 흘러가서 그 후의 음악이 나오네요
    뷰를 띄워서 한거면 viewWillDisapper 같은 메서드를 오버라이딩해서 사용할텐데. 메인뷰라서 AppDelegate에서 받는 이벤트 밖에 못받나봐요 해결방법을 생각해보면서 다음 강좌로 진행하도록 하겠습니다.

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

      아하 네~^^*
      아마 프로퍼티로 옵션 세팅하는 부분이 있을 것으로 생각이 되는데 지금은 찾아보지 않아서 확실하게 답변을 못드리겠습니다 ㅎㅎ 한 번 레퍼런스 찾아보세용~^^

      그리고, 만약에 옵션이 없어서 수동으로 멈추고 재생해 주어야 한다면 우리는 아주 좋은 녀석을 알고 있죠.
      노티피케이션이라는 좋은친구요 :-)

  4. 앱만들자 2012.07.14 16:30  댓글주소  수정/삭제  댓글쓰기

    야곰님 덕분에 조금은 앱에 대해 이해가 조금은 가는 것 같네_감사합니다......

  5. 앱만들자 2012.07.15 15:51  댓글주소  수정/삭제  댓글쓰기

    인디게이터 설명 머리에 쏙쏙 잘들어오네요 감사드립니다.....이해가 잘되게 설명 되있어서

  6. Yoo 2012.08.02 14:29  댓글주소  수정/삭제  댓글쓰기

    막히는 부분이 있었는데 이글을 보고 해결했습니다 너무 감사드려요 ^^ 많은 정보 공유했음 좋겠어요^^

  7. 나에게넌 2012.08.13 13:26  댓글주소  수정/삭제  댓글쓰기

    점심먹고 또 야곰님 강의 먹으니 배 터져요..감사합니다..

  8. chobo 2012.09.08 17:21  댓글주소  수정/삭제  댓글쓰기

    Thread 를 사용해야하는 경우가 궁금해지는데요. 예를 들어 프로그램 설계시 performance 가 달릴 것 같은 부분들에 이용을 해주면 되는 것인가요?

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

      안녕하세요~
      스레드를 이용하는 경우에 대해서는 한줄로 설명하기가 참 애매한데요...
      만약에 별도의 스레드를 생성하지 않고 메인스레드에서 모든 일을 처리하게 된다면 순차처리 방식으로 처리가 되게 됩니다.
      무슨뜻이냐 하면, 코드에 나오는 순서대로 앞의 일을 처리 한 뒤에 다음 일을 진행하게 된다는 뜻이죠. 그런데 우리는 한꺼번에 여러 일을 처리하고 싶을 때가 있습니다. 그럴 때 스레드를 사용한다고 보시면 될 것 같아요 :) 너무 설명이 미흡한가요^^;
      추가적으로 궁금하신 것이 있다면 말씀해 주세요 ㅎ

  9. 딴또 2013.03.20 14:35  댓글주소  수정/삭제  댓글쓰기

    수고하셨습니다.

  10. 리얼왕초보 2013.07.29 16:05  댓글주소  수정/삭제  댓글쓰기

    안녕하세요~~ 야곰님 또 한주가 시작됬네용~
    화이팅 한주 되세요^^

    이번 장도 다시 보니까~ 이해가 슉슉되네요
    단,,,, 설명해주신 것만 이해가 되는 한계가 있네요;;
    궁금한게 하나있습니다~
    activityIndicator를 코드로 넣지 않고 저는 IB로 넣어줬는데요(프로퍼티 선언은 했습니다)
    attributes inspector에서 설정을 어떻게 해야하고, 코드는 어디에 어떻게 넣어야 하는지..
    이렇게 저렇게 다 해봐도 위에 야곰님이 하신 것 처럼 구현되지가 않네요 ㅠㅠ
    야곰님의 신의 한 수 가르침 부탁드릴게요~

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

      안녕하세요~!
      흠...
      글쎄요;;
      코드로 하나 IB로 하나 저기에서 큰 차이가 없어요...
      프로퍼티로 넣으셨다면 indicatorView 대신 self.indicatorView로 똑같이 진행하시면 될 것 같아요... 'ㅁ'


오늘의 주제

1. UIAlertView


스물 아홉번째 시간입니다.^^

지난 번까지는 웹뷰에 대해서 알아보았습니다.

이번에는 AlertView에 대해서 알아보도록 하겠습니다.

AlertView는 xib에서 생성이 되지 않고 코드로 생성을 해 주어야 합니다.ㅎ

그럼 일단 시작해 봅시다~!

# UIAlertView

자, 일단 AlertView는 delegate가 없으면 무용지물입니다.
이녀석은 그냥 얼굴만 비출 뿐 아무것도 하지 않으려고 합니다.
그래서 우리는 ViewControllerForWeb에게 AlertView의 델리게이트를 해달라고 말할거예요.


자, 그리고 AlertView도 하나가 아니면 구분을 할 수 없기 때문에 태그를 넣어줄 예정이예요.
그래서 enum으로 먼저 어떻게 해줄지 정해줍니다.
enum은 첫 번째 수를 지정해 주고, 쭈욱 써주면 자동으로 하나씩 숫자가 늘어서 등록이 되어요.
첫 번째 녀석이 1이면 두 번째는 2, 세 번째오는 녀석은 3... 이런식으로요~


자, 그리고 나서 전에 작성했던 코드들을 조금 수정해 봅니다.


자, 실행 해 봅시다.
이렇게 얼럿이 뜨는게 보이시나요?ㅎ
버튼을 눌러봅니다.


반응이 없어요..ㅋㅋㅋ 네... 아까 말씀드렸듯이 이녀석은 그냥 얼굴만 비출 뿐 아무것도 하지 않으려고 합니다.
그래서 우리는 델리게이트에게 일을 맡겨야 해요.

자, 오늘도 어김없이 레퍼런스를 뒤적뒤적 합니다~
어김없이 커맨드 쉬프트 알트 / 를 누릅니다.
검색을 쇼숑~
아래 보니 사용자가 버튼을 클릭했을 때 무엇을 해줄지 말해줄 수 있는 메소드가 있군요.


이녀석에 대해 설명을 보니 유저가 버튼을 통해 대답을 하면 델리게이트에게 무엇을 할지 말해 줄 수 있는 녀석인 것 같네요.
복사해옵니다 ㅎㅎ


그리고 처리해줄 델리게이트인 ViewControllerForWeb에서 구현해 줍니다.

우리가 원하는 기능에 대해서 잘 써줍니다.
역시나 설명은 주석으로^^

 
짜잔~ 실행해서 눌러보면 어떤가요?ㅎ
잘 동작하나요?


정말 종료하시겠습니까?

예.

그러므로 오늘 포스팅은 여기까~지 ㅋㅋㅋㅋㅋㅋㅋㅋ

다음에 보아용~^^


by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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



Posted by yagom

댓글을 달아 주세요

  1. 생초보 2012.05.11 14:56  댓글주소  수정/삭제  댓글쓰기

    감이와요 감이와요~~~ 창문밖에서 한줌 햇살이 쫘아~악 비춰주는거 같네요 ㅋㅋㅋ 지금 날씨는 우중충하지만 ㅋㅋㅋ


    감잡았어요 ~~

    퇴근후 다시 첨부터 복습 해봐야겟어요

    강좌 잘 보고있어요 감사합니다 ㅎㅎ

  2. 인절미후후 2012.06.06 19:48  댓글주소  수정/삭제  댓글쓰기

    잘 읽고 갑니다~
    얼럿뷰는 그냥 워닝 메시지 띄워주기만 하고 델리게이트는 사용하지 않았었는데
    야곰님께서 사용하신걸 보니까 저도 사용하고 싶어지는 마음이 마구 샘솟네요 좋은 강좌 감사합니다.

  3. 쌩초짜 2012.06.28 17:40  댓글주소  수정/삭제  댓글쓰기

    항상 잘 읽고 있습니다.

    프린트까지 하면서 보다가 문득 궁금한게 있어서요.
    위의 예제에서 alterview 의 delegate를 선언해주는 부분있자나요?
    헤더파일에...
    그부분을 지워보고 컴파일을 해도 잘 돌아가던데
    그부분을 꼭 써줘야하는건가요?
    안써주는거랑 어떤차이가 있는건가요?


    변경전
    @interface ViewControllerForWeb : UIViewController <UIAlertViewDelegate>

    변경후
    @interface ViewControllerForWeb : UIViewController

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

      제가 아직 확인해 보지는 않았지만, 아마 alertView의 델리게이트를 self로 지정해 줄 때 경고가 생길 것입니다.

      써주신 두 줄의 코드 차이는 사실상 명시를 해 주었다는 것에 큰 의미가 있을 것 같습니다.

      한 마디로 써줘도 그만 안써줘도 그만이지만(안 써주면 경고가 발생되죠), 이왕이면 명시적으로 써주는 것이 좋겠죠 :-)

      자주 들러주세요 :-)

  4. hobbang 2012.07.19 16:22  댓글주소  수정/삭제  댓글쓰기

    sample 보고 따라서 써보기만 했었는데,
    강좌 올려주신걸 보니 어떻게 써야 하는지.. 이해가 잘 되네요. 감사합니다.

  5. Favicon of https://kier9.tistory.com BlogIcon 리현느 2012.07.29 07:56 신고  댓글주소  수정/삭제  댓글쓰기

    나 어특햄 흑흑 경고창 안뜨넹

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

      아픈게 아직 안나으신건가요 +_+ㅋㅋ
      버튼에 태그가 잘 들어가 있는지,
      버튼에 메소드가 잘 연결이 되어있는지,
      [alert show];
      가 작성이 되어있는지... 등등 잘 살펴보세용~
      이래도 저래도 안되면 빌드 클린 해 보고 다시 해보셔요~
      커맨드+쉬프트+K

  6. Favicon of https://kier9.tistory.com BlogIcon 리현느 2012.07.30 09:13 신고  댓글주소  수정/삭제  댓글쓰기

    될때까지 해봤더니 되요 ㅎㅎㅎㅎ 짱짱

  7. 서동휘 2012.08.06 13:26  댓글주소  수정/삭제  댓글쓰기

    이상하게도 ㅠㅠ AlertView *alert 쓰는게 여기서 부터 빨간색 느낌표가 뜨네요

    AlertView를 인식하지 못하는 것 같은데 무슨 문제일까요 ㅠㅠ

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

      안녕하세요 동휘님~!
      AlertView가 아니라 UIAlertView 입니다~ㅎ
      만약에 그래도 에러가 난다면 위에 똑같은 alert 객체를 생성하셨는지 확인해 보세요~ㅎ
      같은이름의 객체가 겹치면 에러가 나옵니다~!

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

    폭풍 흡입!!! 감사합니다..

  9. Favicon of https://gogodao.tistory.com BlogIcon rustyDAO 2013.02.15 16:53 신고  댓글주소  수정/삭제  댓글쓰기

    야곰님~
    맥부기에서 야곰님 강좌 처음 접하고, 여기서 계속 강좌보면서 공부하다가 모르는 건 맥부기 야곰님 강좌에 질문했었는데 ~
    T-Story 가입해서 이제 여기다 남겨볼려구요 ^~^ㅋㅋㅋ

    하나하나 다 해보고 있는데, 오늘 switch문에서 으아 오타를 내버려서ㅠㅠ web뷰 닫기버튼이 제대로 안먹히는 실수를....
    무슨문제인지 찾을려고 디버깅을 해보았는데요~ visual studio에서 디버깅하던 그런 경험으로 ㅋㅋㅋ
    아 근대 아직 xcode에서 디버깅 하는게 너무 미숙하네요 ㅋㅋ 또 뭐 메모리 누수 감지 시뮬레이터 등 이런것도 있다던데,,

    야곰님 여유가 되신다면 ! 조심스레 디버깅, 시뮬레이터 다루는 것도 조심스레,, 요청해봅니당
    배우는 입장에서 염치 없지만,,, 강좌에서 담번에는 뭐할까요? 이러셔서 ㅋㅋㅋㅋㅋㅋ 헤헤,,ㅋㅋㅋㅋ

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

      안녕하세요 다오님 :)
      제가 요즘 개인적으로 건강 악화와 사정으로 인하여 포스팅을 하지 못하고 있습니다...^^;

      이렇게 찾아와 주셨는데 좋은 답변을 드리지 못해서 정말 죄송합니다... ㅠ_ㅠ

      제가 직접 올릴 순 없지만, 좋은 강좌들 링크 알려드릴게요.
      도움이 되면 좋겠습니다 :)

      가끔 들러서 또 덧글 남겨주세요 ㅎ

      포스팅은 못해도 질문답변이나 도와드릴 수 있는 부분이 있으면 언제든 준비가 되어있습니다 ^^*

      http://www.raywenderlich.com/10209/my-app-crashed-now-what-part-1
      http://www.raywenderlich.com/2657/memory-management-in-objective-c-tutorial
      http://www.raywenderlich.com/2696/how-to-debug-memory-leaks-with-xcode-and-instruments-tutorial

  10. Favicon of https://gogodao.tistory.com BlogIcon rustyDAO 2013.02.18 09:37 신고  댓글주소  수정/삭제  댓글쓰기

    아.. 야곰님 빠른 쾌유를 빕니다..
    아프신대도 이렇게 질문 받아주시고, 또 좋은 자료도 소개해 주셔서 정말정말 감사합니다..
    이 은혜를 어찌 갚아야 할지 ㅠㅠ

    얼른 몸부터 빨리빨리 나으셔요 !

  11. DinoJ 2013.06.11 10:41  댓글주소  수정/삭제  댓글쓰기

    정말 강의가 재밌고 귀에 쏙쏙 들어와요~!!
    항상 감사해요 야곰님^^


오늘의 주제

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. UIImagePickerController 
2. UIImagePickerControllerDelegate



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

지난 번 액션시트에 이어 이어지는 포스팅입니다^^
2012/04/21 - [iOS Dev/함께해보기] - iOS개발하기 #25. 액션시트 (UIActionSheet)

이번에는 액션시트를 눌러서 적절히 사진을 불러오는 방법에 대해 알아봅니다~
재미있겠지요?ㅎㅎ
고고~~~~~~~~~~~~~~~~~~~~~

★ 이번 포스팅은 Potomac님의 요청으로 진행해보았습니다 ^^* 
사실 이거 해봐야지 하다가 마침 Potomac님께서 요청해 주셔서 이제야 합니다 ㅎ 고맙습니다~!

# UIImagePickerController


자, 이제 사진을 불러와 보도록 할게요~
우선은 이미지 피커 이녀석도 자신을 도와줄 델리게이트가 필요로 합니다.
이녀석을 쓰려면 델리게이트가 두놈이 필요한데요, UIImagePickerControllerDelegate와 UINavigationControllerDelegate입니다.
이녀석 화면을 왔다갔다 하려면 네비게이션이 필요해서 그런가봐요 ㅎㅎㅎ
헤더파일에서 이쁘게 적어줍니다.


그리고 MyAnimationViewController의 구현파일로 넘어와서 액션시트 델리게이트 메소드에 이미지피커 컨트롤러 녀석들을 적절히 넣어줍니다.
자세한 설명은 주석처리 되어있으니 참고하시기 바랍니다~
저는 버튼이 정사각형이라 정사각형으로 자르고 싶어서 allowEditing 옵션을 YES로 설정해 주었습니다.


자, 그런데 이렇게 사진을 불러오려고 하는데, 시뮬레이터에 사진이 없습니다...
하............ 멘붕..........ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
하지만 다 방법은 있죠잉~


원하는 사진을 시뮬레이터 화면으로 끌어오면 사파리창이 뜨면서 이미지가 나옵니다.
그럼 이미지를 꾸욱 눌러주시면 아래처럼 액션시트가 등장합니다. 공교롭게도 지난번에 포스팅했던 액션시트가 나오네요 ㅎㅎㅎ
저장해줍니다.


물론 디바이스에서 실행하면 이렇게 사진들이 쭈욱쭈욱 나오겠죠?ㅎ
어쨌든 시뮬레이터건 디바이스건 사진을 선택해 봅시다.


사진을 선택하고 나면 이렇게 나오는데요~ Choose 또는 선택 버튼을 눌러보세요~


네...ㅋㅋㅋㅋㅋㅋㅋㅋ
아무일도 일어나지 않습니다.
왜냐구요? 이미지 피커 컨트롤러도 얼굴마담일 뿐이거든요 ㅋㅋㅋ

그래서 델리게이트에게 무엇을 해달라고 말해야 합니다.
그러면 델리게이트가 뭘 해줄 수 있는지 알아봐야겠지요?
또 개발문서로 놀러가 봅시다 ㅎㅎ
Picker를 닫을 때 델리게이트가 할일이 있네요~


'사용자가 사진이나 동영상을 집어내었을 때 델리게이트에게 말해준다.' 라고 설명되어있네요.
요 메소드를 일단 복사해 둡시다.
그리고 넘어오는 인자중에 info라는 녀석이 있는데 우리는 이녀석이 무엇인지 모르겠습니다.
한번 링크를 클릭해 봅시다.


우리가 원하는 녀석을 찾아봅니다.
네모로 잘린 사진을 원하는데.....
아! 찾았네요~!
UIImagePickercontrollerEditedImage라는 키로 이미지를 불러올 수 있다고 하네요 ㅎ


뭐 이정도 알아냈으니 충분한 것 같습니다.
이제 다시 코딩의 세계로 여러분을 초대합니다 ㅎㅎㅎ

우리는 피커를 띄워줄 때, MyAnimationViewController를 델리게이트로 지정을 해 주었습니다.
그러므로 MyAnimationViewController 구현파일로 와서 델리게이트 메소드를 구현해 줍니다.
아까 복사해 두었죠~? 

 
그리고 실행하여 사진을 선택해 봅니다~
짜잔~ 버튼으로 이쁘게 이미지가 들어왔네요 ㅎㅎㅎ


어때요 흥미로운 내용이었나요?

다음 번에는 뭘 해볼까나요? ㅎ 피드백좀 주세요~_~

다음에 뵈어요~

by yagom

twitter : @yagomsoft

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

RSS Feed 받기   


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

Posted by yagom

댓글을 달아 주세요

  1. 오싹이 2012.04.26 16:21  댓글주소  수정/삭제  댓글쓰기

    열심히 따라하고 있었는데 새 내용이 올라 왔네요....
    감사합니다.

    스토리보드 한번 해주세요!!!

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

      관심 가져주셔서 고맙습니다^^*
      스토리보드는 제가 제대로 사용해 본적이 없어서 포스팅 하기가 애매하네요~_~
      요즘 너무 바빠서 따로 공부할 시간이 별로 없어서 단기간 내에는 힘들 것 같습니다^^;
      다음 번에 기회가 되면 공부해서 포스팅해 볼 계획입니다..ㅎ
      자주 놀러오세요~^^

  2. Berry 2012.05.02 16:21  댓글주소  수정/삭제  댓글쓰기

    사진이 이쁘게 잘 들어오네요!! ㅎㅎ
    올라온 강좌까지 이제 모두 다 보았군요!!
    다음번엔 어떤 강좌를 보게될지 흥미진진합니다
    제가 지금까지 보아온걸 정리하면서
    다음번에는 어떤 강좌를 한번 진행해주셨으면 하는지
    코멘트를 꼭 ! 달아드리겠습니다
    26번째 시간까지 고생많으셨고
    다음강좌도 기대하겠습니다 !

  3. 생초보 2012.05.05 02:20  댓글주소  수정/삭제  댓글쓰기

    고생이 많으셔요~

    다음 강좌는~~!!

    웹이나 db 에서 데이터값을 가져와서 앱에 뿌려주는~~~ 그런 강좌 어떨까요???~~

    매일매일 과일이나 채소 등등 가격이 바뀌는거를 실시간 시세를 앱으로 확인하는 앱을 만들고 싶어서 공부중인데^^

    혼자 책사서 독학중인데 여간 어려운게 아니네용...

    로또번호 확인하는 앱처럼 웹에서 데이터 값을 가져와서 앱에 뿌려주는 앱 !!! 꼭 만들어 보고 싶어요~

    도와주세요~










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

      ^^* 관심 가져주셔서 정말 고맙습니다 ㅎ
      안그래도 그 내용은 진행할 예정인데, 아마 조금은 더 있어야 하지 않나 싶습니다..^^
      간단하다면 간단하지만 복잡하다면 복잡한 내용이라, 일단 정말 기초부터 해 놓고 기본으로 올라가 보려 합니다.
      조금만 기다려 주세요~^^
      좋은 주말 되시길..!
      고맙습니다~

  4. 생초보 2012.05.05 14:04  댓글주소  수정/삭제  댓글쓰기

    와~~ 벌써부터 기대됩니다 궁금햇던 부분이 강좌로 올라올 예정이라니
    그때까지 열공하면서 자주 올께요 감사합니다

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

      네, 빠른 시일내로 올라올지는 모르겠지만, 조금은 시간이 더 필요하지 않나 생각해 봅니다^^;
      관심 주셔서 정말 감사합니다~!

  5. 2012.05.09 19:57  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 하하 한번도 블로그를 보고 댓글을 남겨본적이 없는데
    야곰님 블로그에는 안남길수가 없어서 이렇게 처음으로 댓글을 달아봅니다
    아이폰 혼자 공부하려니 좀 답답하고 이것저것 꼬이는게 많아서
    시작한지는 꽤 됐는데 아직 감을 못잡고있었어요
    근데 야곰님 블로그를 처음부터 여기까지 차근차근 보면서 따라하다보니
    어느정도 감이 오는것 같아요
    뭐 아직 갈길이 멀겠지만
    그래도 이것이 어떤식으로 동작하는지
    어떤식으로 찾아보고 프로그램을 만들어야하는지
    소스를 얻은것 같아서 참으로 도움이 많이 되었습니다


    앞으로 두개의 강좌가 남았는데
    그거 마저보고
    지금까지 한것을 복습한다 생각하고
    야곰님의 소스 안보고 다시 처음부터 만들어보려고해요

    진짜 도움 많이 받고갑니다
    앞으로도 강좌 또 올려주시면 자주들러서 열심히 공부하려구요 히히

    진짜 완젼 대박 감사합니다 ^-------------^

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

      안녕하세요 탱님^^*
      정말 이런말씀 해주셔서 영광입니다.
      아직 저도 쓸날이 많이 남았네요...ㅎ
      제가 기초만 쓰려고 했던 분량에 반도 못왔네요 +_+
      워낙 분량이 방대하다 보니 산넘어 산이네요...ㅎ
      자주자주 들러서 댓글도 남겨주시고, 필요한 것 있으시면 말씀도 해주세요 ㅎ
      특별한 일이 없다면 일주일에 두어개 씩은 포스팅 올라갈거예요~^^*

  6. 사랑해 엑스코드 2012.07.13 12:50  댓글주소  수정/삭제  댓글쓰기

    좋은 강의 감사합니다. 한가지 궁금한게요. 웹상에 사진이 있거나 앱에서 사진 클릭했을때 액션시트 뜨고 저장하는 방법 포스트 가능하신지 궁금합니다.

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

      웹상에 사진은 꾸욱 길게 누르고 있으면 액션시트가 자동으로 올라옵니다 ^^
      앱에서 사진을 클릭했을 때 사진을 저장하는 방법은, 몇 가지 방법이 있는데요, 가장 쉬운 방법으로는 버튼으로 구현하는 방법이 있지요.
      버튼의 백그라운드 이미지를 원하는 사진으로 넣고, 버튼은 터치했을 때 액션시트가 올라오도록 하면 되겠죠?
      제 블로그에 있는 글들을 보시고 잘 응용하시면 충분히 가능한 작업입니다^^
      제가 요즘 정신이 없어서 한동안 포스팅을 못하고 있네요 ㅠ_ㅠ
      정말 죄송합니다.
      종종 들러주세요. 고맙습니다 :-)

  7. Sio 2012.07.18 12:23  댓글주소  수정/삭제  댓글쓰기

    아휴... 액션시트 ㅡㅡ ㅋㅋㅋㅋ
    사진 처리하는데 필요한 Delegate도 여러개고 이것저것 많네요 ㅎㅎㅎ
    여러번 반복해서 자동으로 딱딱 나오게 노력해야 겟어요 ㅎㅎㅎ
    잘보고갑니다~!

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

      자동으로 딱딱 나오는 것도 중요하지만,
      문서보고 잘 찾아서 적재 적소에 사용하는 것도 중요하겠죠?ㅎ
      사람이 컴퓨터가 되면 안됩니다 ㅎㅎ
      사람은 생각할 줄 알고 컴퓨터는 생각할 줄 모른다는 것이 컴퓨터랑 다른거예요 ㅎ
      자동으로 뭔가를 반복하다보면 사소한 것들을 너무나 쉽게 놓쳐버리거든요~ :-)

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

      오홍~ 그렇군요 ㅎㅎㅎ
      적재적소!!! 충고 감사합니다~!

  8. Favicon of https://kier9.tistory.com BlogIcon 리현느 2012.07.25 05:08 신고  댓글주소  수정/삭제  댓글쓰기

    아이시떼르
    ㅎㅎㅎㅎ 잼나네염

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

      이런 공개적인 고백... 설레는데요..?ㅋㅋㅋ
      부끄부끄
      황송하네요 ㅋ
      제 동네에 놀러오시면 차라도 한잔 사드릴게요 ㅋㅋㅋ
      불같은 덧글 넘넘 고맙습니다 ㅎㅎ

  9. neoaero 2012.08.07 09:24  댓글주소  수정/삭제  댓글쓰기

    야곰님!! 일일히 뎃글 달아 주시는거 보면 정말 성실히신분 같아요..
    델리게이트 참 어려운 개념이었는데...이제야 좀 알거 같아요...
    그리고 레퍼런스 찾아보는 방법 가끔식 소개해주시는거 너무 좋은거 같아요..앞으로도 자주 소개 부탁드려요..

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

      안녕하세요 neoaero 님~!
      부끄럽네요^^;
      요즘 포스팅을 하지 못해서 죄송할 따름입니다 ㅠㅠ
      빨리 돌아오도록 노력하겠습니다~!
      자주 들러주시고 덧글도 또 남겨주세요 ㅎㅎㅎ
      힘이납니다~!

  10. hyung 2012.11.07 17:33  댓글주소  수정/삭제  댓글쓰기

    안녕하세요? 야곰님 포스팅이 너무 좋아서 글 남기네요
    한번도 블로그 보고 글 남긴적이 없었는데.. 허허
    회사에서... 한번도 해본적도 본적도 없는 IOS로 카메라를 개발하래요 ..
    ㅠㅠ.. 여기저기 자료 찾아다니다가 너무 저에게 딱 맞는 자료라 감동 받고 글 남겨요
    개발환경은 스토리보드라 조금 다르지만 이것저것 만지다보니 되긴됬어요^^
    프로젝트 끝나면 IMAC을 반납해야 해서 더 못하겠지만
    그동안은 자주 들려서 많이 배울게요~

  11. TaylorHK 2012.11.22 12:43  댓글주소  수정/삭제  댓글쓰기

    흐음....
    버튼 1개로 되는건 이제 할 수 있겠는데..
    버튼 여러개에 각각 이미지 보여지게 하는걸 못하겠네요..ㅠㅠ
    버튼에 태그값 넣어서 해야되는건가요??

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

      버튼마다 태그값을 지정하고 UIButton *button = (UIButton *) [self viewWithTag:태그값]; 으로 버튼을 불러와서 세팅하시면 될거예요~

  12. ios코드왕 될놈 ㅎㅎ 2013.05.13 18:31  댓글주소  수정/삭제  댓글쓰기

    야곰님 블러그에서 야공 야공 기초 쌓아갑니다
    앞으로도 좋은코드 많이 올려주세여

  13. 맨해솔 2013.06.25 13:13  댓글주소  수정/삭제  댓글쓰기

    감사합니다.
    덕분에 이미지 뽑아 오는걸 할 수있게 되었네요.
    그리고 궁금한게 두가지있는데
    가져온 파일 이름알아내는 방법과 영상 도 가져오는 방법도있나요?

  14. 한때... 2013.07.09 16:59  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, 몇권의 IOS 개발 책보다 더욱 이해가 잘되어

    몇일째 푹 빠져 공부하고 있는 초보개발자 입니다.

    모든 강의를 잘 따라 왔는데 유독 이부분에서 이미지 버튼에 이미지가 표시가 되질 않네요 ^^;;

    특별히 에러나거나 하는 부분이 없어 더욱 머리를 싸메고 있지만.. 오탈자나 실수한 부분이 쉽게 보이질 않네요.

    다만 SecondView에서 Push 버튼을 누르면 다음과 같은 로그가 올라오는데 혹시 feedback 해주 실 수 있으신가요??

    부탁 드립니다 ^^;

    2013-07-09 16:49:20.321 ChangeViews[2161:907] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
    (
    "<NSLayoutConstraint:0x1e5e90e0 V:[UIRoundedRectButton:0x1e5fb250(16)]>",
    "<NSLayoutConstraint:0x1e526a40 UIRoundedRectButton:0x1e5fb250.baseline == UIRoundedRectButton:0x1e5e4a60.baseline>",
    "<NSLayoutConstraint:0x1f158af0 V:|-(NSSpace(20))-[UIRoundedRectButton:0x1e5fb250] (Names: '|':UIView:0x1e5e1c20 )>",
    "<NSLayoutConstraint:0x1e5c01e0 UIButtonLabel:0x1e5e9550.centerY == UIRoundedRectButton:0x1e5fb250.centerY>"
    )

    Will attempt to recover by breaking constraint

    <NSLayoutConstraint:0x1e5c01e0 UIButtonLabel:0x1e5e9550.centerY == UIRoundedRectButton:0x1e5fb250.centerY>

    Break on objc_exception_throw to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

    • 한때... 2013.07.09 21:08  댓글주소  수정/삭제

      해결했네요 ㅎㅎ;

      위 이상한 메세지는 신경쓸 필요가 없었네요 ㅠ

      imagePickerController 함수내에

      [picker dismissViewControllerAnimated:YES completion:nil] <<
      이부분을 함수 가장 첫줄에 적어주니.. 사진이 올바르게 이미지 버튼에 출력되었습니다.

      이유는.. 모르겠어요 ㅠㅠ ㅋㅋㅋㅋ

      더욱 머리가 복잡해 지네요 ㅎㅎ

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

      해당 메세지는 iOS 6에서 사용하는 Auto Layout에 대한 경고문구 같아요 :) 지금 이 글의 기준이 iOS 5이기 때문에... 그걸 사용하지 않았었어요 ㅎㅎ

      그런데 저 코드의 위치를 바꿔서 제대로 되지 않았다는건 저도 잘 이해를 못하겠습니다 ^^;

  15. 리얼왕초보 2013.07.25 17:04  댓글주소  수정/삭제  댓글쓰기

    야곰님~ 전에 맥부기에서 강좌를 쫙~ 다봤었는데
    요기 블로그서 다시 한 번 보고 있습니다^^
    그때나 지금이나 정말 감사히 잘~ 보고있구요~
    이번 강좌에서 궁금한게 UINavigationControllerDelegate는 사용이 된 것인지..아닌지 궁금해서요~
    UINavigationControllerDelegate 요녀석을 빼도 실행은 되는데 노란 경고가 하나 살포시 떠주네용..그래서 다시 넣었는데
    왜 필요한지 이해가 잘 안되네용 ㅠ
    UINavigationControllerDelegate Protocol Reference 를 살펴봤지만;; 연관성을 이해를 못하는 바보 ㅠㅠ인가봐용

  16. sy 2013.11.20 15:18  댓글주소  수정/삭제  댓글쓰기

    여려장의 사진을 불러올순없나요 ??..

    만들어야하는데 길좀알려주세요 ㅠㅠ

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

      그건 굉장히 큰 커스터마이징 작업입니다...^^;

      간단한 포스팅 정도로 끝내지는 못할 작업량인데, iOS 개발에 익숙치 않으신 분이면 간단하게는 할 수 없을 것 같습니다.

      오픈 라이브러리를 잘 찾아보시면 답이 나올지도 모르겠습니다 :)

iOS 시뮬레이터의 사진첩에 사진을 넣어봅시다.


시뮬레이터를 실행하고 그냥 아무때나 상관없이 원하는 사진을 시뮬레이터로 끌어다 놓습니다.

그러면 safari창이 뜨는데요, 이미지를 잠시 꾹 눌러줍니다.

그러면 이렇게 액션시트가 뜨는데 거기서 이미지를 저장해 주면 사진첩에 저장이 됩니다.


가끔 정상적으로 저장이 안되는 경우가 있다고 하는데, 다른 이미지로 하시면 잘 될거예요~
jpg나 png 이미지로 시도해 보세요~ㅎ 

↓↓↓도움이 되었다면 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓


Posted by yagom

댓글을 달아 주세요

  1. 인절미후후 2012.04.25 17:06  댓글주소  수정/삭제  댓글쓰기

    원리는 해당 파일의 링크가 사파리브라우저를 통해서 열리는것이죠 iOS가 자유롭게 저장할수 있는건 사진파일만이라서 저 방식으로 사진만 이동시킬수 있는것이구요
    이게 제가 추측해 본건데 맞을까요?

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

      음... 꼭 자유롭게 저장할 수 있는것이 이미지 뿐이라는 것은 저도 확실히는 모르겠습니다만, 파일 링크를 사파리브라우저를 통해서 여는 것은 맞습니다^^~

      ㅎㅎ물론 시뮬레이터 라이브러리에 이미지를 저장하는 다른 방법도 존재합니다만, 이 방법보다 훨씬 복잡하기 때문에 소량의 이미지를 저장하고 싶다면 저는 이 방법을 추천드립니다..ㅎㅎㅎ

  2. yuyu 2012.06.21 17:35  댓글주소  수정/삭제  댓글쓰기

    완전 멋진 팁 감사합니다~!!^^

  3. 동군~ 2012.11.13 14:48  댓글주소  수정/삭제  댓글쓰기

    감사합니다.