ページ 11

iPhoneアプリ

Posted: 2011年5月10日(火) 21:32
by Generalmonkey
現在、MapView上に配置したピンへのtagプロパティの付け方で悩んでいます。
ピンをタップするとバルーンが表示され、左右にボタンを配置しています。(添付画像image1)
tagプロパティを使い、どのピンの、どのボタンが押されたかを判別し、添付画像image2のWebViewへと画面を遷移させたいのですが、この場合どの場所へどのように書けば良いのかがいまいち分かりません。

どなたか、アドバイスなどを頂けないでしょうか。

何か参考になるような情報、サイトなどもご存知でしたらぜひお聞かせください。

宜しくお願い致します。m(__)m

下記コードです。

"MapView.h"

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

@interface MapView : UIViewController<MKMapViewDelegate> {
IBOutlet MKMapView * myMapView;
}

@property(nonatomic, retain) IBOutlet MKMapView *myMapView;

@end

"MapView.m"

#import "MapView.h"
#import "DisplayMap.h"

@implementation MapView

@synthesize myMapView;

- (void)viewDidLoad {
[super viewDidLoad];

myMapView.delegate=self;

NSMutableArray* annotations=[[NSMutableArray alloc] init];

CLLocationCoordinate2D theCoordinate1;
theCoordinate1.latitude = 40.909361;
theCoordinate1.longitude = -74.520264;

CLLocationCoordinate2D theCoordinate2;
theCoordinate2.latitude = 31.244823;
theCoordinate2.longitude = -92.145024;

CLLocationCoordinate2D theCoordinate3;
theCoordinate3.latitude = 36.778261;
theCoordinate3.longitude = -119.417932;

CLLocationCoordinate2D theCoordinate4;
theCoordinate4.latitude = 38.895112;
theCoordinate4.longitude = -77.036366;

CLLocationCoordinate2D theCoordinate5;
theCoordinate5.latitude = 33.468108;
theCoordinate5.longitude = -91.538086;

DisplayMap* myAnnotation1=[[DisplayMap alloc] init];

myAnnotation1.coordinate=theCoordinate1;
myAnnotation1.title=@"New York";
myAnnotation1.subtitle=@"USA";

DisplayMap* myAnnotation2=[[DisplayMap alloc] init];

myAnnotation2.coordinate=theCoordinate2;
myAnnotation2.title=@"Los Angeles";
myAnnotation2.subtitle=@"USA";

DisplayMap* myAnnotation3=[[DisplayMap alloc] init];

myAnnotation3.coordinate=theCoordinate3;
myAnnotation3.title=@"Washington";
myAnnotation3.subtitle=@"USA";

DisplayMap* myAnnotation4=[[DisplayMap alloc] init];

myAnnotation4.coordinate=theCoordinate4;
myAnnotation4.title=@"Las Vegas";
myAnnotation4.subtitle=@"USA";

DisplayMap* myAnnotation5=[[DisplayMap alloc] init];

myAnnotation5.coordinate=theCoordinate5;
myAnnotation5.title=@"Maiami";
myAnnotation5.subtitle=@"USA";

[myMapView addAnnotation:myAnnotation1];
[myMapView addAnnotation:myAnnotation2];
[myMapView addAnnotation:myAnnotation3];
[myMapView addAnnotation:myAnnotation4];
[myMapView addAnnotation:myAnnotation5];

[annotations addObject:myAnnotation1];
[annotations addObject:myAnnotation2];
[annotations addObject:myAnnotation3];
[annotations addObject:myAnnotation4];
[annotations addObject:myAnnotation5];

}

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {

NSLog(@"welcome into the map view annotation");

// if it's the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;

// try to dequeue an existing pin view first
static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
MKPinAnnotationView* pinView = [[[MKPinAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease];
pinView.animatesDrop=YES;
pinView.canShowCallout=YES;
pinView.pinColor=MKPinAnnotationColorRed;

UIButton* leftButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[leftButton addTarget:self
action:@selector(leftClick:)
forControlEvents:UIControlEventTouchUpInside];
pinView.leftCalloutAccessoryView = leftButton;

UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton addTarget:self
action:@selector(rightClick:)
forControlEvents:UIControlEventTouchUpInside];
pinView.rightCalloutAccessoryView = rightButton;

return pinView;
}

- (void)leftClick:(UIButton *)sender {

}

- (void)rightClick:(UIButton *)sender {

}

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

"image1"
画像

"image2"
画像

Re: iPhoneアプリ

Posted: 2011年5月11日(水) 21:12
by めるぽん
MapView は使ったことが無いですが、簡単に調べた限りだと、ボタンに直接イベントを設定するのではなく、MKMapViewDelegate の mapView:annotationView:calloutAccessoryControlTapped: というのを実装すれば、タップされたアノテーションとコールアウトされたコントロールが取れるようです。

Re: iPhoneアプリ

Posted: 2011年5月13日(金) 12:23
by Generalmonkey
めるぽん様、ご丁寧なアドバイスありがとうございました。

ぼんやりとはイメージできているのですが、実際にどの部分へどの様にコードを書けばいいのかが、恥ずかしい事に今の自分の知識ではまだまだ追いつけていない部分もあり、なかなか点と点が線になってくれません。

もし宜しければ、何か参考になるようなサイトなどをご存知でしたら併せてお教え願いませんでしょうか。

宜しくお願い致します。m(__)m

Re: iPhoneアプリ

Posted: 2011年5月13日(金) 22:11
by めるぽん
検索すればいくつかヒットするので、それで分かるでしょうか?

http://www.google.co.jp/search?q=mapVie ... trolTapped

多分、以下のように書けばいいと思います。

コード:

- (void)mapView:(MKMapView*)mapView
    annotationView:(MKAnnotationView*)view
    calloutAccessoryControlTapped:(UIControl*)control {

    // view.annotation に、タップされたボタンの MKAnnotation* が入っている(この場合だと DisplayMap*)
    // なので UIWebView へ渡すための URL が欲しいなら DisplayMap へ入れておく

    if (view.leftCalloutAccessoryView == control) {
        // 左のボタンが押された場合の処理
    } else if (view.rightCalloutAccessoryView == control) {
        // 右のボタンが押された場合の処理
    }
}

Re: iPhoneアプリ

Posted: 2011年5月15日(日) 15:26
by Generalmonkey
めるぽん様、ご返信ありがとうございます。
わざわざ、コードまで書いていただき感謝しております。
分からない事ばかりで申し訳ありませんが、もう一つだけお聞かせ願えないでしょうか?

>>UIWebView へ渡すための URL が欲しいなら DisplayMap へ入れておく

この件なのですが、自分の説明不足でした。(勘違いであれば流しておいて下さい。)
まず、
画像
の画面が現れ、ListViewなのかMapViewなのかが選べるようになっています。
ここで、Go to ListViewを選ぶと次の画面へ遷移します。

"ListView"
画像
さらに、テーブルのセルをタップすると、WebViewへと画面が遷移します。
テーブルセルのNew York, NewYork 2は別のURLにする予定です。

"WebView"
画像

これと同じ動作を、MapViewのピンのボタンでも行いたいのですが、
この場合、URLが記述してあるListViewからURLを引っ張って?くることは可能なのでしょうか?
それとも、DisplayMapにまた別で記述すれば宜しいのでしょうか?

説明が下手で申し訳ありませんが、宜しくお願い致します。m(__)m

追伸:念のためサンプルのリンクを載せておきます。
めるぽん様のお時間に余裕があれば、一度中身を拝見していただけないでしょうか?
ご検討頂けたら幸いです。

Sample.ziphttp://bit.ly/mlru6l

Re: iPhoneアプリ

Posted: 2011年5月17日(火) 02:45
by めるぽん
> この場合、URLが記述してあるListViewからURLを引っ張って?くることは可能なのでしょうか?
頑張ればできるかもしれませんが、そうするべきではないです。
URLやタイトルといったデータを ListView と分けて、ListView と MKMapView から参照するようにすればいいと思います。

ListView の実装を見た限り、以下のような感じになると思います。

コード:

// DisplayMap.h
@property (nonatomic, retain) NSString* url1;
@property (nonatomic, retain) NSString* url2;
というプロパティと、それに関連するメンバを追加して、DisplayMap を生成する際にそれぞれ URL を設定します。

コード:

// MapView.m
    DisplayMap *myAnnotation0 = [[DisplayMap alloc] initWhithTitle:@"New York"
                                                          subTitle:@"NY"
                                                     andCoordiante:location0];
    myAnnotation0.url1 = @"..."; // 追加
    myAnnotation0.url2 = @"..."; // 追加
(url1,url2 を readonly にした上で、initWhithTitle の引数として URL を渡した方がいいかもしれません)

mapView:annotationView:calloutAccessoryControlTapped: は、

コード:

// MapView.m
- (void)mapView:(MKMapView*)mapView
    annotationView:(MKAnnotationView*)view
    calloutAccessoryControlTapped:(UIControl*)control {

    DisplayMap* disp = (DisplayMap*)view.annotation;
    if (view.leftCalloutAccessoryView == control) {
        ListWebView* webView = [[[ListWebView alloc] initWithNibName:@"ListWebView"
                                                              bundle:[NSBundle mainBundle]] autorelease];
        webView.title = disp.title;
        webView.url = disp.url1;
        [self.navigationController pushViewController:webView animated:YES];
    } else if (view.rightCalloutAccessoryView == control) {
        ...
    }
}
こんな感じでしょうか。

Re: iPhoneアプリ

Posted: 2011年5月19日(木) 21:58
by Generalmonkey
めるぽん様、実装出来ましたー!

本当にありがとうございます。m(__)m

この壁に当たった時は、もう無理なんじゃないのかと半分諦めムードでいました。

めるぽん様のおかげで、諦めずに行けそうです。

本当に本当に感謝しております。