MKPinannotation detail disclosure button - neue Ansicht
FirstViewController.h
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface TransparentToolbar : UIToolbar{
}
@end
@interface AddressAnnotation : NSObject <MKAnnotation> {
CLLocationCoordinate2D coordinate;
NSString *title;
NSString *subTitle;
NSString *directions;
NSString *website;
}
@property (nonatomic,retain) NSString *title;
@property (nonatomic,retain) NSString *subtitle;
@property (nonatomic,retain) NSString *directions;
@property (nonatomic,retain) NSString *website;
@end
@interface FirstViewController : UIViewController {
IBOutlet MKMapView *mapView;
//stores go here!
//declare store names as Company *cityState
AddressAnnotation *chiliAuburnAlabama;
AddressAnnotation *tuttifruttiHomewoodAlabama;
NSString *website;
}
@property (nonatomic,retain) NSString *website;
-(IBAction) updateLocation;
-(IBAction) setMap:(id)sender;
-(IBAction) showPin;
@end
FirstViewController.m
#import "FirstViewController.h"
#import "MoreInfo.h"
@implementation AddressAnnotation
@synthesize title;
@synthesize subtitle;
@synthesize coordinate;
@synthesize directions;
@synthesize website;
- (NSString *)subtitle{
return subtitle;
}
-(NSString *) website{
return website;
}
-(NSString *) directions{
return directions;
}
- (NSString *)title{
return title;
}
-(id)initWithCoordinate:(CLLocationCoordinate2D) c{
coordinate=c;
return self;
}
@end
@implementation TransparentToolbar
//Override draw rect to avoid
//background coloring
- (void)drawRect:(CGRect)rect {
//do nothing in here
}
//Set properties to make background
//translucent.
- (void) applyTranslucentBackground
{
self.backgroundColor = [UIColor clearColor];
self.opaque = NO;
self.translucent = YES;
}
//Override init.
- (id) init
{
self = [super init];
[self applyTranslucentBackground];
return self;
}
//Override initWithFrame.
- (id) initWithFrame:(CGRect) frame
{
self = [super initWithFrame:frame];
[self applyTranslucentBackground];
return self;
}
@end
@implementation FirstViewController
@synthesize website;
//Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)mapViewWillStartLocatingUser:(MKMapView *)mapView{
}
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
[self showPin];
}
- (void)viewDidLoad
{
mapView.showsUserLocation = YES;
//[self showPin];
[super viewDidLoad];
}
-(IBAction) updateLocation{
mapView.showsUserLocation = YES;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
//Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (void)didReceiveMemoryWarning
{
//Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
//Release any cached data, images, etc. that aren't in use.
}
- (void)viewDidUnload
{
[super viewDidUnload];
//Release any retained subviews of the main view.
//e.g. self.myOutlet = nil;
}
-(IBAction)setMap:(id)sender{
switch(((UISegmentedControl *)sender).selectedSegmentIndex){
case 0:
{
mapView.mapType = MKMapTypeStandard;
break;
}
case 1:
{
mapView.mapType = MKMapTypeSatellite;
break;
}
case 2:
{
mapView.mapType = MKMapTypeHybrid;
break;
}
}}
- (MKAnnotationView *)mapView:(MKMapView *)mv viewForAnnotation:(id <MKAnnotation>)annotation {
MKAnnotationView *pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"pinView"];
if (!pinView) {
pinView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pinView"] autorelease];
pinView.image = [UIImage imageNamed:@"SPOON4.png"];
pinView.frame = CGRectMake(-30, 0, 37.5, 67.5);
//pinView.animatesDrop = YES;
pinView.canShowCallout = YES;
UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
pinView.rightCalloutAccessoryView = rightButton;
} else {
pinView.annotation = annotation;
}
if (annotation == mapView.userLocation){
return nil; //default to blue dot
}
return pinView;
}
-(IBAction) showPin{
MKCoordinateRegion region;
MKCoordinateSpan span;
span.latitudeDelta=0.2;
span.longitudeDelta=0.2;
//MOST CODE WILL BE INSERTED HERE!
//INSTRUCTIONS!
//CCLocationCoordinate2D companyCity = mapView.userLocation.coordinate;
//companyCity.latitude = latitude here;
//companyCity.longitutde = longitude here;
//CLLocation *companyCityLocation = [[CLLocation alloc] initWithLatitude:companyCity.latitude longitude:companyCity.longitude];
//if(companyCityState != nil) {
//[mapView removeAnnotation:companyCityState];
//[companyCityState release];
//companyCityState = nil;
//}
//companyCityState = [[AddressAnnotation alloc] initWithCoordinate:companyCity];
//companyCityState.title = @"name of shop here";
//double distanceMetersCompanyCityState = [mapView.userLocation.location distanceFromLocation:companyCityLocation];
//double distanceMilesCompanyCityState = distanceMetersCompanyCityState/1609.334;
//companyCityState.subtitle= [NSString stringWithFormat:@"%.2f miles away", distanceMilesCompanyCityState];
//[mapView addAnnotation:companyCityState];
//[companyCityState release];
//always declare location as companyCity
//if more than one in one city then add a number i.e. companyCity2
//chili in mobile alabama
CLLocationCoordinate2D chiliAuburn = mapView.userLocation.coordinate;
chiliAuburn.latitude = 32.606434 ;
chiliAuburn.longitude = (-85.484025);
CLLocation *chiliAuburnLocation = [[CLLocation alloc] initWithLatitude:chiliAuburn.latitude longitude:chiliAuburn.longitude];
if(chiliAuburnAlabama != nil) {
[mapView removeAnnotation:chiliAuburnAlabama];
[chiliAuburnAlabama release];
chiliAuburnAlabama = nil;
}
chiliAuburnAlabama = [[AddressAnnotation alloc] initWithCoordinate:chiliAuburn];
chiliAuburnAlabama.title = @"Chili Yogurt Café";
chiliAuburnAlabama.website = @"http://stackoverflow.com/questions/6195774/mkpinannotation-detail-disclosure-button-get-directions-call-number";
double distanceMetersChiliAuburnAlabama = [mapView.userLocation.location distanceFromLocation:chiliAuburnLocation];
double distanceMilesChiliAuburnAlabama = distanceMetersChiliAuburnAlabama/1609.334;
chiliAuburnAlabama.subtitle= [NSString stringWithFormat:@"%.1f miles away", distanceMilesChiliAuburnAlabama];
[mapView addAnnotation:chiliAuburnAlabama];
[chiliAuburnAlabama release];
//tutti frutti homewood alabama
CLLocationCoordinate2D tuttifruttiHomewood = mapView.userLocation.coordinate;
tuttifruttiHomewood.latitude = 33.479775 ;
tuttifruttiHomewood.longitude = -86.790977;
CLLocation *tuttifruttiHomewoodLocation = [[CLLocation alloc]initWithLatitude:tuttifruttiHomewood.latitude longitude:tuttifruttiHomewood.longitude];
if(tuttifruttiHomewoodAlabama != nil) {
[mapView removeAnnotation:tuttifruttiHomewoodAlabama];
[tuttifruttiHomewoodAlabama release];
tuttifruttiHomewoodAlabama = nil;
}
tuttifruttiHomewoodAlabama = [[AddressAnnotation alloc] initWithCoordinate:tuttifruttiHomewood];
double distanceMetersTuttifruttiHomewoodAlabama = [mapView.userLocation.location distanceFromLocation:tuttifruttiHomewoodLocation];
double distanceMilesTuttifruttiHomewoodAlabama = distanceMetersTuttifruttiHomewoodAlabama/1609.334;
tuttifruttiHomewoodAlabama.title = @"Tutti Frutti";
tuttifruttiHomewoodAlabama.subtitle = [NSString stringWithFormat:@"%.1f miles away",distanceMilesTuttifruttiHomewoodAlabama];
[mapView addAnnotation:tuttifruttiHomewoodAlabama];
//ignore below
CLLocationCoordinate2D user = mapView.userLocation.coordinate;
region.span = span;
region.center = user;
[mapView setRegion:region animated:TRUE];
[mapView regionThatFits:region];
}
- (void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views {
for(MKAnnotationView *annotationView in views) {
if(annotationView.annotation == mv.userLocation) {
MKCoordinateRegion region;
MKCoordinateSpan span;
span.latitudeDelta=0.1;
span.longitudeDelta=0.1;
CLLocationCoordinate2D location=mv.userLocation.coordinate;
region.span=span;
region.center=location;
[mv setRegion:region animated:TRUE];
[mv regionThatFits:region];
}
}
}
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control{
MoreInfo *moreInfoView = [[MoreInfo alloc] initWithNibName:@"MoreInfo" bundle:nil];
moreInfoView.title = view.annotation.title ;
//moreInfoView.getDirections = @"";
moreInfoView.getWebsite = [NSURL URLWithString:view.annotation.website];
[self.navigationController pushViewController:moreInfoView animated:YES];
}
- (void)dealloc
{
[super dealloc];
}
@end
MoreInfo.h
#import <UIKit/UIKit.h>
@interface MoreInfo : UIViewController {
IBOutlet UITableView *tableView;
NSMutableArray *moreInfo;
NSURL *getDirections;
NSURL *getWebsite;
}
-(void)goToWebsite;
@property (nonatomic,retain) NSURL *getDirections;
@property (nonatomic,retain) NSURL *getWebsite;
@end
MoreInfo.m
#import "MoreInfo.h"
#import "FirstViewController.h"
@implementation MoreInfo
@synthesize getDirections;
@synthesize getWebsite;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
//Custom initialization
}
return self;
}
- (void)dealloc
{
[super dealloc];
}
- (void)didReceiveMemoryWarning
{
//Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
//Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad {
moreInfo = [[NSMutableArray alloc] init];
[moreInfo addObject:@"Phone Number"];
[moreInfo addObject:@"Address"];
[moreInfo addObject:@"Go to Website"];
[moreInfo addObject:@"Get Directions"];
[super viewDidLoad];
}
/*- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath{
}*/
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
if (indexPath.row == 2) {
[self goToWebsite];
}
}
-(void) goToWebsite{
[[UIApplication sharedApplication]openURL:getWebsite];
NSLog(@"website is %@", [getWebsite absoluteString]);
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [moreInfo count];
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if (section == 0) {
return @"More Information";
}else return nil;
}
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
//Set up the cell...
if(indexPath.section == 0){
cell.textLabel.text = [moreInfo objectAtIndex:indexPath.row];
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
} return cell;
}
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
if(section == 0){
return @"Touch the Address to Get Directions";
}else return nil;
}
- (void)viewDidUnload
{
[super viewDidUnload];
//Release any retained subviews of the main view.
//e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
//Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich das richtig verstehe, möchten Sie hinzufügen, um eine Offenlegung-Taste, die Ihnen erlauben würde, eine neue Ansicht mit Informationen über den aktuellen pin-annotation. Um eine Offenlegung-Taste, die Sie gerade brauchen, um dies zu implementieren-code:
Jetzt, wenn Sie Tippen Sie auf einen pin auf der mapView, eine Offenlegung Taste wird die Anzeige in der Ansicht präsentiert. Sie müssen dann die folgende Methode verwenden, um zu sagen, die app, was zu tun ist, wenn die Offenlegung-Taste gedrückt wird.
In dieser Methode können Sie ein popover oder modal-Fenster oder drücken einer Ansicht oder was auch immer Sie tun möchten, mit Informationen über die aktuelle Lage. Sie nicht brauchen, um erstellen Sie eine neue Spitze für jeden, entweder. Die einfachste Sache zu tun wäre, zu synthetisieren Werte in diesem view-controller wie
phoneNumber
undwebsite
und Dinge wie, dass. Dann in der letzten Methode dort, wo Sie der Ansicht, übergeben Sie die Werte nach Bedarf ein. Zum Beispiel,und so weiter, bevor Sie den Blick. Ich hoffe, das hilft
EDIT: Um loszuwerden, die Fehler, für alles, was Sie synthetisieren kann, müssen Sie deklarieren in der Kopfzeile. So haben Sie
Werden Sie wollen, dass in der annotation-header als auch, wenn Sie es verwenden, gibt es. Er erzählt, dass ein Teil der code, den Sie sollten erwarten, dass einige-string gesendet, und es wird wissen, wie zu behandeln es zu speichern.
Da für den Aufruf Ihrer GoToMap Methode ist, sollten Sie einen Delegaten für Ihr MoreInfo Klasse, wenn Sie es schaffen. Also in deinem MoreInfo-header, müssen Sie, unter den alles andere
Dann, wenn Sie es schaffen, in Ihrer view-controller haben, müssen Sie
Schließlich, wenn Sie wollen, rufen Sie GoToWebsite von Ihrem MoreInfo, können Sie rufen Sie
Dies ist natürlich vorausgesetzt, dass die Methode ist in Ihrem ersten view-controller (was ich könnte schwören, dass es war, aber kann es nicht finden alle plötzlich).
Aber das ist im Grunde, wie würden Sie gehen über es
mapView:viewForAnnotation
Methode oben. Zum Beispielif ([annotation isKindOfClass:[MKUserLocation class]]) { return nil; }
(dies sollte immer Ihrer aktuellen Position überschrieben wird). Dadurch können Sie hinzufügen andere Funktion oder Farben oder was auch immer Sie möchten, um verschiedene Anmerkungen in Fall, dass Sie sich später dafür entscheiden, eine Klasse für verschiedene Unternehmen Typen, etc.MapViewController.m
- Datei, so dass Sie könnte wahrscheinlich verwenden, der als ein guter Ort, um zu starten[myMapView addAnnotation:newAnnotation];
oder wenn Sie eine Gruppe von neuen Anmerkungen[myMapView addAnnotations:arrayOfAnnotations];
for (int i = 0; i < [myCoordinatesArray count]; i++) { // run through all your coordinates to create annotations;
. Diese für Sie möglicherweise nicht zutreffen, aber ein Blick in MKReverseGeocoder, könnte nützlich sein, späterwebsite
. Pass es mitvc.website = annotation.website;
. Dann, wenn Sie die Anzeige der view-controller, erstellen Sie eine textView mit string als text,textView.text = website;
. Dann machen es zu einem anklickbaren link werden Sie sagen[textView setDataDetectorTypes:UIDataDetectorTypeLink];
. Dann sollten Sie in der Lage sein, um Sie auf Ihren website-link und es haben, nehmen Sie die Seite in Safari. Wenn Sie mehr Erklärung über sythesizing die Zeichenfolge, lass es mich wissen-(void) goToWebsite{ [[UIApplication sharedApplication]openURL:getWebsite];
und ich habe den text in der Zelle zu =@"Go To Website";
wie bekomme ich die- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
zu laden, bis die GoToWebsite Methode?if(indexPath.row = (the row the get directions text is in)){[self goToMap]; }
MoreInfo
für seine tableview, haben Sie sich überlegt mit einem TableViewController an seinen Platz? Es braucht nicht eine nib-Datei und sollte optimieren, was Sie wollen zu tun, es[[UIApplication sharedApplication]openURL:getWebsite];
-- Bedeutung, wenn ich drücken Sie die Taste an, die Zeile, die es ausführen sollte, aber noch nichts ist passiert. ist nicht auch arbeiten, die in Simulatoren oder ist meine Codierung falsch? und Sie brauchen nicht zu entschuldigen! Ihr tut MIR einen gefallen, nur durch das beantworten! -- oh, und über den tableview controller -- ich tatsächlich versucht haben und es einfach immer, gebe mir Mühe, so ging ich nur mit einem UIViewNSLog(@"website is %@", [getWebsite absoluteString]);
sollte Ihnen zeigen, eine string-version der Website, die Sie versuchen zu nennen. Und wie für den TableViewController, es wäre eine gute Sache, zu schauen, später, sobald man sich wohlermoreInfoView.getWebsite =[NSURL URLWithString:@"www.google.com"];
ich es google nur um zu versuchen, um es zu arbeiten. es zeigt auch, dass google in der anmelden-button drücken, aber es nimmt nicht mich auf safarichiliAuburnAlabama(an object from the class AddressAnnotation).website (which takes a NSString * ill update my code soon) = @"URL of this page just to test";
dann später, wenn ich die Zuordnung der chiliAuburnAlabama website Wert moreInfo.website ich SchreibemoreInfo.website = [NSURL URLWithString:view.annotation.website];
Aktualisierung der code jetztNSString *website
,@property (...)...*website
und@synthesize website
mehr für Ihre FirstViewController Klasse. Sieht nicht aus wie Sie verwenden es außerhalb der annotation und der MoreInfo Klassen. Aber wo ist es, was Ihnen Probleme? Auf dermoreInfoView.getWebsite = [NSURL URLFromString:view.annotation.website];
Linie? Oder irgendwo anders?title
,subtitle
undcoordinate
. Sie können es ändern, enthalten alles, was Sie wollen (d.h. Richtungen, website, etc.). So setzen Sie Sie als@property...
und@synthesize...
wie Sie es Taten, aber Sie wollen nicht zu haben- (NSString *)website { return website; }
. Gleiches gilt fürdirections
. Diese Art von Verfahren ist nur für Objekte, die in das Protokoll, das diejenigen, die es nicht sind. Löschen Sie diese Methoden, und Sie sollten in Ordnung sein#import
und@interface
Erklärungen, wenn Sie immer noch wollen, um zu versuchen, die