'iOS Dev/함께해보기'에 해당되는 글 52건

  1. 2013.06.07 iOS개발하기 #52. UIGestureRecognizer (44)
  2. 2012.09.18 iOS개발하기 #51. 실전 프로젝트. 간단한 계산기와 메모장(2) (30)
  3. 2012.09.11 iOS개발하기 #50. 실전 프로젝트. 간단한 계산기와 메모장(1) (9)
  4. 2012.09.04 iOS개발하기 #49. 예외처리. @try, @catch, @finally (8)
  5. 2012.08.30 iOS개발하기 #48. 객체 간 자료교환 Singleton (2) (22)
  6. 2012.08.27 iOS개발하기 #47. 객체 간 자료교환 Singleton (1) (7)
  7. 2012.08.23 iOS개발하기 #46. 파일 입출력. NSFileManager (28)
  8. 2012.08.20 iOS개발하기 #45. UINavigationBar Customize (Category) (17)
  9. 2012.08.16 iOS개발하기 #44. UIAlertView Customize (Override) (4)
  10. 2012.06.25 iOS개발하기 #43. iOS Application Life Cycle (20)
  11. 2012.06.18 iOS개발하기 #42. XML Parser (3) <TBXML, NSNotification, UITableViewCell> (51)
  12. 2012.06.13 iOS개발하기 #41. XML Parser (2) <TBXML> (29)
  13. 2012.06.11 iOS개발하기 #40. XML Parser (1) <UITableViewCell, UITableView> (14)
  14. 2012.06.08 iOS개발하기 #39. UISearchDisplayController(5) <UIImage, UITableView Section Header> (27)
  15. 2012.06.06 iOS개발하기 #38. UISearchDisplayController(4) <NSThread, Reachability> (10)
  16. 2012.06.04 iOS개발하기 #37. UISearchDisplayController(3) <UITableView, UITableDataSource> (29)
  17. 2012.06.01 iOS개발하기 #36. UISearchDisplayController(2) <UISearchBar, NSThread, JSON, NSRequest> (31)
  18. 2012.05.30 iOS개발하기 #35. UISearchDisplayController(1) <UISearchBar, UITableView> (5)
  19. 2012.05.26 iOS개발하기 #34. NSNotificationCenter (노티피케이션센터) (27)
  20. 2012.05.24 iOS개발하기 #33. Protocol, Delegate (프로토콜, 델리게이트) (31)

오늘의 주제

1. UIGestureRecognizer 사용해 보기


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

정말 오래간만의 포스팅입니다 :)

오늘은 '새벽다섯시반'님의 요청으로 포스팅을 진행해 보도록 하겠습니다.

길게 눌렀을 때 특정 동작을 할 수 있도록 구현해보고 싶다고 말씀하셨습니다.

그녀석은 바로 Gesture Rcognizer!!

그럼 알아볼까요?

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



# Gesture Recognizer란?

말 그대로 유저의 제스쳐를 인식하는 녀석입니다.

양쪽위아래로 밀기(swipe), 꾹 누르기(long press), 탭하기(tap, 여러번도 포함) 등등 많은 제스쳐를 인식할 수 있지요.

자, 그럼 그녀석을 어떻게 사용하느냐?

따라오세요~


일단 프로젝트를 만들어야겠죠?ㅎ
 


네, 만듭니다. 옵션 체크된거 확인해 주시구요~


스토리보드로 와서 View 위에 ImageView를 하나 얹어주시구요. 사진은 넣고싶은거 넣으세요 ㅎㅎ

그리고 Object Library에서 Long Press Gesture Recognizer를 끌어다가 이미지뷰 위에서 올려놓습니다.

참, 이미지뷰의 속성에서 User Interactive Enable에 꼭 체크해 주시구요 :)



좌측에 생성된 Long Press Gesture Recognizer를 우클릭 또는 control + 클릭하여 Image View와 연결되어있는지 확인합니다.

 


그리고 우클릭 또는 control + 클릭으로 View Controller로 쭈욱 드래그 하신 후에 까만 창이 뜨면 delegate로 설정해 줍니다.

자, 스토리보드에서 준비는 끝났습니다.
 


이제 헤더로 와서 UIGestureRecognizerDelegate 프로토콜을 따르겠다고 이야기 해줍니다.


그리고 그녀석을 어떻게 써야할지 알아보기 위하여 도큐먼트를 한 번 훑어봐야겠죠?

UIGestureRecognizerDelegate위로 option(alt)키를 누른 상태로 커서를 올려봅니다.

그럼 위처럼 말풍선이 뜰텐데요, Reference를 클릭합니다.
 


자, 여기서 보면 델리게이트가 하는 일이 나와있네요.

우리에게 필요한 것은 꾸욱 눌렀을 때 어떻게 해줘야 할지를 정해주는 것이기 때문에 - gestureRecognizerShouldBegin: 을 클릭해서 자세한 내용을 봅시다.


요로코롬 어떤 녀석인지 상세하게 설명이 되어있네요 :)

한 번 쭈욱 읽어보시구요, 델리게이트 메소드 구현을 위해서 저녀석을 쭉 긁어서 복사해옵니다.

어디로? 구현파일로요 ㅋㅋ


참, 우리는 액션시트도 쓰려고 하니까 일단 우선 헤더파일에 액션시트 델리게이트를 하겠다고 이야기 해주구요,


아까 복사해둔 메소드를 이용해서 이렇게 구현해줍니다. 

그리고 실행!!!



 

짜잔~ 
잘 되시나요?
참 쉬죠잉~?

ㅋㅋ 여기에서는 Long Press Gesture Recognizer만 실습해 보았는데요,

다른 Gesture Recognizer들도 사용법은 비슷비슷 합니다.

다른 녀석으로 한 번 구현해 보세요.

참, 종류가 달라도 다들 UIGestureRecognizerDelegate 프로토콜을 따르게 됩니다.

즉, 위에서 본 델리게이트 메소드들을 적절히 잘 활용하면 여러 제스쳐를 한 번에 받고 처리할 수 있다는 이야기가 되겠지요?ㅎ

한 번 무슨말인지 고민해 보세요 :)

오랜만의 포스팅이었습니다.

많이 부족하고 허접한 블로그인데 이렇게 찾아주셔서 정말 고맙습니다 ^^

또 새로운 주제가 생기면 포스팅 하겠습니다.

그럼 다음에 뵈어요 :)

by yagom

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

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. east0822 2013.06.10 17:29  댓글주소  수정/삭제  댓글쓰기

    돌아 오셨네요!! 앞으로도 좋은 포스팅 기대하겠습니다.

  3. 모르세 2013.06.15 11:30  댓글주소  수정/삭제  댓글쓰기

    오랜만에 쉬었다 갑니다.

  4. simons9989 2013.06.15 12:55  댓글주소  수정/삭제  댓글쓰기

    포스팅 정말 잘 보고 있습니다~!!!
    yagome님 정말 쌩뚱맞지만 질문하나만 하겠습니다ㅠㅠ

    제가 현재 특정 뷰 컨트롤러에 버튼 4개와 VIEW 하나를 배치하고

    각각의 버튼을 누를 때마다 다른 뷰 컨트롤러를 호출해서 저 VIEW에다가 뿌려주고 싶은데

    뷰 컨트롤러의 view는 잘 가져오는데 거기에 있는 OUTLET의 IBACTION은 하나도 실행되지 않더군요...

    즉, 한 화면에 여러개의 뷰 컨트롤러를 스위칭해서 보여주고 싶은데...

    가능할까요??가능하다면 팁좀 부탁드릴게요ㅠㅠ

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

      한 화면에 여러개의 뷰컨트롤러의 뷰를 스위칭 한다...
      그다지 좋은 방법은 아니지만, 가능하긴 합니다.
      이걸 어떻게 팁을 드려야 할까요;;
      http://blog.yagom.net/135
      참고해 보시고 궁금하신 점 다시 한 번 알려주세요 :)

  5. yagom님 네이버 맥부기 카페에서 강좌 잘 보고있습니다~~^^ 2013.06.15 16:13  댓글주소  수정/삭제  댓글쓰기

    티스토리는 어떻게 가입하는건지;;몰라서
    이렇게 글을 남겨요~~
    야곰님 연재강좌 정말 잘 보고있구요 많이 배우고 있습니다
    사실 너무 초보라서 이해가 잘 가지는 않지만
    따라하다고 연습하면 길이 보이겠죠;;
    궁금한 점이 있어서 네이버 쪽지를 보냈는데
    혹시 시간나시면 한 번 봐주실 수 있을까요?
    궁금 한 것이야 한둘이 아니지만~
    강좌내용중에 궁금한 것이 있어서 여쭤봅니다~~

  6. yagom님 네이버 맥부기 카페에서 강좌 잘 보고있습니다~~^^ 2013.06.15 17:49  댓글주소  수정/삭제  댓글쓰기

    감사합니다~~^^
    이제는 야곰님 블로그에 와서 질문 좀 남길께요~
    바쁘실텐데 ㅠ 죄송합니다

  7. fwith 2013.06.16 20:19  댓글주소  수정/삭제  댓글쓰기

    아이폰 개발하는데에 야곰님 블로그에서 이해되지 않은 부분들을 많이 배워가고 있습니다. 나중에 시간이 되시면 부탁드릴게 하나 있는데 코어데이터에 대해서 포스팅 해주시면 안될까요? 전반적인 기능들을 쉽게 써주시면 정말 도움 될 것 같습니다. 감사합니다.

  8. simons9989 2013.06.17 23:13  댓글주소  수정/삭제  댓글쓰기

    야곰님 다시한번만 질문 드릴게요ㅠㅠ
    음...제가 질문을 잘 못했던거 같은데... 죄송하지만 다시 한번만 질문 드릴게요~!!ㅜㅜ
    ViewController1, ViewController2를 구현한 상태에서
    ViewController3을 만들고 있습니다.
    이 때 ViewController3에 버튼 두개를 배치했고 각각의 버튼을 누를때마다
    ViewController1와 ViewController2를 호출해오고 싶다는 얘기였습니다.
    그런데 이 때 아예 화면 자체가 바뀌는건 아니고 제가 View로 설정한 영역에 ViewController1 또는 2가 호출되는 것입니다.
    즉, 한 화면에 두개의 뷰컨트롤러가 독립적으로 실행되고 있다고 해야하나요??ㅠㅠ
    말 주변이 없어서 설명을 잘 못하겠네요ㅠㅠ
    |------------------------------------|
    | 버튼1, 버튼2 |
    | |
    | |-------------뷰-----------| |
    | | 버튼을 | |
    | | 누르면 | |
    | | viewController1 | |
    | | 또는 | |
    | | viewController2 | |
    | | 호출 | |
    | | | |
    | |---------------------------| |
    | |
    |------------------------------------|
    대충 그림으로 표현하자면 이런 모양인데...허접하네요~_~ㅎㅎ귀엽게 봐주시길...ㅎㅎ
    근데 저게 사실 가능한구조인지도 모르겠지만...
    저게 가능한구조인지 가능하다면 어떻게 구현해야 할지를 질문드리고싶네요~
    귀찮으시겠지만 잘 좀 부탁드립니다 굽신( _ _)
    PS. 아 그리고 네이버로 쪽지 보내려고 하는데 아이디좀 알려주실수 있으세요??제 아이디는 simons9989@naver.com입니당~!

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

      네, 제가 말씀드렸듯이 addSubview를 하시면 됩니다...^^;

      3번컨트롤러에서 1번컨트롤러와 2번컨드롤러 import 해 주시고

      화면에 각 컨트롤러들의 객체를 만들어서 해당 view를 addSubview 해주시면 됩니다.

      막상 해보면 간단한데 말로 설명하기가 참 애매합니다...^^;

      아니면 IB나 스토리보드를 사용하셔도 됩니다..

      방법도 다양하고 어렵지 않은 방법인데...

      간단하게 뷰컨트롤러 3에..

      #import "ViewController1.h"
      #import "ViewController2.h"

      해주시고

      ViewController3의 viewDidLoad에

      ViewController1 *viewCon1 = [[ViewController1 alloc] init];
      ViewController2 *viewCon2 = [[ViewController2 alloc] init];

      [[viewCon1 view] setFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
      [[viewCon2 view] setFrame:CGRectMake(0.0f, 100.0f, 100.0f, 100.0f)];

      [[self view] addSubview:[viewCon1 view]];
      [[self view] addSubview:[viewCon2 view]];

      이렇게 해보셔요.

      참, 그리고 제가 네이버 쪽지는 거의 들어가보지 않아서 블로그에 질문 남겨주시면 되겠습니다..^^

      장마가 시작되었네요, 행복한 일주일 되시길..!

  9. simons9989 2013.06.18 14:47  댓글주소  수정/삭제  댓글쓰기

    우아우아~친절한 답변정말 감사합니당@_@ㅠㅠㅠㅠㅠ

    근데 해보니깐 저렇게 했을 때 viewCon1,viewCon2의 view는 addSubview로 가져와 지는데

    그 view안에 있는 버튼에 IBAction을 설정해놨는데

    단순히 view만 가져와지고 걔네들은 작동이 안되더라구요...

    물론 해당 IBAction은 ViewController1,2에다가 코딩해놓았지요~_~;;ㅎ

    그래서 혹시 이것도 뭔가 제가 작업을 해줘야하나요??ㅠㅠ

    답답하고 궁금합니다ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

    부빌데가 야곰님밖에 없어서 자꾸 귀찮게 질문드려서 죄송합니다 또 감사하구요~!

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

      액션이 잘 연결이 되어있다면 동작해야 정상일텐데요...^^;
      어떤 코드를 넣으셨는데 작동을 안하시는지...
      단순히 로그라도 찍어보세요 ㅎ
      아니면 메모리에서 컨트롤러 객체가 해제되어서 그럴수도 있을 것 같습니다.
      ViewController3에서
      ViewControll1과 ViewController2 를 strong property로 선언해서 해보세요~
      물론 선언만 하면 안되고 viewDidLoad에서
      self.viewCon1 = [[ViewController1 alloc] init];

      해서 진행해보세요 ㅎ

  10. simons9989 2013.06.18 22:11  댓글주소  수정/삭제  댓글쓰기

    악~!!되는군요ㅠㅠ
    제가 뭔가 실수 했나보네요ㅠㅠ
    이 문제로 한 3주 고생한거 같은데...
    정말정말 감사합니닷~!!!
    앞으로 포스팅 잘보고 귀찮게 폭풍질문 하겠슴다!!+_+
    그럼 즐거운 한주되세요~^_^

  11. simons9989 2013.06.19 00:46  댓글주소  수정/삭제  댓글쓰기

    악~!!!야곰님ㅠㅠㅠㅠㅠㅠㅠㅠ
    정말 죄송한데 질문 딱 한개만 더할게요~!!!
    위에 질문했던 내용중에 viewController3에서 viewController1,2를 호출하잖아요~
    이 때 viewController1에 있는 버튼이, viewController3에서 불려졌는지 viewController1에서 불려 졌는지 알 수 있는 방법이 있을까요??
    sender를 이용하면 어찌어찌 가능할 것 같기도 한데..ㅠㅠ
    그리고 viewController1에 원래 버튼 IBAction함수가 있긴 하지만
    viewController3에서 다시 구현할 수는 없을까요?!?!
    알려주세요~!!

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

      음...
      상황에 따라서 여러가지 방법이 있을 것 같습니다만...
      [[[self view] superview] superview] 하면 나오는 값이 다를 것 같습니다.. (확인 안해서봐서 장담 못하겠어요^^; )

      그리고 ViewController3에서 원하는 IBAction 메소드를 구현한 후 (예를 들어 buttonClicked: 라는 메소드)
      ViewController3에서

      [[[self viewCon1] aButton] removeTarget:nil
      action:NULL
      forControlEvents:UIControlEventAllEvents];

      [[[self viewCon1] aButton] addTarget:self action:@selector(buttonClicked: ) forControlEvents:UIControlEventTouchUpInside];

      이런식으로 넣어주시면 되겠습니다... 'ㅁ'

  12. 퐝칭칭 2013.06.26 10:21  댓글주소  수정/삭제  댓글쓰기

    와 야곰님 진짜 오랜만에 글올리셨네요 ㅎ
    12년 이후엔 활동 안하시는줄 알고 ;;ㅋ
    가끔 필요한 내용 있을땐 종종 들어와서 도움받아가곤 했답니다. ㅎ
    감사~ ㅎ

    참 저 지금 하던거 궁금한게 있는데 하나 여쭤볼께요
    페이지슬라이딩 과 스와이프 기능
    (그러니까 음....;; 좌우 슬라이드로 페이지가 슬라이딩되고
    좌측상단에 버튼을 누르면 페이스북처럼 페이지가 밀리면서 메뉴 뷰가 끌려나와지는 모습....^^;;) )

    여기서 메뉴버튼 활성화/비활성화 할떄,, 활성화는 버튼으로만 되고 , 비활성화는 버튼과 우측에서 좌측으로 스와이프 해서 되도록 하려고 하는데 ,

    [_pagingScrollView setScrollEnabled:YES];

    이 메소드를 사용하서 활성비활성을 했거든요. 근데 이게 페이지가 구현되어있는 파일에서만 실행되는거 같은데 ..
    스와이프 또는 버튼으로 비활성을 시켰을떄 ! 그때를 알려주는 메소드가 있나 해서요 ....
    (돌아와서 현재 보고 있는 페이지로 돌아왔다! 그때 실행시켜라.! 할수 있는 메소드)

    글이 좀 길고 정신없어 보여서 죄송하지만 혹시라도 야곰님이라면 아실까 해서 주절주절 도움을 청해봅니다 ^^;;;;;
    즐거운 하루 되세요 ㅎ


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

      안녕하세요!!

      음... 글쎄요^^;

      페이지가 다시 원래대로 돌아올때의 메소드에 넣어주시는게 좋지 않을까요?

      제가 어떤 구조로 어떤 소스로 짜여져 있는지 모르기때문에 정확히 말씀드리기가 어렵지만...

      제스쳐 인식하는 델리게이트 때에 넣어주셔도 될 것 같구요~

      아님 좌측 메뉴가 사라지는 시점에 실행시키면 될 것 같구요...^^

      맞는 답변 드렸는지 모르겠네요ㅠ

    • 퐝칭칭 2013.07.05 11:46  댓글주소  수정/삭제

      어찌어찌 하여 되긴 됐어요 ㅋㅋ

      감사합니다 야곰님 ㅎㅎ 이상한 질문에 답변하신다고 고생하셨겠어요..;;;ㅎㅎ

      그런데 navigationController 에 대한 질문이 하나 더 생겨 버렸어요 ; (죄송)



      일반적으로 navigation 을 호출할때

      [[self navigationController] pushViewController:writeViewCtrl animated:YES];

      이런 식으로 사용하는걸로 알고 있는데

      저기서 self 대신 다른 뷰 컨트롤러를 넣고싶은데 그렇게는 원래 안되는건가요 ?

      self 가 자신의 controller 를 가리킨다고 생각 했는데 ,,,

      자신의 뷰 를 할당하고 실행 해봐도 self 나 super 가 아니라면 안되는거 같아서요.. 조언좀 부탁드리겠습니다 야곰님님 !! ^^

      예)
      현재 위치 - ViewController.m

      ViewController *viewController = [[ViewController alloc] init];
      [[viewController navigationController] pushViewController:testViewController animated:YES];

      *이런 식으로 자신의 뷰를 self 대신 해준건데도 안되네요 ㅜㅜ

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

      ^^ 첫 번째 문제는 잘 해결되셔서 다행입니다.

      지금 하셨던 방법은 예상한대로 되지 않는것이 맞습니다 ^^;

      새로운 인스턴스를 생성하였기 때문에 그것은 내가 아닙니다.

      ViewController *viewController = self;

      이렇게 해야하죠...

      [self navigationController]라 함은 나를 관장하고 있는 네비게이션을 뜻합니다.

      특정 뷰에는 네비게이션이 붙지 않습니다. 그 뷰를 관장하는 뷰 컨트롤러에 네비게이션이 존재하게 되지요.

      말씀하신대로 특정 뷰 컨트롤러 인스턴스의 네비게이션을 호출하려면 [viewCon navigationController]를 호출해서 가져오면 됩니다.

      하지만 위에서는 viewController가 어떤 네비게이션에도 속해있지 않으며, 방금 만들어진 새로운 인스턴스이므로 화면에 나와있지도 않습니다..^^

      잘 이해가 안되시면
      http://blog.yagom.net/20
      http://blog.yagom.net/120
      http://blog.yagom.net/123

      를 참고해 보세요 :)

  13. 2013.06.30 04:58  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  14. Favicon of https://rainybday.tistory.com BlogIcon 넛하우스 2013.07.18 10:02 신고  댓글주소  수정/삭제  댓글쓰기

    정말 많은 도움이 되었습니다. 제스처 구현 방식이 블로그 쥔장마다 조금씩 달랐는데. 야곰님껄 기본으로 하니 쉽게 되었습니다.` ^^

  15. JaneLee 2013.07.18 17:39  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 블로그 보고 많은 도움을 얻고 있습니다.
    저는 완전 초보자로서 몇달째 간단한 프로그램을 하나 만들기 위해서 국내외 사이트와 책자를 뒤지며 고생 중입니다.
    줌 인/아웃이 가능한 약도 그림파일 하나를 넣는 것인데 그게 이렇게 어려울 줄 몰랐습니다.
    벌써 샘플코드나 책을 보고 간단한 앱 몇가지는 성공해 보았는데 아무리 찾아도 줌 인/아웃에 대해 제가 알수 있는 수준으로 설명해 놓은 자료가 없어서 몇달째 고생중이예요. 기본이 없으니 정말 힘듭니다.
    다름아니고 주인장님께서 UIGesture에 대해서 너무 알기쉽게 설명을 해 주셨는데요.. 이 글에서 중간에
    "아까 복사해둔 메소드를 이용해 이렇게 구현해 줍니다"라는 부분에 들어가는 코드들이 뭔지 도무지 알 길이 없어서 실행을 해볼 수가 없네요. 이 샘플로 실행을 해보고 핀치 줌도 적용해보려는데 여기서 막혀서 계속 해결방법을 찾으려 노력하다가 정말 어렵게 주인장님께 메시지를 보내게 되었습니다. ㅠㅠ 번거로우실거라 생각해서 답변을 못들을거라고도 생각되지만 너무 다급해서요.

    제가 꼭 알고자 하는 것은요.. 말씀드린대로 약도를 줌 인/아웃 해서 확대해서 보는 앱에는 scrollview를 이용한 줌 구현이 좋은가요, 아니면 핀치제스쳐를 이용하여 이미지뷰에서 줌을 실행하는 것이 좋을까요? 일단 여기서부터 막혔거든요. ㅠㅠ 핀치제스쳐로 하는거 간신히 해외 사이트에서 샘플 찾아서 완성했는데 부드럽게 줌이 안 되고 한 손가락 고정하고 다른 손가락으로 문질러야만 줌이 되는거예요. ㅠㅠ
    그래서 또 폭풍검색을 하니 스크롤뷰에 이미지뷰를 올려서 줌을 하라고 하는 것 같아서요. 어떤 방법이 좋은가요?

    그리고 혹시 간단한 샘플 코드나 저같은 초보가 볼만한 튜터리얼이 없을까요? 진짜 제가 할수 있는 국내외 사이트 안 뒤져본 곳이 없는데요.. 여전히 꽉 막혀있습니다.

    간곡히 조언좀 부탁드릴게요~~ 만일 넘 바쁘시면 이 글 중간에 코드는 어떤게 들어가는건지만이라도(어디를 참고해야 그 코드들을 찾아낼 수 있는지만이라도) 좀 알려주시면 좋겠어요. 읽어주셔서 감사합니다~
    답변 기다리겠습니다.

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

      아... 그게 참... 그게 정말 간단한 거 같아도 꽤 쉽진 않거든요..^^;

      튜토리얼은 없고 오픈소스는 있어요...

      핀치 제스쳐로 사진 줌을 하는 데에는 조금 무리가 있을 것 같습니다 ㅠㅠ

      애플의 공식문서는 여기구요..

      http://goo.gl/041mH

      음... 오픈소스 링크도 걸어드릴게요

      http://goo.gl/FMU0I

      http://goo.gl/9oeJf

      도움이 되었으면 좋겠네요^^;

  16. JaneLee 2013.07.18 17:43  댓글주소  수정/삭제  댓글쓰기

    아참 참고로 저는 스토리보드를 사용하고 있습니다. ^^

  17. JaneLee 2013.07.19 17:23  댓글주소  수정/삭제  댓글쓰기

    답변 감사드립니다. 한번 더 연구해보고 나중에 결과 알려드릴게요~ ^^ 고맙습니다~~~~

  18. 2013.07.23 12:39  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  19. seungjae 2013.08.02 01:48  댓글주소  수정/삭제  댓글쓰기

    저는왜 캔슬버튼이 안눌리는걸까요?ㅋㅋㅋㅋㅋㅋㅋㅋ

    ios6에서 스토리보드없이 하고있는데 말이죠?

    // .m파일에서 코드를 복사했습니다.

    - (BOOL)gestureRecognizerShouldBegin:(UILongPressGestureRecognizer *) gestureRecognizer
    {
    UIActionSheet *actionSheet =[[UIActionSheet alloc]
    initWithTitle:@"Select Curation Mode"
    delegate:self
    cancelButtonTitle:@"Cancel"
    destructiveButtonTitle:@"Curation Mode 2"
    otherButtonTitles:@"Curation Mode 3", @"Curati,,", nil];
    [actionSheet showInView:self.view];
    return YES;
    }




    - (void) actionSheet:(UIActionSheet*)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
    {
    NSString *menuString = [actionSheet buttonTitleAtIndex:buttonIndex];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert"
    message:[NSString stringWithFormat:@"%@ is selected", menuString]
    delegate:nil
    cancelButtonTitle:@"Why..?"
    otherButtonTitles:nil];
    [alert show];
    }

  20. seungjae 2013.08.06 03:45  댓글주소  수정/삭제  댓글쓰기

    네! 다른버튼은 눌리네요.ㅋㅋㅋ

  21. 리얼왕초보 2013.08.06 21:24  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님 역시나 좋은 강좌 감사합니다~
    덥고 습한데 건강 잘 챙기세용~~
    강좌 복습도 어느덧 끝나가네요
    질문 하나만 드리려구요~ 코드를 다 작성하고 실행후에 처음 제스쳐는 잘 인식을 하는데
    액션시트와 얼럿뷰까지 끝나고 두 번째 제스쳐에는 왜 아무런 반응이 없는지 궁금합니다~

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

      음... 저는 잘 되었었는데, 무슨 문제일까요?ㅠㅠ
      제가 바로 위에 단 덧글처럼 showInView의 인자를 바꿔보시겠어요?

    • 리얼왕초보 2013.08.09 01:04  댓글주소  수정/삭제

      인자를 바꿔봤는데 현상은 똑같네요 ㅠ
      제가 당장은 해결하기 불가능한 수준같네용 ㅠㅠ
      더 공부해서 해결해 보겟습니다~
      항상 정성껏 답변 해주셔서~너무나 감사드립니다`~

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

      메일 보내드렸어요 :)

    • 하이앟 2013.09.29 21:18  댓글주소  수정/삭제

      저또한 같은 문제를 겪었습니다
      (BOOL)gestureRecognizerShouldBegin대신
      그냥 IBAction으로

      - (IBAction)showInfo:(UILongPressGestureRecognizer *)gestureRecognizer
      { if([gestureRecognizer state]==UIGestureRecognizerStateBegan) {
      /////////반응 내용} }

      하니까 해결되더라구요..혹시나 도움이 될까 해서 주제넘지만 올려봅니다~


오늘의 주제

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



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

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

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

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

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

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

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


# 계산기 기능 완성하기

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

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

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

을 참고해 주세요 ㅎㅎㅎ


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

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


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


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


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


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


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

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


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


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



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

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

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

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

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



# 메모장 화면구성 변경

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


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

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

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



by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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






Posted by yagom

댓글을 달아 주세요

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      안녕하세요 :)

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

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

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

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

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

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

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

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

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

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

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


오늘의 주제

1. 실전 프로젝트 생성



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

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

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

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

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

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

iOS5.1 Xcode 4.3.3 기준입니다.

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


한 번 출발해 봅니다 ㅎㅎ

# 프로젝트 생성

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


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



# 화면구성하기

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


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

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


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


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


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

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


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


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



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


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



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

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


자, 이렇게 106번까지요 ㅎ


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

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



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

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

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

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



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

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

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

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

신나지 않나요?

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

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



by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

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

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

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

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

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

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

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

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

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

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

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

    비밀댓글입니다


오늘의 주제

1. 예외처리

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

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

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

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

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

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

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

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


# @try @catch @finally

예외처리가 뭔가요???

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

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

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

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

한 번 해봅시당 ㅎㅎ

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

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

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

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

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



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

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

그럼 이만 뿅 ㅎㅎ



by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

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

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

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

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

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

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

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

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

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

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

      이런 구문을

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

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

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

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

      이것을


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

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

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

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

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

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

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

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

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

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


오늘의 주제

1. Singleton 패턴 사용해 보기


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

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

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

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

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

한 달 캠프 으쌰~

자 잡소리 때려치고~

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


# 싱글톤 객체 활용

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

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


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


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


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



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



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

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

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



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


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


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


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


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


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

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


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



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

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

재미있는녀석이죠?ㅎ 

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

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

자, 그럼 이만 뿅~!


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

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

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

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

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

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

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

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

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

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

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

    병특이셨군요 ㅋㅋㅋ

    반갑습니다 동지 ㅋㅋ

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

    질문. 1.

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

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

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

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

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

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

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

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

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

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

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

    비밀댓글입니다

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

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

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

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

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

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

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

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

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

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

    이번 강좌에서

    [singletonObj setCurrentString:inputTextField.text]

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

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

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


오늘의 주제

1. Singleton Pattern 


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

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

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


# 싱글톤 패턴이란?

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

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

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

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

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

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

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

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

# 실습

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

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

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


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



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




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


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

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

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


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

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


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


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

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

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



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

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

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

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

컴퓨터 폭발 안합니다~ 


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





by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

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

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

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

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

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

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

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

    야곱님 사랑해요


오늘의 주제

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


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

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

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

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

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


# 파일 입출력

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

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


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


이름은 YGFileManagement


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


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

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

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

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

눌러보세용 ㅎㅎㅎ

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

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

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

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


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

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

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

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

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



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


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


하지만 저장하고,


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


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


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


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

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


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

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

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

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

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

뭐 여튼 오늘은 여기까지~


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

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

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

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

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

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

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

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

      해 주시고

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

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

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

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

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

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

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

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

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

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

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

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

    추천 꾹~!

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

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

    /string.plist

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

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

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

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

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

      stringByAppendingPathComponent:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


오늘의 주제

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


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

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

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

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

자 그럼 출발해 볼까요?ㅎ


# Navigation Bar Customize

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

Single View Application이구요~


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


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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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


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



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


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



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


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

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

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

UINavigationBar 클래스 문서를 봅니다.

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

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


따라가 봅니다.

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

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

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


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

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

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

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

를 참고하시면 됩니다~

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

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

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


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



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

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


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


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


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


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

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

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


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


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


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



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

어떠셨어요?

유용할 것 같지 않나요?ㅎ

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

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

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

저는 이만 물러갑니다~

또봐용 ㅎㅎ


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

      [naviCon setNavigationBarHidden:YES animated:YES];

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      http://goo.gl/czcsej

      참고하여 보시기 바랍니다

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

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


오늘의 주제

1. UIAlertView Customize


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

정말 오랜만의 포스팅입니다~!

그동안 잘 지내셨나요?ㅎ
정말 무더위가 장난이 아니네용...
동남아 날씨 +_+

지난 번 공지로 iOS6와 스토리보드로 출발해 보겠다고 말씀드렸는데, 아직 제가 준비가 되지 못한 관계로 오늘도 iOS5로, 스토리보드 없이 진행합니다!

자, 그럼 다시 힘찬 출발을 해 볼까요?ㅎ


# UIAlertView 커스터마이징

전에 
2012/05/11 - [iOS Dev/함께해보기] - iOS개발하기 #29. 경고창 (UIAlertView)
포스팅에서 AlertView에 대해서 해 보았습니다.

이번엔 요 녀석을 커스터마이징 하는 방법을 살짝 이야기 해볼까 합니다.

물론 제가 오늘 소개해 드리는 방법 외에도 더 무궁무진한 방법이 있지만, 오늘은 간단한 선에서 진행 해 봅니다.

물론 여기에도 단순히 커스터마이징에 대한 정보가 아니라 부분 부분 지나쳐온 이야기들이 나올거예요..ㅎㅎㅎ

자, 그럼 새로운 프로젝트를 생성해 봅니다.

프로젝트 이름은 WithYagom이구요, ARC를 사용합니다~ SingleView Application으로 생성하였구요~


자, 프로젝트를 만들어 주고나면 ViewController가 있죠? 요녀석에 AlertView 하나를 만들어 띄워봅니다.


뾰뵹~ 우리가 하던대로 잘 나오죠?ㅎ


이제 커스터마이징을 위해서 우리가 새로운 클래스를 만들건데요, UIAlertView를 상속받는 클래스를 만드는 것입니다.

상속이 뭔가요?ㅋㅋㅋ

분명히 보신분도 보지 않으신 분들도 계실건데요, 이번 기회에 보고 옵시다~

2012/03/28 - [Objective-C] - Objective C <9>. 상속(1)
2012/04/10 - [Objective-C] - Objective C <10>. 상속(2) - 오버라이딩

자, 그리고 조금 이따가 바로 오버라이딩을 해 줄거예요.

일단 클래스를 만들어 봅시다 ㅎㅎ

프로젝트 네비게이션에서 우클릭 또는 control +  클릭 해 주시구요~ 아니면 단축키 command + N 을 눌러주시면 됩니다~


Cocoa Touch - Objective-C class를 선택해 주시고~


CustomAlertView라는 이름으로 UIAlertView를 상속받은 클래스를 만들어 줍니다~!



자, 이렇게 UIAlertView를 상속받은 클래스가 생겼습니다.

이렇게 상속받은 클래스는 부모클래스인 UIAlertView의 메소드와 property를 모두 사용 할 수 있습니다.

게다가 오버라이딩을 한다던지, 우리가 새로 뭔가를 추가해 줄 수 있는 녀석이 되는거죠.


자, 우리가 원래 UIAlertView를 화면에 보여줄 때 사용한 메소드가 뭐였죠?

네! show!!!!!!!!!!

이녀석을 우리 입맛에 맞춰서 오버라이딩 해 줄거예요 ㅎㅎ

일단 [super show] 라는 곳에 주석을 안달았는데, super는 이 클래스의 부모클래스를 뜻합니다.

즉, [super show]는 부모클래스에서 show를 호출 해 주는 거예요. 우리가 show안에서 무슨 일을 처리하는지 모르니까 일단 불러줍니다.

그리고 그 후에 우리가 원하는 대로 입맛에 맞게 후보정을 해 줍니다 ㅎㅎㅎ

show 메소드를 오버라이딩 해 주는 것입니다. 

참, 그리고 소스에 보듯이 이미지들이 프로젝트에 들어와 있어야 합니다.

캡쳐한 것 보면 어느새 제가 이미지들을 낑궈 넣어논 것을 볼 수 있을거예요 ㅎㅎㅎ 


자, 그리고 이제 다시 ViewController로 돌아와서 우리가 만든 새로운 클래스의 인스턴스를 만들어주고 show를 호출해 봅니다.
참! 위에 헤더 import한 것을 네모박스 안했는데, 꼭 해주세요 ㅎㅎ 


두구두구두구둥!!!
우왘ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

요상하긴 하지만 어쨌든 바뀌었습니다 ㅋㅋㅋ

이미지는 새로 만들기 귀찮은 관계로, 그냥 있는 것 쓰는 걸로? ㅋㅋㅋ 물론 여러분들은 이쁜 이미지를 만들어서 넣어보세요 ㅎㅎ


자, 이렇게 오버라이딩을 통해 우리 입맛에 맞게 커스터마이징을 손쉽게 할 수 있습니다~!

그런데 저렇게 딱딱 고정해놓고 쓰기에는 뭔가 좀 아쉽죠?ㅎ

그래서 뭔가 다음에 쓰기 더 용이하도록 메소드를 이쁘게 만들어 줘 봅시다.

CustomAlertView.m으로 돌아와서 오버라이딩 했던 show가 아닌 우리가 필요한 녀석들을 인자로 받을 수 있도록 메소드를 조금 수정해 봅니다~ 


그리고 원래 없던 메소드를 우리가 추가했고, 다른 곳에서 호출해 주고 싶다면 헤더에 매소드의 원형을 꼭 써주셔야 합니다.

이렇게요~~~~~~~~ 꼭이요~~~~~~~~ 


그리고 나서 ViewController.m 으로 다시 돌아와서 요렇게 호출을 해 주면!!!!!!!!


똻!!!!!!!! 똑같이 동작합니다. 하지만 다음 번에 다른 이미지를 넣어주고 싶을때는 용이하게 이미지를 바꿔줄 수 있겠죠?ㅎㅎ


자, 처음에 우리는 오버라이딩을 통하여 직접 메소드를 건드려 줬구요,

두 번째로는 새로 메소드를 생성해 주어서 [super show]라는 메소드를 호출하여 show라는 메소드를 호출한 것과 동일한 결과를 만들어 냈고, 그 다음에 우리 입맛에 맞도록 커스터마이징 한 것입니다.

좀 헷갈리시나요?ㅎㅎ

여튼 차분히 잘 생각을 해 보시길 바랄게요.


이렇게 상속을 통하여 메소드를 오버라이드 하거나 원하는 메소드를 추가하여 전혀 다른 모습으로 커스터마이징을 할 수 있습니다.

물론 UIAlertView 뿐만 아니라 다른 클래스도 마찬가지겠지요?ㅎㅎㅎ

더 많은 기법과 더 많은 자료들은 구글님께 물어보시면 많을거예요 ㅎㅎ

사실 제가 커스터마이징보다 더 하고 싶었던 말이 오버라이딩이 아닌가 싶기도 하네요~

다음에도 유용한 녀석 하나 데려와 볼게요~

커밍 쑨~!

by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

  1. 컴맹 2012.09.15 04:15  댓글주소  수정/삭제  댓글쓰기

    상속받은 클래스에 새로운 메소드를 추가하여, 사용하는 방법이 정말 유용하죠.ㅎㅎ
    오늘도 잘 배우고 갑니다.~~^^

  2. 으아아아 2015.06.27 19:00  댓글주소  수정/삭제  댓글쓰기

    저는 안되네요.. 에러고 뭐고 그냥 원래의 alertview 대로 뜹니당 ㅠㅠ 뭘잘못했을까요


오늘의 주제

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



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

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

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

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

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

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

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

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

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

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

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


# 실습해보기

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


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


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


Objective-C class를 선택하고 Next


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


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


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

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


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


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


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


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


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


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


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


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


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


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


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


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


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

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

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


# iOS Application Life Cycle

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

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


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

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

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

ㅎㅎ

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

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

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

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

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

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

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

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


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

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

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

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

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

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

너무나 당연하게 

viewDidLoad
viewWillAppear:
viewDidAppear:
viewWillDisappear:
viewDidDisappear:
viewDidUnload

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

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

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

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

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

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


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

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

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

그럼 이만...~!

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


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    좋은 강좌 잘 보고 있습니다

    감사합니다~~!!!

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

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

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

      고맙습니다..^^;

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

      종종 들러주세요 :)

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

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

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

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

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

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

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

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

      yagomsoft@gmail.com

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

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

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

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

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

      종종 들러주세요 :)


오늘의 주제

1. XML 파싱결과 테이블에 보여주기


마흔 두 번째 시간이자 XMLParsing 마지막 시간입니다.ㅎㅎ

지난 번까지 진행했던 내용들은 잘 되셨는지요?

이번에는 이제 XMLParsing을 마무리 해보려고 합니다.

자, 긴말 필요없이 떠나 봅시다 ㅎ


# NSNotification

지난 번에 '인절미후후' 님께서 블럭코딩 중에 데이터를 다른 메소드로 전달 하는 방법이 떠오르지 않아서 어려웠다고 말씀하셨는데요,

우리는 이미 배웠습니다..ㅎㅎ

객체간 데이터 전달에 관한 내용들 말예요~^^
2012/05/24 - [iOS Dev/함께해보기] - iOS개발하기 #33. Protocol, Delegate (프로토콜, 델리게이트)
2012/05/26 - [iOS Dev/함께해보기] - iOS개발하기 #34. NSNotificationCenter (노티피케이션센터)

우리는 그래서 이번에 노티피케이션을 이용해 볼까 합니다.

이 계기를 통해서 노티피케이션에 대해 조금 더 이해할 수 있으리라 생각해 봅니다. ㅎ

일단 우리가 가져온 자료들을 저장할 객체들이 있어야 겠지요?ㅎ

만들어 줍시다.


그리고 우리는 노티피케이션을 활용해 보기로 했으니 노티피케이션센터에 노티피케이션을 받겠다고 등록해 줍니다.
등록을 했으면 나중에 없애주는 것도 잊지 말아야겠죠?ㅎ

 
자, 그리고 이제 노티피케이션을 쏠 때 전달할 데이터 저장소를 만들어 줘야겠죠? 바로 딕셔너리를 사용합니다 ㅎ 
저장소를 만들고 노티피케이션을 숑숑숑 쏴줍니다 ㅎㅎ 


자, 그럼 이제 실질적으로 노티피케이션을 받았을 때 실행이 되어야 할 메소드들이 필요하겠죠?
만들어 줍니다~ㅎㅎ 


그리고 이제 가져온 정보를 바탕으로 테이블뷰에 가져와야겠죠?
위에 노티피케이션을 위해 구현한 메소드에서 테이블뷰의 데이터를 reload하고 있죠?
그렇게 하면 reload 할 때 마다 테이블뷰 데이터소스 메소드들을 다시 호출하게 됩니다.
데이터소스에서 테이블에 뿌려주기 위하여 코드를 또 작성합니다~



그리고 실행하면!!?

짜잔~!


네 얼럿도 정상적으로 뜨구요~
날씨정보도 가져오네요 ㅎㅎ 



자, 이미지뷰를 남겨놓은 이유는, 여러분께서 직접 날씨에 맞는 이미지를 넣어보라는 의미에서 하지 않았습니다.

제가 날씨 이미지 만드기 귀찮아서 그런거 아녜요... 네 그런거 아닙니다 ㅋㅋㅋ

XML데이터 내려온 것 중에 local  엘리먼트에 속성값 중 icon이라는 녀석이 있는데, 날씨에 따라 이녀석의 속성값이 다르죠?

이녀석을 이용해서 적절한 이미지를 넣는 것을 구상해 보세요 ㅎ

그럼 저는 여기까지~!

부족한 것 있으면 폭풍질문 주세요~^^*

뿅!

by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. Sio 2012.07.24 17:58  댓글주소  수정/삭제  댓글쓰기

    버튼을 누르고 들어갔을 때 화면에 Alert창과 테이블뷰가 데이터를 load하는 시간이 조금 긴것 같습니다.
    좀더 빠르게 바로 나오게 하는 방법이 없을까요????

    이번 강좌도 잘보고 갑니다~!

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

      웹에서 데이터를 불러오고 xml 파싱을 하는 시간이 아무래도 걸리겠죠?ㅎ
      정확하게 어떤 것이 문제가 되는지 알려주세용 +_+ㅋ

    • Sio 2012.07.25 11:48  댓글주소  수정/삭제

      인..터넷의 문제였나 봅니다 ㅡㅡ;;;
      어제는 모달뷰가 뜰때 빈화면만 나왔고 잠시 후에 Alert창과 셀이 채워졌는데
      오늘은 빠릿빠릿하게 나오네요 ㅎㅎㅎ

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

      잘 되신다니 다행입니다 ㅎㅎㅎ

  3. paxdreamer 2012.08.06 00:46  댓글주소  수정/삭제  댓글쓰기

    야곰님..TBXML로 작업하면서 여러가지 많이 알게되어 좋았습니다. 좋은 파서라고 생각합니다.
    근데 몇가지 단점도 있더군요. 인코딩타입이 EUCKR타입은 지원을 안하는군요.. 이것때문에 실력이 딸려서 고생좀 많이 했습니다.ㅎ
    그리고 URL로 전송된 이미지를 어떻게 받아와야 할지 모르겠습니다.
    XML구문에 포함된 아이콘이나 이런것들도 그렇고...아예 이미지 자체만 전송된다고 했을때 어떻게 구문을 짜야 하나요??
    도무지 모르겠습니다.
    예를들어 창 전체에 이미지를 띄우고 버튼이든 아니면 화면터치든 하여 이미지를 받아서 재생처리한다고 했을때 어떻게 해야하나요??
    모르는것이 너무 많아 개고생중입니다..ㅜㅜ

    그리고 추가 교육요청드려도 될까요??
    예를들어 어플을 구동했을때 얼럿창을 띄우려고 합니다. 근데 그 얼럿창을 커스터마이징하여 이미지를 입히고 XML로 파싱된 데이터를 넣거나.. 아니면 그런식으로 만들어진 얼럿창을 컨트롤하는... 그런 것들에 대해서 알고 싶습니다.
    책을 보거나 구글링 통해서 작업하고 있는데 제가 허접해서 제대로 구현을 못하고 있네요...

    부탁드려도 될까요??

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

      안녕하세요 야곰입니다 :-)
      덧글만 봐도 고생중이신 모습이 훤합니다...+_+ㅎ

      XML로 내려오는 이미지 URL을 가지고 추가적으로 HttpRequest 를 하여 이미지 데이터를 받아와야 합니다. 구글링을 해 보시면 많은 예제 찾아보실 수 있으실 거예요~
      이에 대해서는 추후 진행할 요량이었으나 요즘 제가 정신이 없어서 포스팅을 못하고 있습니다. 열흘 내로 재개할 예정입니다. 조금만 기다려 주세요..^^

      XML자체적으로 이미지 데이터는 아마도 전송하지 않을 것으로 사료됩니다.
      만약 XML로 이미지 데이터 자체가 내려온다고 하면 [UIImage imageWithData:]메소드를 사용하여 이미지 객체로 변환하여 주시면 됩니다.

      얼럿뷰 커스터 마이징은 상당히 번잡하고 애매한 작업입니다.
      http://blog.naver.com/PostView.nhn?blogId=yesusok&logNo=50102307516
      이 포스팅에 잘 나와있네요.
      그나저나 커스터마이징을 하기 보다는 따로 뷰 또는 뷰 컨트롤러로 만들어 주시는 것도 나쁘지 않은 방법입니다. ^^

      지금 이 덧글로써 도움이 될지는 모르겠지만 제가 지금 바로 포스팅을 해 드릴 수가 없어서 죄송스럽네요 ㅠㅠ

      혹시 더 추가적으로 궁금하신 사항이 있으시면 덧글 주세요. 포스팅은 못해도 덧글은 열심히 달고 있으니까요...^^;

  4. paxdreamer 2012.08.06 14:57  댓글주소  수정/삭제  댓글쓰기

    아주그냥 삽질 중입니다.ㅜㅜ
    원래 iOS개발하던것도 아니고 다른쪽 하다가 넘어온지 4개월짼데 지금 만지고 있는 구조거 많이 복잡해서요...
    게다가 모든 기능에 대해 100% 커스터마이징된 ui/ux구조라 아 힘듭니다.

    이렇게 가르침 주시는 것만도 감사하게 생각합니다.

    그리고 디비구성관련해서도 datamodel을 어떻게 사용을 해야할지도 잘 모르겠습니다.ㅜㅜ

    sql사용해서 기본적으로 적용은 했는데 이건뭐....제대로 아는게 없으니..나름 열심히 공부하고 시작한건데 구문조차 어떻게 짜야하는지 조차 헷갈려 완전 삽질 중입니다.ㅎㅎㅎㅎ

    댓글조차도 중구난방이네요 이해 부탁드립니다.

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

      안녕하세요~
      paxdreamer 님~!
      정말 100% 커스터마이징 해달라고하면 짜증이 솟구쳐 오르죠...ㅎㅎㅎ
      다들 커스터마이징 하면 할 수록... 앱은 절름발이가 되어간다는 것을 깨닫지 못합니다...ㅠㅠ

      여튼 질문의 요지는 데이터베이스 모델을 어떤 것을 써야 할지 말씀하신건가요?

      iOS에서는 대부분 SQLite를 사용하여 데이터베이스 모델을 구성합니다.
      딱히 어떤 부분을 말씀하시는건지 잘 모르겠네요 ㅠ_ㅠ

  5. paxdreamer 2012.08.06 17:52  댓글주소  수정/삭제  댓글쓰기

    아..메모리관리법이 난감하네요. xml문서가 2중 3중 구조인데 계속해서 노티피케이션을 호출하고 딕셔너리를 만드는 루프를 탑니다. 흠....

    아 전체를 다 뜯어고쳐야 하나 굉장히 고민됩니다. 도움이 될만한 팁좀 주실수 있을까요?

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

      네... 음...
      사실 XML 파싱은 iOS에서 귀찮고 성가신 일 중 하나죠.
      JSON이면 정말 손쉽게 사용할 수 있는데 XML은 저도 별로 좋아하지 않아요 ㅠ_ㅠ

      에지간한 이미지 사용이 아니라면 메모리 터질 정도로 사용하진 않을거예요 ㅎㅎ
      메모리 보다는 속도를 좀 더 걱정하셔야 할 듯합니다~
      속도향상과 메모리를 조금 덜 쓰는 쪽으로 말씀을 드려보자면,

      저 블럭을 따로 밖으로 빼지 않고 어떤 메소드 안쪽에서 실행을 하면 그 메소드 안에서 선언한 변수...
      예를 들어 NSMutableDictionary 또는 NSMutableArray 를 선언했다고 치면
      그 녀석 앞에 __block 이라는 키워드를 붙여주시면 블럭 안에서 사용할 수 있게 됩니다.
      http://fericia.tistory.com/4
      이 포스팅을 한 번 참고해 보셔도 좋을 것 같구요...
      그럼 최소한 노티피케이션을 타고 다른 메소드로 찾아가는 시간 정도는 벌 수 있을 듯 합니다.
      그리고 딕셔너리로 만들지 않고 TBXMLElement를 NSMutableArray 등에 통채로 복사해 넣고 사용하셔도 될 듯 합니다.

      도움이 되었으면 좋겠네요 ^^*

  6. paxdreamer 2012.08.07 16:41  댓글주소  수정/삭제  댓글쓰기

    아 난관의 연속이군요.....
    xml로컬파일도 파싱해야 하는데 경로 설정을 어떻게 해줘야 하는건가요???
    야곰님이 가르쳐주신 것과 같은 블럭코딩으로 파싱루틴을 구현했는데 parseXML 부분에서 파일 경로를 어떻게 해줘야 할지 모르겠습니다.ㅜㅜ
    그리고 파싱블럭으로 어떻게 넘겨줘야 하나요??
    tbxml파일을 살펴보고 있는데 도통.ㅜㅜ

    아 미치겠어요 여기저기서 마구 쏟아지는군요..ㅜㅜ

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

      ^^*
      파일 경로는 어디냐에 따라서 구하는 방법이 좀 다릅니다.
      http://stackoverflow.com/questions/6387915/how-to-get-file-path-in-iphone-app
      여기를 참고하시면 도움이 될 것 같아요~
      다른 부분의 질문들은 무슨 말씀인지 잘 이해가 안가네요 ㅠ_ㅠ

  7. paxdreamer 2012.08.08 11:32  댓글주소  수정/삭제  댓글쓰기

    질문과 TBXML을 적용하면서 경험한것을 공유하고자 또 댓글 남깁니다.
    XML구조에 같은 뎁스 내에 엘리먼트명이 다른 엘리먼트가 있다면 널로 받아오더군요.
    그래서 빌드를 하면 셀을 만드는 중에 셀오브젝트에 nil이 들어갈수 없다며 SIGABRT가 나구요. 코드 구문상에 에러는 아니고 데이터도 잘 들어옵니다. 그래서 싸이트 들어가서 API를 봤는데 관련한 경우 어떤식으로 처리하라는 방법이 없더군요..흠..제가 못찾은건지...
    할수없이 예외처리를 따로 해줘야 했습니다.
    XML구조상 같은 뎁스라도 엘리먼트 명이 바뀌는 경우 문자열을 비교하는 코드를 블럭 내에 넣어줘야 NULL이 들어가지 않은 제대로된 데이터를 로드 합니다. 사용하실 분들은 참고 하셨으면 합니다.ㅎ

    그리고 야곰님, 이제부터 질문 입니다.ㅎㅎㅎ
    정상적으로 로드된 데이터를 노티피케이션을 통해 헤더에 선언한 딕셔너리로 전달하는, 야곰님께서 알려주신 방법으로 작업했습니다. 문제가 데이터를 테이블에 셀형태로 로드할때 마지막 데이터만 셀에 뿌려집니다.
    데이터가 딕셔너리에 적재되야 하는데 적재되지 않고 계속 덮어 씌우는 형태입니다.
    아마도 블럭내에서 데이터를 읽어올때마다 노티를 송출하는 구조라 노티를 받는 매서드에서 생성한 딕셔너리에서도 노티를 받을때마다 데이터를 추가하는게 아니라 덮어씌우는 형태가 된것 같습니다.

    제가 딕셔너리의 정확한 사용법을 몰라서 그런건지 몰라도 구조적으론 다를게 없는데 왜 덮어 씌우는 형태가 됐는지 모르겠네요..

    참 테이블 하나 구현하는게 이렇게 어려운지 몰랐네요..

    조언 부탁드립니다.

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

      네, 테이블이 iOS UI 중에 사용하기 어려운 녀석중에 하나지요. 저도 아직도 테이블 어렵습니다...ㅎㅎㅎ

      질문에서 노티피케이션을 통해 헤더에 선언한 딕셔너리로 전달한다고 하셨는데, 저는 배열에 추가작업을 해 준 것이구요~ 헤더에 선언된 딕셔너리에 직접 포인터를 연결해 준 것이 아닙니다.

      헤더에 있는 딕셔너리 안에는 처음에 Root Element를 받았을 때 만들어 주고 그 안에 item array와 날씨 정보를 세팅해 준 것이지요.

      당연히 item을 받을 때 마다 저 딕셔너리를 덮어씌우게 되면 결과가 다르게 나오겠지요~

      XML구조가 다르기 때문에 제가 잘 모르겠지만 아마도 이런 이유이지 싶습니다.
      만약에 XML에서 item 을 받을 때 마다 저 작업을 해 주셨다면 100%죠.

      itemArray = [[NSMutableArray alloc]....

      weatherDic = [[NSMutableDictionary alloc].....
      부분을
      if ( itemArray == nil && weatherDic == nil )
      {
      itemArray = [[NSMutableArray alloc]....
      weatherDic = [[NSMutableDictionary alloc].....
      }
      으로 변경하시면 덮어쓰여지는 일이 없겠습니다. 새로 객체를 생성하는 것은 한 번이면 충분하니까요.
      그리고 계속 받는 item들은 itemArray에 추가해 주시면 되겠습니다.

  8. paxdreamer 2012.08.08 20:29  댓글주소  수정/삭제  댓글쓰기

    아 맨붕상태라 좀만 생각해보면 알것을....일일이 물어봤네요..ㅜㅜ

    질문 올리고 수정하다가 코드 삽입 해서 첫번째 뷰에는 뿌렸습니다.

    근데 아무래도 데이터 저장구조를 다시 만들어야 할듯 하네요..

    기존에 만든 구조는 xml문서에서 뎁스별로 딕셔너리를 분리해서 저장하는 구조입니다. 크게 데이턱 들어있는 뎁스는 2중구조 입니다.

    근데 아무래도 합쳐서 저장해야 할듯 하네요.

    데이터를 테이블에 뿌리는 구조가 첫번째 테이블에서 상위 텍스트를 뿌리고 셀을 선택했을때 하위 뎁스를 뿌려야 하는데 첫번째 제가 만든 방식으로 하면 상위테이블과 하위 테이블리스트를 연결할 방법이 없네요..제대로 삽질한것 같습니다..ㅜㅜ

    아무래도 블럭에서 하나의 딕셔너리로 송출해서 엘리먼트 명을 비교해서 상위테이블에 첫번째 뎁스의 텍스트를 뿌리고 셀을 선택했을때 하위 텍스트를 뿌리는 구조로 수정해야 할듯 하군요..ㅜㅜ

    참 제대로 삽질하고 있습니다.

    고민인건 어떤식으로 루트테이블과 디테일테이블을 연결할 것인가 입니다. 상위테이블에서 셀을 클릭하면 하위테이블의 타이틀에 들어가고 xml의 하위 텍스트가 들어가야 하고 하위 테이블에서 클릭했을때 또 컨트롤을 연결해야 하는데...ㅜㅜ

    구조 자체를 어떤식으로 설계해야 할지...회사내에 물어볼 사람이 애매해서 자꾸 괴롭힙니다. 죄송해요.ㅜㅜ

  9. paxdreamer 2012.08.08 20:31  댓글주소  수정/삭제  댓글쓰기

    정말 문제는 이런식으로 적용해야할 부분이 14군데라..현재 데이터파싱모듈은 전부 적용해 놓은 상태라....ㅜㅜ
    아 이상태에서 어떻게 해야할까요...?
    게다가 이미지 아이컨도 적용해야 하는데. iOS로는 어떻게 하는지도 몰라요.ㅎㅎㅎㅎ
    사실 예전에 어떻게 했었는지도 기억도 안납니다. 아 허접개발자 뽀록나네요.ㅜㅜ

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

      음...
      그래서 처음 구조 설계가 중요하죠...ㅎㅎ
      배열을 두개 쓰셔야 할 것 같습니다.
      하나는 상위 데이터를 저장하는 배열이구요.
      하나는 하위 데이터를 저장하는 배열인데요.
      상위 데이터를 저장하는 배열은 데이터를 담고 있는 딕셔너리들을 담는 배열이구요,
      하위 데이터를 저장하는 배열은 배열 안에 딕셔너리들을 담고있는 배열이 또 들어가는 형태로 구성하시면 될 것 같습니다.
      말로 하니까 참 애매한데 도움이 되면 좋겠습니다^^;

  10. paxdreamer 2012.08.13 13:43  댓글주소  수정/삭제  댓글쓰기

    지난번에 xml을 통한 이미지 데이터 처리 대하여 다시 물어보려고 합니다.
    xml형태가
    <path>http://img.xxxxxx.com/maple/201206150001.png</path>
    이런 형태 입니다. 이걸
    pathStr = [pathInfo objectForKey:@"path"];
    //스트링으로 받은 URL에서 데이터를 받자
    NSURL *cherryImageURL = [NSURL URLWithString:pathStr];
    UIImage *cherryImg = [[UIImage imageWithData:[NSData dataWithContentsOfURL:cherryImageURL]] retain];
    cherryImage = cherryImg;
    이런 형태로 처리했고 cherryImage는 클래스 내에서 처리하기 위해 선언한 녀석입니다.
    여기서 받은 이미지를 버튼을 클릭했을씨 뷰어에 보이는 루틴을 만들려고 합니다.
    detailViewController로 cherryImage를 넘겨 처리하는 루틴을 만들고 있습니다.
    구문은 다음과 같습니다.
    UIImageView *cherryImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:cherry.cherryImage]];

    cherry는 상위 클래서를 처리하기 위해 선언한 것이고. cherryImage가 위 코드에서 사용된 놈인데.. 문제가 UIImageView로 선언된 cherryImageView에 저렇게 연결하니 NSString을 UIImage로 연결하지 못한다는 경고가 나오네요.. 에러죠.
    cherryImage는 UIImage로 선언되어 있고....상위클래스 포인터인 cherry는 상위 클래스가 커스터마이징된 TableViewController를 상속하고 있습니다.

    상위 클래스에서 정상적으로 cherryImage에 데이터가 들어가는 것을 확인 했구요.
    상위 클래스가 tableViewController를 상속하기 때문에 저런 경고가 나오는 건지.. 좀 애매 합니다.

    결론적으론...xml로 넘어온 이미지 경로를 처리하여 이미지를 저장하고 그걸 뷰로 연결해야 하는데..
    저런 방식 말고 다른 방법은 어떤식으로 해야 할까요?? 우선 포인터에 데이터가 들어가는것은 확인이 되고 구문상 문제도 없는데 뷰를 만드는 과정에서 경고가 나오니 알수가 없네요.
    UIImageView *cherryImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:cherry.cherryImage]];
    이 구문에서 뒷부분이 문제가 있는것은 알겠는데 상위 클래스에서 받은 데이터를.. 어떤식으로 구문을 짜야하는지 난감합니다.

    구글신을 통해 몇가지 루틴 적용해 봤지만 같은 경고메세지가 뜹니다.
    야곰님께서 답을 주세요.ㅠㅠ

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

      안녕하세요 paxdreamer님~!
      문서를 조금 더 읽어보셨으면 힘들지 않게 하셨을 수도 있겠는데요^^;
      imageNamed 메소드는 값을 받는 인자값이 NSString * 입니다. 그러니 당연히 경고가 나고 제대로 동작하지 않겠죠~
      imageNamed 메소드는 번들에 속해있는 이미지 파일 중에 같은 이름을 찾아와서 이미지로 전환해주는 메소드 입니다.
      제 생각에는
      UIImageView *cherryImageView = [[UIImageView alloc] initWithImage:cherry.cherryImage];
      로 변경하시면 무리없이 동작할 것 같습니다~!

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

    강의 볼때는 다 이해가 가지만..문제는 역시나 활용 & 적용이죠 ㅠㅠ

    강의 감사합니다..

  12. 꾸앵 2012.11.13 18:44  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님

    야곰님 덕분에 탭바에 네비게이션올리고 테이블 컨트롤러까지 올려서 잘 해나가고 있습니다
    헌데 테이블뷰에서 editrow를 하는데 다른행은 edit 버튼을 누르면 edit 화면으로 가는데 첫 행이 edit가 되지 않네요...

    왜이럴까요 ㅠㅠ
    일단 이걸 해놓고...
    셀 다중선택 삭제를 활용할 예정인데 또 막히네요 ㅎㅎ;;; ㅠㅠ

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

      흠... 글쎄요 +_+

      [tableView beginUpdates];
      원하는 작업 코드...
      [tableView endUpdates];

      이런식으로 한 번 해보시는건 어떨까요?

      다중선택을 하시려면 테이블뷰 델리게이트를 활요하시면 될거 같습니다 :)

  13. Karl 2012.12.18 18:18  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님!!
    매번 좋은 내용 듣는것도 죄송한데 질문 하나만 드리겠습니다... ^^;;

    제가 테이블 뷰에 값을 좀 세팅하고나서 다시 클리어? 초기화? 시키려고 하는데
    대체 어떻게 해야 할까요? ㅜㅜ

    검색을 좀 해본결과 값 지정해놓은걸 다 지우고
    [tableView reloadData]; <- 이걸쓰라는데 이걸 써도 초기화가 잘 안되던데 어떻게 해야 할까요? ㅜㅜ

    • Karl 2012.12.18 22:42  댓글주소  수정/삭제

      ㅎㅎㅎㅎ 아 이저에 야곰님이 올리신 글보고 해결했습니다..
      제가 너무 경솔하게 건너뛰기를 해버렸네요
      올려주신 아티클들 덕분에 생소한 iOS 쉽게 적응하고 있습니다.
      항상 감사합니다 ㅎㅎㅎ 좋은하루 되세요!!

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

      안녕하세요 Karl님 :)
      질문은 언제든 환영입니다!
      잘 해결되셨다니 다행입니다 ㅎ

  14. 꾸앵 2013.01.17 20:28  댓글주소  수정/삭제  댓글쓰기

    다시 또 질문드려요! ㅎㅎ

    customCell 에 progressBar를 하나 넣었습니다.
    그리고 enum celSubViewTag쪽에 CELL_PROGRESS 라는 태그를 추가하고 XML에서는 따로 받는부분 없이
    셀에 쓰여질 때 0으로 만들어버릴라고 했습니다
    (후에다운로드부분이 구현될거라...)

    그리고 셀 쓰는 부분에
    UIProgressView *progressBar = (UIProgressView *)[cell viewWithTag:CELL_PROGRESS];
    라고 태그를 설정해주고

    [progressBar setProgress:0.01]; 로 초기화하고


    각각의 셀마다 찍히는 부분또한 똑같이
    [progressBar setProgress:0.01]; 로 해줬는데

    xib 에서 설정했던 0.5의 값이 그대로 나옵니다...

    어디서 잘못된걸까요 ....?

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

      꾸엥님, 간만에 뵙습니다 ㅎ

      일단 xib에서 progressBar에 태그값이 맞게 잘 들어가 있는지 확인해 보시구요...

      progressBar가 nil값으로 들어온 것이 아닌지 확인해 보시구요~

      [progressBar isKindOfClass:[UIProgressView class]]의 값이 참인지도 확인해 보셔요. :)

  15. Harold 2013.08.16 19:24  댓글주소  수정/삭제  댓글쓰기

    프로젝트하는데 있어서 유용하게 잘봤습니다...만....

    itemarray인가요? 그놈을 nil로 초기화하면 값이 계속 null이 나옵니다ㅜㅜ alloc init으로 초기화하니 잘되더라구요 ㅎㅎ

  16. mainrichoo 2013.08.26 19:37  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 매번 양질의 강의 감사합니다.
    이번것을 따라하다보니...
    -(void) viewDidUnload 가 Deprecated in iOS 6.0.이던데...이럴때는 어디다 removeObserver를 설정하는게 좋을까요??
    힌트 부탁드립니다...ㅠ

  17. Harold Jinho YI 2013.12.06 13:42  댓글주소  수정/삭제  댓글쓰기

    xml을 파싱하는데요..

    일부의경우 노드(?)가 나오지 않는데요...(예를들면 버스도착예정정보 없는경우... 차량대기중으로 인해..)

    이런경우 @try도 안먹히는데... 방법이 없나요??? :(

    • Harold Jinho Yi 2013.12.07 09:59  댓글주소  수정/삭제

      자답이네요...

      http://cafe.naver.com/mcbugi/282437 요기보고 힌트를 얻었다는... :)

      String을 추출하기전에 객체가 nil인지 체크를하니 단번에 해결되더군요!!

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

      네, nil 확인은 꼭 해주세요 ㅎㅎㅎ

  18. 베어러블 2013.12.19 10:18  댓글주소  수정/삭제  댓글쓰기

    recieveNewItem 메소드에서요 ,, 노티피케이션 송출로 itemdic에는 데이터가 들어가는데 전역변수 itemArray에 객체가 추가가 안되요.ㅠ 뭐가 문제인걸까요??

    -(void)recieveNewItem:(NSNotification *)noti{
    NSDictionary *itemDic = [[NSDictionary alloc] initWithDictionary:[noti userInfo]];
    NSLog(@"%@",[itemDic objectForKey:@"brtId"]);
    [self->busArray addObject:itemDic];
    NSLog(@"%@",[self->busArray objectAtIndex:1]);

    [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
    }

    참고로 itemArray를 저는 busArray로 했어요~ 진짜 모르겠네요.ㅠ itemDic에는 들어가는데..

  19. 베어러블 2013.12.20 10:23  댓글주소  수정/삭제  댓글쓰기

    맞네요.ㅋㅋ.ㅠㅠ 그거때문에 엄청 고생했어요 실력이 대단하신거 같아요~ 대학생인데 블로그에서 많은도움 받고있습니다~ 손가락 마구 누르고 싶은데 하나밖에 안눌리네요.ㅎ.ㅎㅎ. 수고하세요~

  20. 쫑이s 2014.04.23 14:58  댓글주소  수정/삭제  댓글쓰기

    야곰님~
    반대로 아이폰에서 DB로 데이터를 전송할 경우에도 웹페이지 작성한 다음에 전송을 할 거 같은데,
    어떤 클래스를 사용하는지 알려주세요 ㅜ_ㅜ UIWebView 내의 메소드를 살펴봤는데, 안보이더라구요..

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

      안녕하세요.
      상황에 따라 많이 다르겠지만, http request를 사용합니다.
      서버로 데이터를 전송하는 방법은 다양하기 때문에 뭐라고 단정짓기가 참 어렵군요^^;

  21. 내친구가민 2014.07.21 22:50  댓글주소  수정/삭제  댓글쓰기

    강좌 잘보고 배우고 갑니다..
    그냥 지나치는건 아닌것같아서 글남깁니다.^.^
    야곰님 블로그를 미리 알았다면 책안사도 되는건데;;;;
    책은 시간이 좀 많을때 차근차근 정독하고..지금은 시간이 촉박해서 핵심포인트만 잡아야할것 같아요..
    덕분에 키 포인트(알짜배기만);;; 염치없지만 따라배우고 갑니다~!!


오늘의 주제

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이라고 관련 검색을 하시면 관련 내용을 찾아보실 수 있을 거예요 :)


오늘의 주제

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을 쓰고 있습니다.


오늘의 주제

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  댓글주소  수정/삭제  댓글쓰기

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


오늘의 주제

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로 메소드를 호출합니다.