아이폰어플개발정보2010. 10. 13. 18:31
[아이폰 앱 개발] NSURLConnection을 이용한 웹페이지 내용 가져오는 방법

SURLConnection을 이용하면 간단하게 해당 웹서버의 html, xml등의 내용을 쉽게 가져올 수 있습니다.

1. 연결

connection = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.cocoadev.co.kr/rss]] delegate:self];

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

대상 URL을 인자로 NSURLConnection을 생성합니다. 위는 이 블로그의 rss를 주소로 생성하는 예입니다. delegate는 self로 현제 오브젝트로 지정합니다. delegate로 지정된 오브젝트는 NSURLConnection의 delegate 메소드를 구현하고 메시지를 받을 수 있습니다.

UIApplication의 networkActivityIndicatorVisible을 YES로 하여 데이터 수신 시 좌측과 같이 상단 상태바에 인디케이터가 회전하는 에니메이션으로 사용자에게 데이터 수신중임을 알려줍니다. 기본값은 NO로 되어 있습니다.

2. delegate 메소드 구현
NSURLConnection 생성시 delegate로 지정된 클래스에서는 해당 이벤트 처리 메소드를 구현해야 합니다. 가장 자주 사용되는 delegate 메소드는 데이터 수신, 연결 종료, 오류발생등에 관련된 것들입니다.

1) 데이터 수신 
* connection:didReceiveData:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
   [receiveData appendData:data];
}
데이터가 수신될 때 불려지면 웹서버로 부터 받은 데이터가 NSData 형태로 넘어 옵니다. NSMutableData의 appendData 메소드를 이용하여 수신되는 데이터들을 차례대로 저장합니다.

2) 연결 종료
* connectionDidFinishLoading:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
   NSString *str = [[NSString alloc] initWithData:receiveData 
encoding: NSUTF8StringEncoding];
   NSLog(@"%@", str);
   [str release];

   [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}
데이터가 모두 수신되어 웹서버와의 연결이 종료되었을 때 호출됩니다. 이곳에서 원하는 작업을 하거나 다른 오브젝트가 처리하도록 할 수 있습니다. 위는 NSData로 저장된 데이터를 NSString으로 변환하여 출력하는 예입니다. xml이라면 NSXMLParser를 사용하여 데이터를 처리할 수 있습니다.

3) 오류 발생
* connection:didFailWithError:
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
   NSLog(@"Connect error: %@", [error localizedDescription]);    

  [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}
네트워크가 연결되지 않았을 경우등 오류가 발생하였을 때 호출되는 메소드 입니다. 해당 페이지가 없음을 나타내는 404 오류등은 이 메소드가 호출되지 않습니다.
Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 10. 13. 14:18
[아이폰 앱 개발] webView를 이용해서 간단한 웹브라우져 만드는 방법

iPhone Coding – Learning About UIWebViews by Creating a Web Browser

Wow! It has been a long time since my last tutorial… As I wrote in my last post, I had to take a break due to my wife having our baby.  But, now I’m back and have a great tutorial for you guys.  

Today I will be showing you how to work with a  UIWebview to create a basic web browser.  Here is a screenshot of the app we are going to create.

Create a View-Based Application

Ok, so let’s get started.  Start by opening up Xcode and click File -> New Project.  Next select View-Based Application and click Choose… Name this project something like iCodeBrowser and click Save.  

Now we are ready to begin coding…

Create IBOutlets and IBActions

Before we create the interface for our web browser, we need to establish the IBOutles and Actions to interface with the UI elements in code.  Start by opening up iCodeBrowserViewController.h and add the following code:

Let’s take a look at this code line by line.  The first thing we added was the  to the end of our interface declaration.  This is telling the app that this class will be the delegate for our UIWebview.  

What does it mean to be the delegate you ask? Great question… A delegate is like a handler.  It is responsible for implementing certain methods in order to handle events sent by the object they are the delegate for.  So in our example, we are simply saying that we will implement some of the functionality of the UIWebView.  This is needed so we can capture certain actions of the UIWebView such as a click on a link or so we can tell when a page has started/finished loading.  If it’s still unclear, ask me clarifying questions in the comments section.

Next, we see our 3 lines of declaring IBOutlets.  These are the UI elements that we will be interacting with.  In case you didn’t know, the UIActivityIndicator is the little spinner/loading animation that you see on various apps when content is loading.  We will be using this to show that a page is currently loading.

Following this code, there are 3 IBActions.  IBActions are functions that get called in response to a user interaction with the application (such as tapping a button).  For our basic browser, we are only offering 3 types of functionality.  gotoAddress which will take a user to the address they type in the address bar and goBack/Forward should be pretty self explanatory.  

Creating the User Interface 

Now, let’s create the interface using Interface Builder.  I am going to be showing you how to do this in the video below.

 

Implementing the IBActions

Now that we have our interface, let’s make the app function.  We need to implement our methods.  Open up iCodeBrowserViewController.m and add the following code.

We need to synthesize our properties to allow us to interact with them.  Synthesizing automatically creates “getter” and “setter” methods for our properties.  Next, let’s implement the viewDidLoad method.  This is where we will be loading our “homepage”.  Add the following code to the viewDidLoad method.

The viewDidLoad method gets called automatically by our application whenever this view first loads.  We can know for sure that it will get called, so we can put our initialization code here.

ADVERTISEMENT

 

The first thing we see is the urlAddress string.  This will be our “homepage”.   You can change this to any address you wish to start with.  Next, we build a URL object with our string.  We need to do this so we can make a web request.  Following this, we build our web request and load it into the webView.  This will display the homepage inside of our webview.  Finally, we set the text of the address bar to the homepage address.  This part is more for aesthetics to let the user know what page they are on.

Next, we implement the method that we connected to the UITextField’s DidEndOnExit method gotoAddress.  Add the following code:

This is similar to the code we wrote in the viewDidLoad method, except for the fact that we are getting our URL string from the address bar.  This method gets called when the user presses the “Go” button on the keyboard.  The last thing to note here is we call the [addressBar resignFirstResponder] method.  This simply tells the app to hide the keyboard when this method gets called.

The implementation of our Back and Forward methods are pretty easy.  Go ahead and add the following code.

UIWebViews are pretty cool because of the functionality they offer us built right in to them.  We simply call[webView goBAck] to go back and [webView goForward] to go forward.  This greatly simplifies the interactions with the webview.  If we were to code that functionality from scratch, we would have to create a stack of URLs and continually push and pop them off the stack to keep track of where we need to go.  Thanks Apple for not making us implement this.

Finally, we need to implement the delegate methods for UIWebview.  These methods allow us to write our own code to respond to actions by the UIWebview.  The first methods we will implement are the webViewDidStartLoad and the webViewDidFinishLoad methods.  We will use these to show and hide the activity indicator. Add the following code:

So when the request is first made for a ULR (before the page starts loading) the webViewDidStartLoad method gets called automatically.  We use this opportunity to start our activity indicator to let the user know the page is loading.  If you don’t have something like this, it simply feels like the app is frozen when in fact, it’s just loading the page.  Finally, the webViewDidFinishLoad method gets called when the page is fully loaded.  After this, we can stop the indicator (and it automatically hides itself).

The very last thing we need to do is define what happens when a user clicks on a link. Add the following method:

This method gets called automatically whenever the user clicks a link.  This method can be very useful if you want to make a native iPhone application that integrates with a web app.  You can use this method to trap the user’s clicks and have your application respond to web links that get clicked.  In our case, we need it to do 2 things.  The first is to set the text of the address bar to the URL of the link that was clicked on and to load that address into the webview.

One thing to make note of: We do a check to see if the URL scheme is “http”. This is to ensure that the user typed http before their URL.  You can add an else statement here that auto prepends the http if the user did not add it.  This would allow you to type in a url such as “icodeblog.com” rather than having to type “http://www.icodeblog.com”.  I chose to omit it for this tutorial.

Remember, all of this added functionality of a UIWebView can only be gotten if you tell your class that it implements the UIWebViewDelegate protocol as we did in our .h file.

The app should be complete! Click on Build and Go to see this baby in action.  Remember, you must put “http://” in front of your URL’s.  

I hope you have enjoyed this tutorial.  If you have any questions or comments, feel free to leave them in the comments section of this post.  You can download the source here . Happy iCoding!

 

 

This entry was posted in Interface BuilderiPhone Programming Tutorials and tagged . Bookmark the permalinkPost a comment or leave a trackback: Trackback URL.
Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 10. 13. 10:22
[아이폰 앱 개발] 모달뷰를 View에 넣는 소스 와 Navigation 에 올리는 소스

네비게이션based 컨트롤러상에서 모달뷰

[self.navigationController presentModalViewController:self.cityWeatherNavigationController animated:YES];


ViewBased컨트롤러상에서의 모달뷰

[self presentModalViewController:self.cityWeatherNavigationController animated:YES];



http://www.iphonedevsdk.com/forum/iphone-sdk-development/21556-presentmodalviewcontroller-viewdidload.html

Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 10. 13. 04:57
[아이폰 앱 개발] navigatioBar 색상 과 모달뷰에서 프레임위치 크기조절하는 소스

CGRect framee = self.view.frame;

self.view.frame = CGRectMake(framee.origin.x, framee.origin.y+10, framee.size.width, framee.size.height);

cityWeatherNavigationController.navigationBar.tintColor = [UIColor darkGrayColor];

[self presentModalViewController:self.cityWeatherNavigationController animated:YES];

Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 10. 12. 23:52
[아이폰 앱 개발] Overriding NSObject Description Method

No doubt NSLog is your friend, I use it frequently to print messages to the console during development. Actually, I use a variation of the NSLog that prints messages to the console sans date, time and object information, you can read about my approach here: Yet Another Debug Output (NSLog Replacement)

Posted by 오늘마감

댓글을 달아 주세요

XCODE2010. 10. 12. 13:06
[아이폰 앱 개발] LightTheCandle 아이폰 어플 만들기
 
 
 
 
IBOutlet을 인스턴스 변수의 타입 앞에 붙여주면 인터페이스 빌더에 노출되고 적당한 UI요소로 연결을 할 수 있다. 각 인스턴스 변수를 property화 하는데, 이들은 IBOutlet으로 지정되어서 인터페이스 빌더에서 적당한 UI요소에 연결될 것이다. 즉 NIB파일이 로드될때 자동으로 생성되는 인스턴스들이다.
 
메소드의 리턴 타입의 void대신 IBAction을 넣어주고, 매게변수 (id)sender로 받도록하면 인터페이스 빌더에 노출되어 특정 UI요소가 터치될 때 실행되는 액션 메소드로 사용될 수 있다.
 
> 뷰 화면에 보이게 설정
 
> Switch에 액션 설정
 
> 리소스 추가하기
 
 
 
 
candle의 상태를 남는 상태변수와 이미지의 변수를 만듬.
 

NSBundle클래스 : 프로그램 안에서 사용되는 코드와 리소스 등을 모아놓은 곳(애플리케이션을 위한 폴더라고 생각~)
 
[NSBundle mainBundle]은 현재 애플리케이션의 실행 파일이 있는 번들을 리턴한다.
-pathForResource:ofType:에 파일의 이름과 확장자를 넘기면 현재 실행되고 있는 애플리케이션의 폴더에서 해당 이름의 리소스가 있는지를 찾고 있으면 그 경로를 넘긴다.
 
넘어온 경로를 이용해 UIImage를 초기화한다.
 
-setImage:메소드를 통해 UIImage를 넘기면 지정된 이미지를 뿌릴수 있다.
 
UISwitch에는 on이라는 프라퍼티가 있으며 BOOL값을 가진다.
 
UILabel의 인스턴스인 candleStateLabel의 text프라퍼티에 "현재 촛불의 꺼져 있으니 켜라"
라는 메시지를 넣어준다.
 
 
LightTheCandleAppDelegate가 dealloc될때 alloc했던 인스턴스를 메모스에서 릴리즈 해준다.
 
 
 
Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 9. 17. 00:01
[아이폰 어플리케이션 개발] view 전환하는 방법
1. 전체개관

Window-Based Application 을 생성하면 델리게이트 한개와 기본 윈도우 한개가 자동생성된다.
화면을 한개만 사용할때는 기본 윈도우를 사용하지만 이 프로그램에서는 아무런 기능을 하지 않는다.

어플리케이션 전체를 위한 뷰컨트롤러를 한개를 만들게 되는데 이 컨트롤러가 모든 화면전환 작업을 책임진다.
이 프로그램에서는 뷰컨트롤러를 위한 뷰를 생성하고 화면전환 버튼을 넣는다.
화면이 전환되더라도 가장 높은 레이어에 이 뷰가 지정되기 때문에 버튼은 계속 보이게 된다.

각각의 전환될 화면을 만들게 되는데 각각의 화면마다 뷰와 뷰컨트롤러를 생성한다.



2. Xcode 를 실행한다.



3. 새프로젝트를 생성한다.

- 상단바 > File > New Project

- Window-Based Application 을 선택한다.

- 프로젝트명을 ChangeTest 로 입력한다.

- Use Core Data for storage 게 체크되어 있으면 해제한다.



4. 어플리케이션 전체를 위한 뷰컨트롤러를 생성한다.

- "Groups & Files" 목록에서 ChangeTest > Classes 로 이동한다.

- 상단바 > File > New File 을 클릭한다.

- Cocoa Touch Class 메뉴를 선택하고 UIViewController subclass 를 선택한 후

  옵션은 전부해제하고 Next 를 클릭한다.

- ChangeTestViewController.m 을 생성한다.



5. 각각의 화면을 위한 뷰컨트롤러를 생성한다.

- FirstViewController.m 과 SecondViewController.m 을 생성한다.

- 3번과 동일한 방식으로 생성한다.



6. 각각의 화면을 생성한다.

- "Groups & Files" 목록에서 ChangeTest > Resources 로 이동한다.

- 상단바 > File > New File 을 클릭한다.

- User interface 메뉴를 선택하고 View XIB 를 선택한 후 Next 를 클릭한다.

- FirstViewController.xib 를 생성한다.

- 동일한 방식으로 SecondViewController.xib 를 생성한다.



7. 델리게이트와 첫번째 생성한 뷰컨트롤러를 연결한다.

- ChangeTestAppDelegate.h 를 수정한다.

===============================================================================
#import

@class ChangeTestViewController;

@interface ChangeTestAppDelegate : NSObject {
    UIWindow *window;
    ChangeTestViewController *ctr;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet ChangeTestViewController *ctr;

@end
===============================================================================

- ChangeTestAppDelegate.m 을 수정한다.

===============================================================================
#import "ChangeTestAppDelegate.h"
#import "ChangeTestViewController.h"

@implementation ChangeTestAppDelegate

@synthesize window;
@synthesize ctr;

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    // Override point for customization after application launch
    [window addSubview:ctr.view];
    [window makeKeyAndVisible];
}

- (void)dealloc {
    [window release];
    [ctr release];
    [super dealloc];
}

@end
===============================================================================



8. 첫번째 생성한 뷰컨트롤러와 뷰컨트롤러를 연결한다.

- ChangeTestViewController.h 를 수정한다.

===============================================================================
#import

@class FirstViewController;
@class SecondViewController;

@interface ChangeTestViewController : UIViewController {
    FirstViewController *first;
    SecondViewController *second;
}

@property (nonatomic, retain) IBOutlet FirstViewController *first;
@property (nonatomic, retain) IBOutlet SecondViewController *second;

- (IBAction)goPrev:(id)sender;
- (IBAction)goNext:(id)sender;

@end
===============================================================================

- ChangeTestViewController.m 을 수정한다.

===============================================================================
#import "ChangeTestViewController.h"
#import "FirstViewController.h"
#import "SecondViewController.h"

@implementation ChangeTestViewController

@synthesize first;
@synthesize second;

- (void)viewDidLoad
{
    FirstViewController *f = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
    self.first = f;
    [self.view insertSubview:f.view atIndex:0];
    [f release];
}

- (IBAction)goPrev:(id)sender
{
    if (self.first == nil)
    {
        FirstViewController *f = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
        self.first = f;
        [f release];
    }

    if (self.second.view.superview != nil)
    {
        [second.view removeFromSuperview];
        [self.view insertSubview:first.view atIndex:0];
    }
}

- (IBAction)goNext:(id)sender
{
    if (self.second == nil)
    {
        SecondViewController *s = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
        self.second = s;
        [s release];
    }

    if (self.first.view.superview != nil)
    {
        [first.view removeFromSuperview];
        [self.view insertSubview:second.view atIndex:0];
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];

    if (self.first.view.superview == nil)
    {
        self.first = nil;
    }
    else
    {
        self.second = nil;
    }
}

- (void)dealloc {
    [first release];
    [second release];
    [super dealloc];
}

@end
===============================================================================



9. 첫번째 생성한 뷰컨트롤러를 의한 뷰를 생성한다.

- MainWindow.xib 를 더블클릭한다.

- Library 창을 열고 Library > Cocoa Touch > Controllers 에서 View Controller 를 선택해서

  MainWindow.xib 에 넣는다.

- 새로 View Controller 창이 뜨면 그창을 선택하고 Identity Inspector 를 열고 Class 에 ChangeTestViewController 를 선택한다.

- Library 창을 열고 Library > Cocoa Touch > Windows, Views & Bars 에서 View 를 선택해서 새로 View Controller 창에 View 를 넣고

  hidden 속성을 준다.

- 버튼을 두개 생성하고 이전 다음으로 제목을 변경한다.

- 버튼을 선택하고 Connection Inspector 를 열고 Touch up inside 와 ChangeTestViewController 에서 각 함수를 연결한다.

- MainWindow.xib 창의 아이콘중 델리게이트 아이콘을 클릭후 Connection Inspector 를 열어 ctr 과 ChangeTestViewController 를 연결한다.



10. 뷰컨트롤러를 수정한다.

- FirstViewController.h 를 수정한다.

===============================================================================
#import

@interface FirstViewController : UIViewController {

}

@end
===============================================================================

- SecondViewController.h 를 수정한다.

===============================================================================
#import

@interface SecondViewController : UIViewController {

}

@end
===============================================================================

- FirstViewController.m 을 수정한다.

===============================================================================
#import "FirstViewController.h"

@implementation FirstViewController

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
}


- (void)dealloc {
    [super dealloc];
}

@end
===============================================================================

- SecondViewController.m 을 수정한다.

===============================================================================
#import "SecondViewController.h"

@implementation SecondViewController

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
}


- (void)dealloc {
    [super dealloc];
}

@end
===============================================================================


11. 뷰를 수정한다.

- FirstViewController.xib 를 더블클릭한 후 File's owner 를 선택한다.

- 상단바 > Tools > Identity Inspector 를 연다.

- Class 에 FirstViewController 를 선택한다.

- View 창 바닥색을 바꾼다.(화면이 바뀌는지 확인을 위해)

- 뷰를 연결한다.(클래스를 바꾸면 View 연결이 해제되므로 다시 연결해주어야 한다.)

- 같은 방법으로 SecondViewController.xib 를 수정한다.



12. 실행한다.

메뉴중 "Build & Go" 를 클릭한다.


출처 : http://blog.naver.com/PostList.nhn?blogId=heajin722¤tPage=23
Posted by 오늘마감

댓글을 달아 주세요