'분류 전체보기'에 해당되는 글 744건

  1. 2011.09.19 [iphone] 데이터(XML)를 Post 방식으로 받아서 처리(WCF Rest)
  2. 2011.09.19 [iphone] tableviewcell에서 이미지 로딩을 백그라운드로 돌려서 성능 UP
  3. 2011.09.19 [iphone] table selection 안되게 하기 Disable
  4. 2011.09.14 [surface] 로봇캅 폴리 포스팅 퍼오기 ㅋ
  5. 2011.09.08 [iphone] plist에 배열 저장/ 읽기
  6. 2011.09.08 [iphone] URL 인코딩 1
  7. 2011.09.08 [iphone] NSUserDefaults 를 이용해서 로그인 정보 저장
  8. 2011.09.07 [iphone] 메모리 접근 오류 해결법(EXC_BAD_ACCESS)
  9. 2011.09.05 [iphone] Lost Focus 하는법, UIView에서 Touch event 받는법
  10. 2011.08.29 [iphone] 경고창 띄우는 법
  11. 2011.08.29 [iphone] synthesize 에서 "_" 언더바를 쓰는 이유
  12. 2011.08.26 [iphone] TextField Foucs 가게하기
  13. 2011.08.24 [iphone] 처음에 Logo Image 나오게하기 (Splash Image)
  14. 2011.08.19 [iphone] TableView 아래로 스크롤시 내용이 하단에 계속 추가 되는 기능 만들기
  15. 2011.08.16 [여행] 홍콩 자유여행 3박4일 일정
  16. 2011.08.16 [iphone] TableView에서 긴글을 표시할때 Row 높이를 다이나믹하게 조정하기 5
  17. 2011.08.12 [WCF] IIS에서 WCF 서비스 설치
  18. 2011.08.09 [iphone] 맥용 SVN Client SCPlugin
  19. 2011.07.28 [iphone] modalviewcontroller의 parentviewcontroller 에서 reload하기 1
  20. 2011.07.27 [iphone] IB 를 이용해서 Custom TableViewCell 만들기
  21. 2011.07.27 [iphone] Instruments를 이용해서 메모리 체크를 하자
  22. 2011.07.27 [iphone] 예전에 올린 XML Parsing 소스 Upgrade
  23. 2011.07.26 [iphone] exc_bad_access 에러 났을때 Xcode4에서 활용법
  24. 2011.07.26 [iphone] ModelViewController를 사용해서 뷰위에 뷰를 올려보자
  25. 2011.07.25 [iphone] UIViewController안에 UITableView Insert하기
  26. 2011.07.25 [iphone] UIScrollView 이용하기
  27. 2011.07.22 [iphone] WCF Rest Service로 HttpRequest하는법과 한글 인코딩
  28. 2011.07.22 [iphone] tableview에서 cell을 표시할때 KeyValue쓰지 않고 표시하기
  29. 2011.07.21 [Iphone] NSXMLParser를 이용하여 Xml을 파싱해보자.
  30. 2011.07.19 [iphone] navigationItemButton 추가하는법
iPhone App2011. 9. 19. 11:01

보안이 필요한 데이터를 받고 줘야 할때 (로그인 인증같은거)

GET으로 하게 되면 보안이 치명적일수가 있다.

그래서 Post로 데이터를 받아서 XML을 파싱할려고 했지만

기본 NSXMLParser에는 Get방식으로는 받아서 바로 파싱할수 있으나 Post는 없었다.

그래서 할수 없이 NSURLConnectino을 이용하여 일단 url로부터 Data를 받은후 그 데이터를 NSXMLParser에 넣는 방식으로 처리해야 한다.


//url encoding

NSString *urlString =[NSString stringWithFormat:@"http://주소/MemberSelect?id=%@&pw=%@",_userID.text,_userPW.text];

NSString *escapedUrl = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *xmlUrl =[NSURL URLWithString:escapedUrl];


이렇게 url을 세팅하고


  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:xmlUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

[request setHTTPMethod:@"POST"];

[NSURLConnection connectionWithRequest:request delegate:self];

post로 보내면


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

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

  

NSLog(returnString);


XmlManager* xmlManager= [[XmlManager alloc] init];

NSMutableDictionary *loginInfoData= [xmlManager GetXmlDictDataByData:data elementFile:@"LogInElements.plist"];

}


이 delegate를 통해서 post로 보낸 데이터의 return값을 받을수 있다.


그래서 로그인이 성공하면 성공이라는 메세지를 xml로 보내주게 되고 그밑에 xml을 파싱했다.




Posted by 동동(이재동)
iPhone App2011. 9. 19. 10:55

이렇게 커스텀 셀을 만든후


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

BoardCustomCell *cell = (BoardCustomCell *)[tableView dequeueReusableCellWithIdentifier:BoardCustomCellIdentifier];

  

// NSUInteger row = indexPath.row;

  

if(cell == nil)

{

cell = [BoardCustomCell cellWithNib];

}

  

NSMutableDictionary* commentData = [commentDataArray objectAtIndex:indexPath.row];

cell.contentLabel.text = [commentData objectForKey:@"CmtContent"];

cell.memberNameLabel.text = [commentData objectForKey:@"MemberName"];

cell.dateLabel.text = [commentData objectForKey:@"CreateDate"];

cell.memberLevelLabel.text = [commentData objectForKey:@"PntSumLv"];

cell.memberPointLabel.text = [commentData objectForKey:@"ReCmdCount"];

  

//image 나중에 주소를 plist 넣자

NSString* imageUrl= [NSString stringWithFormat:@"http://주소/%@",[commentData objectForKey:@"MemberPhoto"]];

  

if ([commentData objectForKey:@"MemberPhoto"] == nil)

{

imageUrl= [NSString stringWithFormat:@"http://주소/default_profileImg_small.gif"];

}

  

// UIImage* memberPhotoImage= [[UIImage alloc]initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]]];

// UIImage* memberPhotoImage= [[UIImage alloc]initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]]];

  

[cell performSelectorInBackground:@selector(setImageUrl:) withObject:imageUrl];

// NSURL *url = [NSURL URLWithString:imageUrl];

// NSData *data = [NSData dataWithContentsOfURL:url];

// UIImage *memberPhotoImage = [[UIImage alloc] initWithData:data];

//

// [cell.memberPhotoImage setImage:memberPhotoImage];

// [memberPhotoImage release];

  

return cell;

}


주석 처리한 부분으로 이미지를 처리 했는데 느려서

[cell performSelectorInBackground:@selector(setImageUrl:) withObject:imageUrl];

이렇게 cell에서 이미지 처리를 백그라운드로 돌렸다.

cell 에서 구현한 소스는 이렇다.

-(void) setImageUrl:(NSString *)urlString

{

NSAutoreleasePool* pool = [NSAutoreleasePool new];

  

NSURL *url = [NSURL URLWithString:urlString];

NSData *data = [NSData dataWithContentsOfURL:url];

UIImage *img = [[[UIImage alloc] initWithData:data] autorelease];

  

[self.memberPhotoImage setImage:img];

[pool release];

}

Posted by 동동(이재동)
iPhone App2011. 9. 19. 10:48

//table 셀렉트 안되게

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath{

return nil;

}

Posted by 동동(이재동)
Surface2011. 9. 14. 19:18


http://gilverlight.net/3259


퍼오거기가 귀찮아서 링크로 대신 

Posted by 동동(이재동)
iPhone App2011. 9. 8. 14:10

먼저 프로젝트에 plist파일을 만들고 이런식으로 추가한다.

201109081408.jpg

추가후

  NSString *path = [[NSBundle mainBundle] bundlePath];

NSString *finalPath = [path stringByAppendingPathComponent:@"LogInElements.plist"];

NSMutableDictionary *namesPlist = [[NSMutableDictionary alloc] initWithContentsOfFile:finalPath];

NSMutableArray* elementNameArray = (NSMutableArray*)[namesPlist objectForKey:@"names"];


이렇게 읽어오면 array 가져올수 있다 편하다!!
Posted by 동동(이재동)
iPhone App2011. 9. 8. 11:20

로그인 작업을 할때 특수문자나 한글이 들어갔을때 에러가 나지 않게 하기 위해서는 URL을 인코딩해야 한다.   

NSString *urlString =[NSString stringWithFormat:@"http://주소/Member/MemberSelect?id=%@&pw=%@",_userID.text,_userPW.text];

  

NSString *escapedUrl = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

  

NSURL *XMLURL =[NSURL URLWithString:escapedUrl];


참조 : http://www.digipine.com/programming/6119

Posted by 동동(이재동)
iPhone App2011. 9. 8. 11:16

로그인 정보를 그냥 아이솔레이티드처럼 저장할려 했더니 이런게 존재했다. 정말 간편하게 저장가능하다.

이런식으로 string 및 object형태로 저장가능하다.

나는 NSMutableDictionary에 로그인 정보들을 저장해서 바로 넣어버렸다.

- (void) saveLoginData:(NSMutableDictionary*)data

{

NSUserDefaults *UserloginData = [NSUserDefaults standardUserDefaults];

[UserloginData setObject:data forKey:@"LoginInfoData"];

[UserloginData synchronize];

NSLog(@"Activated = %@",[(NSMutableDictionary*)[UserloginData objectForKey:@"LoginInfoData"] objectForKey:@"Admin"]);

}


간단하다.


Posted by 동동(이재동)
iPhone App2011. 9. 7. 14:30

이오류는 거의 메모리 오류다 일단 나는 2번 dealloc부터 해제 하니깐 메모리 에러를 잡았다.

1. 디버깅 스택을 확인해서 오류난 지점을 찾아라

- 사용자 코드가 나타나지 않을때는 dealloc 확인(네이게이션 컨트롤러에서 팝업될때 많이 발생)

2. dealloc 부터 디버깅해라 !!!

- nil 이 아니고 할당되지 않은 인스턴스에 release 메시지를 날리면 EXC_BAD_ACCESS

3. 부모 컨트롤러에서 값을 받아올때는 retain 하라 !!

- retain 안하면 그냥 주소값만 가져와서 부모에서 release 해버리면 잘못된 접근이 된다.

- 맘편히 프로퍼티로 할당하면 하자. self.param = input_param; 하면 내부적으로 기존것 release, 새것 retain 한다.

4. NSZombiesEnabled 를 활용하자

Posted by 동동(이재동)
iPhone App2011. 9. 5. 20:46

일단 내가 하고 싶던건 로그인 페이지에서 텍스트 필드에 포커스가 가면 키보드가 뜨고

그외에 곳을 터치하면 키보드가 닫기는 그런 구현을 하고 싶었다.

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event


{

[_userID resignFirstResponder];

[_userPW resignFirstResponder];

}

이렇게 touchesBegan 델리게이트를 이용해서 View를 터치할경우

resingFirstResponder로 focus를 잃게 했다.

Posted by 동동(이재동)
iPhone App2011. 8. 29. 17:19

   UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"login" message:@"메세지" delegate:self cancelButtonTitle:@"확인" otherButtonTitles:@"취소", nil];

[alert show];

[alert release];


참고 : http://blowmj.tistory.com/entry/IPhoneUIAlertView경고창-띄우는-방법과-경고창이-여러개일-때-이벤트-구별하는-방법

Posted by 동동(이재동)
iPhone App2011. 8. 29. 14:47

synthesize 팁

외부에서 접근하는 프로퍼티 이름과 내부의 변수 이름을 항상 일치시켜야 할까 ? 그렇지는 않다. 많은 개발자가 다음과 같은 기법을 사용한다.

01: // 헤더

02: @interface AccessorTest2 : NSObject {

03: BOOL _enable;

04: }

05: @property (readwrite,assign) BOOL enable;

06: @end

07:

08: // 구현

09: @implementation AccessorTest2

10:

11: @synthesize enable = _enable;

12:

13: @end

즉 실제 내부 변수를 언더바(_) 문자로 시작하게 선언한다. 그리고 외부에서 접근할 때는 언더바를 제거한 문자로 접근하도록 하는 것이다. 이렇게 해서 내부에서 접근할 때와 외부에서 접근할 때의 차이를 쉽게 구분하도록 한다.

self.enable = YES; // 접근자를 통한 설정

_enable = YES; // 객체 내부에서 접근

위 코드와 같이 접근자로 접근하는 것과 내부에서 접근하는 경우를 확연히 구분할 수 있다. 이 때 synthesize 에 = 가 사용된 것은 enable 이라는 프로퍼티가 _enable 이라는 멤버 변수를 사용한다는 것을 알리기 위한것이다.

출처 : http://blog.messfilm.com/?p=84

외부와 내부에서 접근할때를 구분은 왜 하는것일까? 사실 c#때도 private와 public를 사용해서 좀더 캡슐화에 가깝게 객체지향적으로 짠다.

이것도 그런것일까... 근데 이건 public은 원래 있는것이고 추가적으로 private를 더 만드는것이라 좀 애매하다. 아직 갈길이 멀구나.

Posted by 동동(이재동)
iPhone App2011. 8. 26. 16:44

나도 작가다 앱에서 로그인부분을 만들기 위해 페이스 북 로그인을 모방해 봤다.

페이스북은 항상 키패드가 떠 있는걸 보니 첫 id 입력 부분 textfiled에 focus를 강제로 두고 시작 했다.

방법은 간단하다.

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view from its nib.

[[self userID] becomeFirstResponder];

}


첫 로드 부분에 userID(이게 텍스트 필드랑 연결된 Outlet) 포커스를 가게 했다.


Posted by 동동(이재동)
iPhone App2011. 8. 24. 13:54

간단하다...

그냥 프로젝트에 Default.png 파일을 넣으면 자동으로 해준다.

참고 : http://ekle.us/index.php/2008/10/iphone-application-splash-screens

Posted by 동동(이재동)
iPhone App2011. 8. 19. 17:19

으아~~

쓴거 다 날라갔다 힘들게 썻는데

참고한곳 : http://blog.keyoptions.co/tableview-with-automatic-load-more

참조한곳 소스: 


내가 수정한 소스 



Posted by 동동(이재동)
세상사는 이야기2011. 8. 16. 18:35

일단 참고 할곳

http://sinkiru111.blog.me/60104221036

http://www.cyworld.com/bebe_1987/4221114

홍콩에서 꼭 봐야할곳

http://blog.naver.com/theplaygroup?Redirect=Log&logNo=150110153300

홍콩자유여행 3일차 일기(1일차부터 3일차까지 다 있음)

http://blog.naver.com/nora1910?Redirect=Log&logNo=20133323709

홍콩에서 꼭 가보아야 할 쇼핑몰 3개

http://haseyo.co.kr/10105646922

맛있는 음식점 10개

http://blog.naver.com/jakpoom1215?Redirect=Log&logNo=130099423804

홍콩에서 꼭 가보아야할 명소 10개

http://youmakemehappy.tistory.com/211

홍콩 밤에 가봐야할곳 3개

http://blog.naver.com/the_elp?Redirect=Log&logNo=90117923924

옥토퍼스 카드가 싸게 이동할수 있게 도와준다는데 더 찾아봐야겠다.

먹고 싶은거: 완탕면 (파는곳: 윙치케이)


201108161829.jpg



롱문 레스토랑은 딤섬이 유명

타이윤 시장은 홍콩 재래시장

타이청 베이커리에서 에그 타르트 사먹기

피크타워에서 야경 구경

점보킹덤은 세계 최대의 수상 레스토랑 화려한 야경에서 먹음


추가(2011/8/26)

-마카오에서는 홍콩돈은 사용가능하지만 마카오돈은 홍콩에서 사용못함으로 유의 할것


*홍콩 준비물 정리*

-홍콩달러 (3000달러)

-여권

-카메라,캠코더

-아답터(220v -> 110v)

-해외서 사용가능한 신용카드

-선글라스

-화장품(스킨,로션,선크림)

-세안도구(샴푸,치약은 홍콩호텔에도 있긴하지만 완전 초후진거라고 하니 샴푸 린스도 각자 따로 챙겨가는거 추천)

--샴푸,린스,면도기,칫솔,치약,휴지,

-수건은 호텔에 있지만 혹시나 모르니 1개라고 썻지만 홍콩날씨가 계속 뇌우니 머리 말릴꺼 하나 챙겨야 할듯

-펜(입국심사시 쓰임)

-충전기(아이폰,아이패드)

-옷(속옷 3,양말 3,일반옷 3,바지2,체육복1~2) 각자 알아서 잘 가지고

-비상약(3박 4일임으로 크케 탈나지는 않을꺼니깐 안가져가도 되니 알아서 하길)

-우산(비가 올지도 모르니 작은 우산 하나씩 가지고 오는 센스)

추가

침사추이 A1 출구역 국수집

http://blog.naver.com/globe7939?Redirect=Log&logNo=120098688

크리스탈 제이드 (탄탄면)

http://blog.naver.com/globe7939?Redirect=Log&logNo=121195671

침사추이 핫팟

Tsim Chai Kee Noodle 완탕 ( MTR센트럴 역 D2에서 15분)



'세상사는 이야기' 카테고리의 다른 글

[좋은글] 개처럼 삽니다.  (0) 2013.08.08
몬헌 여기 좋다~ 모든 공략~  (0) 2010.05.31
화장품 사기당하다 ㅠㅠ  (0) 2010.05.17
[잡담] cowon s9 와 s605  (0) 2009.11.16
이문제 풀어보자  (1) 2009.08.10
Posted by 동동(이재동)
iPhone App2011. 8. 16. 17:57

TableView를 이용해서 SNS를 개발 하기위해 선두지점에 있는 Facebook 앱을 보았다.


201108161711.jpg

이렇게 Label이 길수록 TableView cell row가 길게 나왔다.

이렇게 할려면 글을 길이를 계산해서 row의 높이를 계산해야 한다.

#define FONT_SIZE 14.0f

#define CELL_CONTENT_WIDTH 320.0f

#define CELL_CONTENT_MARGIN 10.0f


일단 사이즈를 계산하기 위해 고정적인 정보를 정의 했다.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

{

NSString *text = [items objectAtIndex:[indexPath row]];

  

CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

  

CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

  

CGFloat height = MAX(size.height, 44.0f);

  

return height + (CELL_CONTENT_MARGIN * 2);

}


그리고 heightForRowIndexPath 델리게이트를 이용해서 글의 길이에 따라 cell의 높이를 변화시켰다.items 에는 tableview itemsource가 담겨 있다.
자 이제 실제 label을 조정해 보자.

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

UITableViewCell *cell;

UILabel *label = nil;

  

cell = [tv dequeueReusableCellWithIdentifier:@"Cell"];

if (cell == nil)

{

cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"] autorelease];

  

label = [[UILabel alloc] initWithFrame:CGRectZero];

  

[label setLineBreakMode:UILineBreakModeWordWrap];

[label setMinimumFontSize:FONT_SIZE];

[label setNumberOfLines:0];

[label setFont:[UIFont systemFontOfSize:FONT_SIZE]];

[label setTag:1];

  

// [[label layer] setBorderWidth:2.0f];

  

[[cell contentView] addSubview:label];

  

}

NSString *text = [items objectAtIndex:[indexPath row]];

  

CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

  

CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

  

if (!label)

label = (UILabel*)[cell viewWithTag:1];

  

[label setText:text];

[label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))];

  

return cell;


}


빈 label을 만들어서 add하는 형식이다. 그리고 label의 크기를 이렇게 유동적으로 변형시킨다.

[label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))];


이렇게 하면


201108161748.jpg


이렇게 다이나믹하게 row의 높이가 변한다.


참고 : http://www.cimgf.com/2009/09/23/uitableviewcell-dynamic-height/


하지만 나는 코드상에서 label을 만들어서 하지 않고 ib에서 만들어서 적용할려고 했다. 그래야 쉽지 ㅋㅋ


내가 응용한 코드는 다음과 같다.


//table height label 크기에 따라 변환

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

{

HugeBoardData* hd = [boardData objectAtIndex:indexPath.row];


CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

  

CGSize size = [hd.title sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

  

CGFloat height = MAX(size.height, 44.0f);

  

return height + (CELL_CONTENT_MARGIN * 2);

}


size에 보면 hd.title이 있다. title의 크기를 기준으로 높이를 계산해서 반환한다.


그리고 크기를 내크기에 맞게 변환했다.


#define FONT_SIZE 14.0f

#define CELL_CONTENT_WIDTH 140.0f

#define CELL_CONTENT_MARGIN 10.0f



마지막으로 cellForRowAtIndexPath 델리게이트는

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  

  

HugeBoardCell *cell = (HugeBoardCell *)[tableView dequeueReusableCellWithIdentifier:HugeBoardCellIdentifier];

  

if (cell == nil) {   

cell = [HugeBoardCell cellWithNib];

[cell.titleLabel setMinimumFontSize:FONT_SIZE];

[cell.titleLabel setLineBreakMode:UILineBreakModeWordWrap];

[cell.titleLabel setNumberOfLines:0];

[cell.titleLabel setFont:[UIFont systemFontOfSize:FONT_SIZE]];

[cell.titleLabel setTag:1];

}

  

HugeBoardData* hd = [boardData objectAtIndex:indexPath.row];

CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

  

CGSize size = [hd.title sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

  


cell.titleLabel.text = [NSString stringWithFormat:@"%@", hd.title];

[cell.titleLabel setFrame:CGRectMake(CELL_CONTENT_MARGIN+40, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))];

cell.idxLabel.text= [NSString stringWithFormat:@"%@ : ", hd.idx];

return cell;

}


이렇게 구현했다. 달라진게 있다면 현재 titleLabel은 custom cell의 ib에서 연결된 label이다.즉 behind code에서 처리하지 않고 ib에서 이미 만든값의 크기를 다이나믹하게 변경하였다.
결과는
201108161755.jpg
맨하단에 보면 저렇게 긴글도 제대로 표시해주고 있다.

201108161756.jpg
현재 table의 cell은 이렇게 되어있다. 즉 저기 content라고 써있는 label의 높이를 변형시켰다.
이렇게 약간 페이스북에 가까이 가는거 같다.
Posted by 동동(이재동)
wcf2011. 8. 12. 14:04

일단 프로그램 추가 삭제에서 필요한거 asp.net wcf와 관련된것들을 다  체크 하고 설치를 하고


iis에서도 applciation pool 2.0으로 되어 있는것을 4.0으로 바꾸었으나


자꾸

HTTP Error 404.0 - Not Found

The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

이런 에러가 났었다. ㅡ.ㅡ;;


검색해보니

If ASP.NET v2.0.xxx does not appear in Web Services do:

start/Run/cmd:

cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

(where Windows is your windows directory and .50727 is your .NET version)

aspnet_regiis –ir


이렇게 하란다고 해서 했더니 바로 됨 ㅡ.ㅡ;; 예전에도 이렇게 했었는데 까먹었음 

난 4.0이니 저위에 폴더를 4.0으로 가야 한다.

Posted by 동동(이재동)
iPhone App2011. 8. 9. 13:06

서버는 그냥 윈도우에서 편하게 쓸수 있는 virtual svn을 깔았다.

그리고 클라이언트는 거북이 svn client랑 비슷한

맥용 SVN Client SCplungin을 설치하였다.

하지만 checkout을 할려고 했지만 잘되지 않았다.

SCPlugin giving the message "Server certificate verification failed: certificate issued for a different hostname, issuer is not trusted" on first checkout

이런 에러가 났던것이다.

해결법은

1. Open Terminal (in Utilities, in Applications)

2. Type some svn command against your repository, say "svn ls https://82.100.10.110/svn/Superscout"

3. You'll get a text prompt about the server's certificate, asking you what to do

4. Type "p" (and return), meaning "permanently accept this certificate anyway"

이렇게 터미널 널어서 저렇게 쓰고 p를 누르면 된다. 권한 문제인듯하다

참고 : http://old.nabble.com/SCPlugin-giving-the-message-%22Server-certificate-verification-failed%3A--certificate-issued-for-a-different-hostname,-issuer-is-not-trusted%22-on-first--checkout-td25809151.html

Posted by 동동(이재동)
iPhone App2011. 7. 28. 13:48

내가 하고 싶엇던것은 글쓰기 댓글달기 창을 modal 뷰로 띄우고 저장하면 창이 없어지면서 tableview가 refresh되기를 원했었다.

아직 잘모르겠따

http://stackoverflow.com/questions/2412688/uiviewcontroller-parentviewcontroller-access-properties

여기랑

상위view에서 하위view 만들때 delegate를 이용하자

self.downViewController = [[DownViewController alloc]

initWithNibName:@"DownView" bundle:nil];

self.downViewController.delegate = self;

...

하위view에서 상위view의 Controller사용

[delegate presentModalViewController:self.downTwoViewController animated:YES];

이래 하면 delegate가 상위view의 Controller가 됨  

이걸 참조해보자.

http://liebus.tistory.com/entry/상위-view-의-Controller를-사용하고자-할때

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

새롭게 해보자.

목적: child navigation 메뉴에서 Save를 눌렀을때 parent navgationViewControoler의 Table을 Reload 하는 메소드를 호출하는것

일단 팝업이나 네비게이션 된 자식 헤더에

@property (nonatomic,retain) HugeBoardViewController *hugeboardViewController;


이렇게 parentController를 추가하고


저장버튼에

hugeboardViewController = [self.navigationController.viewControllers objectAtIndex:0];

hugeboardViewController ReloadBoardData];


이렇게 구현했다.

Posted by 동동(이재동)
iPhone App2011. 7. 27. 17:18

일단 UITableViewCell Class를 하나 만들고 Empty Xib 파일도 만든다.

201107271711.jpg

일단 뷰에 UITableViewCell을 추가하고

그뒤 저렇게 Files'Owner에서 class를 UIViewController로 바꾼다.

이번에는 UITableViewCell에 가서


201107271715.jpg

이렇게 바꾸고


201107271716.jpg

identifer도 바꾼다. 바꾸면 이렇게 된다.


201107271716.jpg

자 이제 클래스 파일을 수정하자

헤더파일이다

#import <UIKit/UIKit.h>


#define HugeBoardCellIdentifier @"HugeBoardCellIdentifier"


@interface HugeBoardCell : UITableViewCell {

IBOutlet UILabel *titleLabel;

IBOutlet UILabel *idxLabel;

}


@property (nonatomic,retain) IBOutlet UILabel *titleLabel;

@property (nonatomic,retain) IBOutlet UILabel *idxLabel;

+ (id)cellWithNib;


@end


딴건 중요하지 않고 cellWithNib이 중요하다
실제 구현부에

+ (id)cellWithNib

{

HugeBoardCell *cell;

UIViewController *controller = [[UIViewController alloc] initWithNibName:@"HugeBoardCell" bundle:nil];

cell = (HugeBoardCell *)controller.view;

[controller release];

return cell;

}


이렇게 추가한다.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  HugeBoardCell *cell = (HugeBoardCell *)[tableView dequeueReusableCellWithIdentifier:HugeBoardCellIdentifier];

  

if (cell == nil) {   

cell = [HugeBoardCell cellWithNib];   

}

HugeBoardData* hd = [boardData objectAtIndex:indexPath.row];

cell.titleLabel.text = [NSString stringWithFormat:@"%@", hd.title];

cell.idxLabel.text= [NSString stringWithFormat:@"%@ : ", hd.idx];


실제 사용하는부분에 이렇게 사용했다 ,
Posted by 동동(이재동)
iPhone App2011. 7. 27. 11:35

일단 xcode 4를 위주로 설명하겠다.

지금까지 메모리 관리가 엉망이었다. 메모리 관리를 철저하게 하지 안흐면

계속 사용할때마다 메모리를 먹기때문에 나중에 문제가 생긴다.

그래서 코딩후 항상 체크하는 습관을 가지면 좋다.

일단 prouct의 profile을 클릭한다 단축키가 더 편하다 커맨드+I

201107271128.jpg  

Leaks를 선택한다.

그러면 시뮬레이터가 뜨고 막 이리저리 사용해본다.


201107271132.jpg

그러면 이렇게 뜨는데 snapshot interval이 기본은 10으로 되어있는데 좀더 세밀하게 관찰하기 위해서 좀더 줄인다 나는 5정도로 했다.

그리고 leaks를 클릭 해서 보면 저렇게 메모리 관련 오류가 나온다 그쪽에서 responsible Library를 클릭하면 프로젝트 별로 죽 뜨는데

그쪽에서 현재 자기가 진행하는 프로젝트 이름만 보면 된다.

그뒤 더블 클릭하면 오류가 난 코드가 있는쪽으로 바로간다. 그쪽에서 혹시 메모리관리를 잘못했는지 확인해보자.

Posted by 동동(이재동)
iPhone App2011. 7. 27. 11:19

저번에 XML에 파싱 부분을 올렸었다 소스를 올렸지만 그렇게 되면 메모리 관리가 제대로 안돼서 다시 만들었다.

일단 지난 번 코드를 보자

-(NSMutableArray*) parseContent:(NSURL*) url

{

NSXMLParser* xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

[xmlParser setDelegate:self];

  

_hugeBoardDataArray =[NSMutableArray arrayWithCapacity:1024];

_elementStack = [NSMutableArray arrayWithCapacity:1024];

[xmlParser parse];

return _hugeBoardDataArray;

}

@end

보면 엉망이다 일단 arrayWithCapacity를 마땅히 쓸필요가 없고 _hugeBoardDataArray와 ElementStack을

- (id) init

{

if((self = [super init]) != nil)

{

_hugeBoardDataArray = [[NSMutableArray alloc] init];

_elementStack = [[NSMutableArray alloc] init];

}

  

return self;

}

생성자에서 이렇게 처리 하였다.


그리고 이부분은

-(NSMutableArray*) parseContent:(NSURL*) url

{

NSXMLParser* xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

[xmlParser setDelegate:self];

[xmlParser parse];

[xmlParser release];

  

return [NSMutableArray arrayWithArray:_hugeBoardDataArray];

}

이렇게 고쳤다.

return 부분이 포인트다 무언가를 리턴할때 꼭 autoRelase로 만들어서 리턴해야 한다는 것을 깨달았다.

arraywitharray를 쓴이유다 만약 그냥 _hugeBoardDataArray를 리턴하게 되면 release를 해줘야 하는 타입임으로

저렇게 넣어서 했다.


그리고 data쪽도 new로 받았었는데

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict

{

if([elementName isEqualToString:@”HugeBoardInfo”] == TRUE)

{

HugeBoardData *data = [[HugeBoardData alloc] init];

[_elementStack addObject:data];

[data release];

}

else if([elementName isEqualToString:@”idx”] || [elementName isEqualToString:@”Name”] || [elementName isEqualToString:@”Title”] || [elementName isEqualToString:@”Description” ] || [elementName isEqualToString:@”Date”])

{

NSString *element = [NSString stringWithString:elementName];

[_elementStack addObject:element];

}

}

저렇게 alloc로 받도록 수정하였다.


마지막으로

-(void) dealloc

{

[super dealloc];

[_hugeBoardDataArray release];

[_elementStack release];

}

이렇게 메모리 해제는 꼭 해줘야 한다.




Posted by 동동(이재동)
iPhone App2011. 7. 26. 16:13

product창을 클릭후 Edit Scheme를 클릭



201107261612.jpg

이렇게 app에 가서 Arguments에 간후 NSZombieEnabled와 NSDebugEnabled를 YES로 하면

메모리 오류가 날시 어디서 에러가 났는지 알려준다.

참고한곳 http://mellang.tistory.com/12

Posted by 동동(이재동)
iPhone App2011. 7. 26. 14:17

네이버 카페 어플 이나 기타 글쓰는 어플 보면 네비게이션 보다는 ModelView를 이용해서 현재 뷰위에 뷰를 띄우는 방식을

이용을 많이 사용했다.

그래서 나도 리플을 다는곳에 그냥 ModelView를 이용해 보았다.

너무 쉬웠다. 애플이 참 sdk를 잘만들었구나 싶은 생각이 들었다.

-(void)WriteReply{

ReplyEditView* replyEditView = [[[ReplyEditView alloc]init] initWithNibName:@"ReplyEditView" bundle:nil];

[self presentModalViewController:replyEditView animated:YES];

[replyEditView release];

}


그냥 이부분만 넣으면 된다.

[self presentModalViewController:replyEditView animated:YES];


그럼 닫고 싶을때는 어떻게?


-(void)cancel

{

[self dismissModalViewControllerAnimated:YES];

}



참고한곳 : http://blog.daum.net/urilove0314/8033115

Posted by 동동(이재동)
iPhone App2011. 7. 25. 18:31

대부분 책들은 UIViewController를 만들지 않고 바로 UITableViewController를 바로 상속받아서 사용하였다.

지금은 UIBiewController 에 여러 컨트롤들과 함께 UITableView를 Insert하는 형식으로 만들어보자.

일단 xib view에 TableView를 하나 만들어서 넣자

@interface DetailView : UIViewController <UITableViewDelegate,UITableViewDataSource>{

   IBOutlet UITableView *descriptionTableView;  

NSMutableArray *data;

}


그뒤 UITableViewDelegate,UITableViewDataSource 프로토콜을 이용하자


- (void)viewDidLoad

{

[super viewDidLoad];

descriptionTableView.delegate = self;

descriptionTableView.dataSource = self;

}


viewdidload에 이렇게 추가하고


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


필수 2개 델리게이트를 구현하면 된다 끝~


참고한곳 : http://iwoohaha.tistory.com/156





Posted by 동동(이재동)
iPhone App2011. 7. 25. 18:23

iphone에서 이용하기 위해서는 일단 xib에 UIScrollVier

201107251821.jpg

이런식으로 넣고

ViewDIDLoad에

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view from its nib.

  

descriptionTextView.text = hugeBoardData.description;

  

  

   scrollview.frame = CGRectMake(0, 0, 320, 460);

scrollview.contentSize = CGSizeMake(320, 800);


이렇게 rect를 만든다.그러면 화면이 스크롤이 된다.
참고한곳 : http://www.roseindia.net/tutorial/iphone/tutorial/iphone/UIScrollView-Example-iPhone.html
Posted by 동동(이재동)
iPhone App2011. 7. 22. 18:51

일단 내가 하고 싶었던것은 GET방식의 URL을 HttpRequest 를 해서 WCF에 전송하게 한뒤 글을 쓰게 만드는것이 목표였다.

일단 헤더에 NSMutableData를 만들고

-(void) save{

responseData = [NSMutableData new];

NSString *serviceURL = [NSString stringWithFormat:@"http://192.168.10.3:9090/hugeboardservice/write?name=%@&title=%@&description=%@",

[self encodeString:nameTextField.text],

[self encodeString:titleTextField.text],

[self encodeString:descriptionTextView.text]];


NSURL *url = [NSURL URLWithString:serviceURL];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

  

[request setHTTPMethod:@"GET"];

  

[[NSURLConnection alloc] initWithRequest:request delegate:self];

[self.navigationController popViewControllerAnimated:YES];

}


이렇게 했다 저기 위에 보면 NSURLConnectino을 delegate 받았다.


그래서 추가적으로 4개의 델리게이트 메소드를 만들었다.


- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

[responseData setLength:0];

}


- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

[responseData appendData:data];

}


- (void) connectionDidFinishLoading:(NSURLConnection *)connection {

[connection release];

  

NSString* responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

NSLog(@"the html from google was %@", responseString);

  

[responseString release];

}


-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

NSLog(@"something very bad happened here");

}


참고한곳은 http://toranbillups.com/blog/archive/2011/04/10/Writing-your-first-http-request-in-objective-c


여기이다.

하지만 이렇게 하다보니 문제가 생겼다 한글을 파라미터로 하면 오류가 났던것이다. 아마 인코딩을 안해서 그렇다고 생각해서


//한글떄문에 엔코딩하기 위해서 만든 메소드

-(NSString *)encodeString: (NSString*) unencodedString{

NSString *temp = (NSString *)CFURLCreateStringByAddingPercentEscapes(

NULL,

(CFStringRef)unencodedString,

NULL,

(CFStringRef)@"!*'();:@&=+$,/?%#[]",

kCFStringEncodingUTF8 );

  

return temp;

}


이런 메소드를 추가로 만들었다
만드는데 참고한 사이트는
http://simonwoodside.com/weblog/2009/4/22/how_to_really_url_encode/


***추가***

save를 하고 뒤로 가기 위해서 save메소드에 

[self.navigationController popViewControllerAnimated:YES];

이걸 넣었는데

여기에 넣는게 아니라 

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { [responseData setLength:0]; [self.navigationController popViewControllerAnimated:YES]; }

이쪽에 넣는것이 맞다. 한마디로 작업이 완료가 되면 뒤로 넘어가야지 바로 넘어가면 안되는것이다.

참고 : http://www.pcraft.kr/101


Posted by 동동(이재동)
iPhone App2011. 7. 22. 15:28

이것참... 역시 책으로 공부하면 안되는것이다.

책에서 tableview에 내용을 넣을때 array에 넣고 안에 딕션널리 컬렉션류를 넣어서 항상 forkey를 이용하게 했었다.

그래서 이번에 xml을 파싱하여 tableview로 보여줬어야 했는데 NSObject 클래스로 만들어서 안에 있는 내용을 보여줄려고 해서

key를 쓸려니까 잘안되었다.

말로는 설명이 힘드니 직접 코드를 보자..

@interface HugeBoardData : NSObject {

NSString* _idx;

NSString* _name;

NSString* _title;

NSString* _description;

NSString* _date;

}


@property(nonatomic,retain) NSString* idx;

@property(nonatomic,retain) NSString* name;

@property(nonatomic,retain) NSString* title;

@property(nonatomic,retain) NSString* description;

@property(nonatomic,retain) NSString* date;

이런 데이터 구조를 가진 object class가 있다 여기에 데이터를 집어넣고

HugeBoardData *data = (HugeBoardData*)parentElement;

if([element isEqualToString:@"idx"])

{

data.idx = trimmedValue;

}

else if([element isEqualToString:@"Name"])

{

data.name = trimmedValue;

}

else if([element isEqualToString:@"Title"])

{

data.title = trimmedValue;

}

else if([element isEqualToString:@"Description"])

{

data.description = trimmedValue;

}

else if([element isEqualToString:@"Date"])

{

data.date = trimmedValue;

}

이런식으로 집어넣고 tableiew delegate에서

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  

static NSString *CellIdentifier = @"Cell";

  

//UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

  

if (cell == nil) {

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

}


HugeBoardData* hd = [data objectAtIndex:indexPath.row];

  

cell.textLabel.text = [NSString stringWithFormat:@"%@. %@", hd.idx, hd.title];

cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", hd.name];


return cell;

}


이렇게

HugeBoardData* hd = [data objectAtIndex:indexPath.row];

하고 하나씩 꺼내 쓰면 된다 그러면 원하는 idx,title,name등을 골라서 뽑아 쓰면 된다.

막상 인터넷에도 없고 책에는 다 딕셔널리로 되어 있어서 상당히 헷갈렸던 부분이다.

앞으로 array안에 꼭 데이터를 저렇게 넣고 빼서 써야겠다 어찌보면 간단한건데 헷갈렸던것이다.


Posted by 동동(이재동)
iPhone App2011. 7. 21. 18:15

아이폰에서 XML을 파싱하기 위해서는 여러가지 방법이 있다.

라이브러리를 이용하는 방법(touchXML,KISSXML등등)과 NSXMLParser를 이용하는 방법이 있다.

아이폰이 아닌 그냥 맥개발에서는 NSXMLDocument가 있어서 편하게 쓸수 있다고 하는데 아무튼.. 그냥 힘든방법으로 가자.

c#으로 개발했을때는 시리얼라이즈가 있어서 클래스만 만들면 자동으로 xml을 만들고 파싱하고 아주 편했다.

하지만 Iphone Objective-C는........ㅠ.ㅠ

일단 WCF Rest서비스를 만들어서 DB내용을 XML로 동적으로 뿌려주기 위한 서비스를 만들었다.

그래서 파싱할 xml은 이렇다.

<ArrayOfHugeBoardInfo xmlns="http://schemas.datacontract.org/2004/07/HugeBoardService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

<HugeBoardInfo>

<Date>2010-02-02T00:00:00</Date>

<Description>hi</Description>

<Name>leejaedong</Name>

<Title>hi</Title>

<idx>1</idx>

</HugeBoardInfo>

일단 이 데이터를 저장할 클래스부터 만들자 C#이랑 비슷하다 여기까지는

@interface HugeBoardData : NSObject {

NSString* _idx;

NSString* _name;

NSString* _title;

NSString* _description;

NSString* _date;

}


@property(copy) NSString* idx;

@property(copy) NSString* name;

@property(copy) NSString* title;

@property(copy) NSString* description;

@property(copy) NSString* date;



@end

헤더에 이렇게 넣고

@implementation HugeBoardData

@synthesize idx= _idx;

@synthesize name= _name;

@synthesize title= _title;

@synthesize description = _description;

@synthesize date= _date;

@end


구현부에 구현을 하자

그다음 일단 Xml을 파싱을 전문적으로 하는 class를 만들자.

@interface HugeBoardXmlParser : NSObject<NSXMLParserDelegate> {

NSXMLParser *parser;

NSMutableArray *_hugeBoardDataArray;

NSMutableArray *_elementStack;

}


@property (nonatomic,retain) NSXMLParser *parser;

-(NSMutableArray*)parseContent: (NSURL*) url;

@end


이름을 HugeBoardXmlParser라 만들고 NSXMLParser 델리게이트를 참조 하였다.그리고 XML을 parser할 NSXMLParser와 xml파일의 모든 데이터를 저장할 hugeboardDataArray그리고 elementStack이라고 해서 한줄한줄 읽을때마다 저장해서 이게 어떤 노드에 있고 어떤값지를 임시로 저장해놓는 array이다

#import "HugeBoardXmlParser.h"

#import "HugeBoardData.h"


@implementation HugeBoardXmlParser


@synthesize parser;


- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict

{

if([elementName isEqualToString:@"HugeBoardInfo"] == TRUE)

{

HugeBoardData *data = [HugeBoardData new];

[_elementStack addObject:data];

}

else if([elementName isEqualToString:@"idx"] || [elementName isEqualToString:@"Name"] || [elementName isEqualToString:@"Title"] || [elementName isEqualToString:@"Description" ] || [elementName isEqualToString:@"Date"])

{

NSString *element = [NSString stringWithString:elementName];

[_elementStack addObject:element];

}

}


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

if([elementName isEqualToString:@"HugeBoardInfo"] == TRUE)

{

HugeBoardData *data =(HugeBoardData*)[_elementStack lastObject];

[_hugeBoardDataArray addObject:data];

[_elementStack removeLastObject];

}

else if([elementName isEqualToString:@"idx"] || [elementName isEqualToString:@"Name"] || [elementName isEqualToString:@"Title"] || [elementName isEqualToString:@"Description" ] || [elementName isEqualToString:@"Date"])

{

[_elementStack removeLastObject];

}

  

}


- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

{

//trim 쓰자면 이걸 쓰고 안하면 그냥 string 값을 넣어도 된다.

NSCharacterSet *characterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];

NSString *trimmedValue = [string stringByTrimmingCharactersInSet:characterSet];

if([trimmedValue length] == 0)

{

return;

}

  

id element = [_elementStack lastObject];

if([element isKindOfClass:[NSString class]])

{

NSUInteger count = [_elementStack count];

NSUInteger index = count -2;

id parentElement = [_elementStack objectAtIndex:index];


HugeBoardData *data = (HugeBoardData*)parentElement;

if([element isEqualToString:@"idx"])

{

data.idx = trimmedValue;

}

else if([element isEqualToString:@"Name"])

{

data.name = trimmedValue;

}

else if([element isEqualToString:@"Title"])

{

data.title = trimmedValue;

}

else if([element isEqualToString:@"Description"])

{

data.description = trimmedValue;

}

else if([element isEqualToString:@"Date"])

{

data.date = trimmedValue;

}

}

}

-(NSMutableArray*) parseContent:(NSURL*) url

{

NSXMLParser* xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

[xmlParser setDelegate:self];

  

_hugeBoardDataArray =[NSMutableArray arrayWithCapacity:1024];

_elementStack = [NSMutableArray arrayWithCapacity:1024];

[xmlParser parse];

return _hugeBoardDataArray;

}

@end


이것은 구현부이다.
하나씩 알아보자.일단 파싱을 하기 위해서 필요한 3가지 델리게이트가 있다.첫째 이부분이다.

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict

{

if([elementName isEqualToString:@"HugeBoardInfo"] == TRUE)

{

HugeBoardData *data = [HugeBoardData new];

[_elementStack addObject:data];

}

else if([elementName isEqualToString:@"idx"] || [elementName isEqualToString:@"Name"] || [elementName isEqualToString:@"Title"] || [elementName isEqualToString:@"Description" ] || [elementName isEqualToString:@"Date"])

{

NSString *element = [NSString stringWithString:elementName];

[_elementStack addObject:element];

}

}

초반 엘리먼트를 읽는다. 우린 이것을 일단 모두 저장한다. 어디에? elementStack에

그다음 호출되는것은 이거다

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

{

//trim 쓰자면 이걸 쓰고 안하면 그냥 string 값을 넣어도 된다.

NSCharacterSet *characterSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];

NSString *trimmedValue = [string stringByTrimmingCharactersInSet:characterSet];

if([trimmedValue length] == 0)

{

return;

}

  

id element = [_elementStack lastObject];

if([element isKindOfClass:[NSString class]])

{

NSUInteger count = [_elementStack count];

NSUInteger index = count -2;

id parentElement = [_elementStack objectAtIndex:index];


HugeBoardData *data = (HugeBoardData*)parentElement;

if([element isEqualToString:@"idx"])

{

data.idx = trimmedValue;

}

else if([element isEqualToString:@"Name"])

{

data.name = trimmedValue;

}

else if([element isEqualToString:@"Title"])

{

data.title = trimmedValue;

}

else if([element isEqualToString:@"Description"])

{

data.description = trimmedValue;

}

else if([element isEqualToString:@"Date"])

{

data.date = trimmedValue;

}

}

}


실제 Value값을 여기서 얻을수가 있는데 아까 처음에 _elementStack에 저장했던 값을 분석해서 HugeBoardData라는 아까 만든 저장형 클래스에 담는다. trimmedValiue대신에 string을 넣어도 된다.
마지막으로 호출되는것은 이것이다.

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

if([elementName isEqualToString:@"HugeBoardInfo"] == TRUE)

{

HugeBoardData *data =(HugeBoardData*)[_elementStack lastObject];

[_hugeBoardDataArray addObject:data];

[_elementStack removeLastObject];

}

else if([elementName isEqualToString:@"idx"] || [elementName isEqualToString:@"Name"] || [elementName isEqualToString:@"Title"] || [elementName isEqualToString:@"Description" ] || [elementName isEqualToString:@"Date"])

{

[_elementStack removeLastObject];

}

}


여기서하는것은 아까 foundCharacters에서 저장한 HugeBoardData를 _HugeBoardDataArray에 저장한다. 여기까지가 한텀이 끝난것이다. 이제 아마 같은 방식으로 계속 한텀한텀씩 저장해서 모든 xml데이터를 _hugeBoardDataArray에 저장할것이다.한텀이 끝났으면 다음텀을 위해서 _elementStack을 삭제한다. 이렇게 3개의 델리게이트 메소드가 계속 호출되면서 반복된다.
이제 이 모든기능을 작동되게 만드는 외부에서 호출 당하는 메소드를 보자

-(NSMutableArray*) parseContent:(NSURL*) url

{

NSXMLParser* xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

[xmlParser setDelegate:self];

  

_hugeBoardDataArray =[NSMutableArray arrayWithCapacity:1024];

_elementStack = [NSMutableArray arrayWithCapacity:1024];

[xmlParser parse];

return _hugeBoardDataArray;

}


여기보면 xmlParser를 작동되게 하고 모든 xmlData를 포함하는 _hugeBoardDataArray를 리턴한다.
그래서 외부에서 사용할려면

NSURL *XMLURL =[NSURL URLWithString:@"http://192.168.10.3:9090/hugeboardService/getboardinfo"];

HugeBoardXmlParser* parser = [[HugeBoardXmlParser alloc] init];

NSMutableArray *hugeboardArr = [parser parseContent:XMLURL];


이렇게 하면 된다. 그럼 hugeBoardArr에 모든 데이터가 저장될것이다.



참고 한 사이트 : http://kiipos.delimount.net/1084

Posted by 동동(이재동)
iPhone App2011. 7. 19. 16:26

viewdidload에 이런식으로 추가하고


action쪽에 onadd를 등록했다.


- (void)viewDidLoad

{

[super viewDidLoad];

  

UIBarButtonItem* toAdd=[[UIBarButtonItem alloc] initWithTitle:@"음식 추가" style:UIBarButtonItemStylePlain target:self action:@selector(onAdd)];

self.navigationItem.rightBarButtonItem = toAdd;

   [toAdd release];

.

.

}

그리고 이렇게 아까 action에 쓴 onAdd 메소드를 구현하면 된다.

- (void)onAdd

{

NSLog(@"hi");

}

Posted by 동동(이재동)