Iphone course 2

  • 654 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
654
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
12
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. iPhone Application Development II Janet Huang 2011/11/30
  • 2. Today’s topic• Model View Control• Protocol, Delegation, Target/Action• Location in iPhone • CoreLocation • MapKit• Location-based iPhone Application
  • 3. MVC should did will target controller outlet countNotification de data da & KVO le ta ga action te so urc es model view
  • 4. IBOutlet & IBAction target action controller view outlet#import <UIKit/UIKit.h>@interface HelloViewController : UIViewController{ IBOutlet UILabel* display;}- (IBAction)pressButton:(id)sender;@end Interface Builder ViewController
  • 5. Delegation pattern delegate delegatedelegator (helper object)
  • 6. class RealPrinter { // the "delegate" void print() { System.out.print("something"); }}class Printer { // the "delegator" RealPrinter p = new RealPrinter(); // create the delegate void print() { p.print(); // delegation }}public class Main { // to the outside world it looks like Printer actually prints. public static void main(String[] args) { Printer printer = new Printer(); printer.print(); }} java simple example
  • 7. interface I { void f(); void g();}class A implements I { public void f() { System.out.println("A: doing f()"); } public void g() { System.out.println("A: doing g()"); }}class B implements I { public void f() { System.out.println("B: doing f()"); } public void g() { System.out.println("B: doing g()"); }}class C implements I { // delegation I i = new A(); public void f() { i.f(); } public void g() { i.g(); } // normal attributes public void toA() { i = new A(); } public void toB() { i = new B(); }}public class Main { public static void main(String[] args) { C c = new C(); c.f(); // output: A: doing f() c.g(); // output: A: doing g() c.toB(); c.f(); // output: B: doing f() c.g(); // output: B: doing g() }} java complex example
  • 8. @protocol I <NSObject>-(void) f;-(void) g;@end@interface A : NSObject <I> { } // constructor@end -(id)init {@implementation A if (self = [super init]) { i = [[A alloc] init]; }-(void) f { NSLog(@"A: doing f"); } return self;-(void) g { NSLog(@"A: doing g"); } }@end // destructor@interface B : NSObject <I> { } -(void)dealloc { [i release]; [super dealloc]; }@end @end@implementation B-(void) f { NSLog(@"B: doing f"); } int main (int argc, const char * argv[]) {-(void) g { NSLog(@"B: doing g"); } NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]@end init]; C *c = [[C alloc] init];@interface C : NSObject <I> { [c f]; // output: A: doing f id<I> i; // delegation [c g]; // output: A: doing g} [c toB];-(void) toA; [c f]; // output: B: doing f-(void) toB; [c g]; // output: B: doing g@end [c release]; [pool drain];@implementation C return 0;-(void) f { [i f]; } }-(void) g { [i g]; }-(void) toA { [i release]; i = [[A alloc]init]; }-(void) toB { [i release]; i = [[B alloc]init]; }
  • 9. Delegation • Delegate: a helper object can execute a task for the delegator • Delegator: delegate a task to the delegate delegate CLLocationManagerDelegate MyCoreLocationController the delegator the delegate (declare methods) (implement methods)@interface MyCoreLocationController : NSObject <CLLocationManagerDelegate> protocol
  • 10. Location in iPhone• Core Location • framework for specifying location on the planet• MapKit • graphical toolkit for displaying locations on the planet
  • 11. CoreLocation• A frameworks to manage location and heading • CLLocation (basic object) • CLLocationManager • CLHeading• No UI• How to get CLLocation? • use CLLocationManager
  • 12. CoreLocation• Where is the location? (approximately) @property (readonly) CLLocationCoordinate2D coordinate; typedef { CLLocationDegrees latitude; CLLocationDegrees longitude; } CLLocationCoordinate2D; //meters A negative value means “below sea level.” @property(readonly)CLLocationDistancealtitude;
  • 13. CoreLocation• How does it know the location? • GPS • Wifi • Cell network• The more accurate the technology, the more power it costs
  • 14. CLLocationManager• General approach • Check to see if the hardware you are on/user supports the kind of location updating you want. • Create a CLLocationManager instance and set a delegate to receive updates. • Configure the manager according to what kind of location updating you want. • Start the manager monitoring for location changes.
  • 15. CoreLocation• Accuracy-based continuous location monitoring @propertyCLLocationAccuracydesiredAccuracy; @property CLLocationDistance distanceFilter;• Start the monitoring - (void)startUpdatingLocation; - (void)stopUpdatingLocation;• Get notified via the CLLocationManager’s delegate - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation;
  • 16. MapKit• Display a map• Show user location• Add annotations on a map
  • 17. MKMapView• 2 ways to create a map • create with alloc/init • drag from Library in Interface builder• MKAnnotation
  • 18. MKMapView • Controlling the region the map is displaying @property MKCoordinateRegion region; typedef struct { CLLocationCoordinate2D center; MKCoordinateSpan span; } MKCoordinateRegion; typedef struct { CLLocationDegrees latitudeDelta; CLLocationDegrees longitudeDelta; } // animated version - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated; • Can also set the center point only@property CLLocationCoordinate2D centerCoordinate;- (void)setCenterCoordinate:(CLLocationCoordinate2D)center animated:(BOOL)animated;
  • 19. MKAnnotationHow to add an annotation on a map? - implement a customized annotation using MKAnnotation protocol @protocol MKAnnotation <NSObject> @property (readonly) CLLocationCoordinate2D coordinate; @optional @property (readonly) NSString *title; @property (readonly) NSString *subtitle; @end typedef { CLLocationDegrees latitude; CLLocationDegrees longitude; } CLLocationCoordinate2D; - add annotation to MKMapView [mapView addAnnotation:myannotation];
  • 20. #import <Foundation/Foundation.h>#import <MapKit/MapKit.h>@interface MyAnnotation : NSObject <MKAnnotation>{ CLLocationCoordinate2D coordinate; NSString * title; NSString * subtitle;}@property (nonatomic, assign) CLLocationCoordinate2D coordinate;@property (nonatomic, copy) NSString * title;@property (nonatomic, copy) NSString * subtitle;- (id)initWithCoordinate:(CLLocationCoordinate2D)coord;@end MyAnnotation.h#import "MyAnnotation.h"@implementation MyAnnotation@synthesize coordinate;@synthesize title;@synthesize subtitle;- (id)initWithCoordinate:(CLLocationCoordinate2D)coord { self = [super init]; if (self) { coordinate = coord; } return self;}- (void) dealloc{ [title release];! [subtitle release]; [super dealloc];}@end MyAnnotation.m
  • 21. Google Map APIA geolocation api request: http://maps.googleapis.com/maps/api/geocode/output?parameters https://maps.googleapis.com/maps/api/geocode/output?parametersURL parameters: - address (required) - latlng (required) - sensor (required) - bounds - region - language http://code.google.com/apis/maps/documentation/geocoding/
  • 22. http://maps.googleapis.com/maps/api/geocode/json?address=台北101&sensor=true { "results" : [ { "address_components" : [ { "long_name" : "101縣道", "short_name" : "101縣道", "types" : [ "route" ] }, { "long_name" : "New Taipei City", "short_name" : "New Taipei City", "types" : [ "administrative_area_level_2", "political" ] }, { "long_name" : "Taiwan", "short_name" : "TW", "types" : [ "country", "political" ] } ], "formatted_address" : "Taiwan, New Taipei City, 101縣道", "geometry" : { "bounds" : { "northeast" : { "lat" : 25.26163510, "lng" : 121.51636480 }, "southwest" : { "lat" : 25.17235040, "lng" : 121.44038660
  • 23. http://maps.googleapis.com/maps/api/geocode/xml?address=台北101&sensor=true <?xml version="1.0" encoding="UTF-8"?> <GeocodeResponse> <status>OK</status> <result> <type>route</type> <formatted_address>Taiwan, New Taipei City, 101縣道</formatted_address> <address_component> <long_name>101縣道</long_name> <short_name>101縣道</short_name> <type>route</type> </address_component> <address_component> <long_name>New Taipei City</long_name> <short_name>New Taipei City</short_name> <type>administrative_area_level_2</type> <type>political</type> </address_component> <address_component> <long_name>Taiwan</long_name> <short_name>TW</short_name> <type>country</type> <type>political</type> </address_component> <geometry> <location> <lat>25.2012026</lat>
  • 24. http://maps.google.com/maps/geo?q=台北101 { "name": "台北101", "Status": { "code": 200, "request": "geocode" }, "Placemark": [ { "id": "p1", "address": "Taiwan, New Taipei City, 101縣道", "AddressDetails": { "Accuracy" : 6, "Country" : { "AdministrativeArea" : { "AdministrativeAreaName" : "新北市", "Thoroughfare" : { "ThoroughfareName" : "101縣道" }http://maps.google.com/maps/geo?q=台北101&output=csv 200,6,25.2012026,121.4937590
  • 25. Location-based iPhone Implementation
  • 26. Hello Location - get user current location - show a map - show current location - show location information
  • 27. Hello Map - add an annotation on a map - add title and subtitle on this annotation
  • 28. Hello Address - query an address using google geolocation api - show the result on the map