1

Objective-CのiPhoneアプリのストーリーボードで2つのViewController間でオブジェクトを渡そうとしています。(iOS 5 / XCode 4)

最初のViewControllerは、注釈付きのマップです(各注釈オブジェクトは、MyLocationと呼ばれ、含まれているMyLocationViewによってマップ上に表示されます)。ユーザーが注釈をクリックすると、コールアウトが表示されます。次に、ユーザーは右矢印をクリックして、選択した注釈の詳細を表示する注釈詳細ビュー(新しいViewController)をロードします。

メインのViewControllerと注釈の詳細ViewControllerの間を移動するセグエ「SegueAnnotationDetail」を定義しました。

ユーザーがクリックした注釈を保持するためにメインビューコントローラーでインスタンス変数を定義し、それを注釈詳細ビュー(ViewController.h)に渡します。

@interface ViewController : UIViewController <MKMapViewDelegate> {
    MKAnnotationView *selectedAnnotation;
}

したがって、メインのビューコントローラ(ViewController.m)には次のものがあります。

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

    [self performSegueWithIdentifier:@"SegueAnnotationDetail" sender:self];
}


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"SegueAnnotationDetail"])
    {
        LocationDetailViewController *vc = [segue destinationViewController];

        [vc setLocation:selectedAnnotation];
    }
}

次に、LocationDetailViewController(2番目のView Controllerが各注釈の詳細を表示します)に、

@interface LocationDetailViewController : UIViewController

@property MKAnnotationView* location;

@end

各アノテーションはMKPinAnnotationViewであり、ViewController.m内のviewForAnnotationメソッドで次のように作成されます。

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

    static NSString *identifier = @"MyLocation";

    MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [_mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

    // removed some code related to animation view queue here for simplicity

    annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];

    annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    return annotationView;

}

問題は、これを実行すると、アプリが次の行でクラッシュすることです。

[vc setLocation:selectedAnnotation];

アップデート

コンソールのエラーメッセージは次のとおりです。

2012-08-26 18:33:10.615 ArrestsPlotter[79918:c07] -[UIViewController setLocation:]: unrecognized selector sent to instance 0x6ea0b60
2012-08-26 18:33:10.615 ArrestsPlotter[79918:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController setLocation:]: unrecognized selector sent to instance 0x6ea0b60'
*** First throw call stack:
(0x165e022 0x12cecd6 0x165fcbd 0x15c4ed0 0x15c4cb2 0x3977 0x85c4be 0x4f95ab 0x385b 0x361f8c 0x36d8ba 0x165fe99 0x43414e 0x4340e6 0x4daade 0x4dafa7 0x4da266 0x4593c0 0x4595e6 0x43fdc4 0x433634 0x1da5ef5 0x1632195 0x1596ff2 0x15958da 0x1594d84 0x1594c9b 0x1da47d8 0x1da488a 0x431626 0x231d 0x2285)

例外をスローして終了します(lldb)

問題のある行をコメントアウトすると、詳細ページに正しい情報が表示されなくても、アプリは正常に実行されます。

WTFは間違っていますか?

4

1 に答える 1

2

はい、自分で答えました。インターネットではそれほど明確ではないので、ここに答えを投稿します。

ビューコントローラファイルをストーリーボード内の指定されたシーンに関連付けるには、シーンをクリックしてから、属性インスペクタを使用し、[カスタムクラス]を選択して、使用するクラスを選択します。

これが、ViewControllerをシーンにリンクする方法です。それがここで問題を引き起こしていたものでした(最初の回答へのコメントを参照してください)

于 2012-08-26T18:14:01.523 に答える