prepareSegueメソッド内で宛先コントローラーからプロパティを設定しようとすると、一部のタイプのプロパティで可能ですが、そうでないタイプもあります。たとえば、宛先コントローラーに次のプロパティが含まれているとします。
@interface MapController:UIViewController
@property (weak, nonatomic) IBOutlet UIWebView *streetView;
@property (strong, nonatomic) NSString *url;
@property (nonatomic) NSString *latitude;
@property (nonatomic) NSString *longitude;
@property (nonatomic) Venue *venue;
@end
ちなみに、「会場」はこんな感じです。
@interface Venue:NSObject
@property (nonatomic) NSString *latitude;
@property (nonatomic) NSString *longitude;
@end
次のコードが機能します。
/****** CODE 1 *******/
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([[segue identifier] isEqualToString:@"MapViewSegue"]){
MapController *cvc =
(MapController *)[segue destinationViewController];
NSIndexPath *selectedIndex = self.tableView.indexPathForSelectedRow;
Venue *v = (Venue *)[self.entries objectAtIndex:[selectedIndex row]];
/****** Note the difference from CODE 2 below! ******/
cvc.latitude = v.latitude;
cvc.longitude = v.longitude;
// At this point,
// both cvc.latitude and cvc.longitude are properly set.
}
}
しかし、これは機能しません:
/****** CODE 2 *******/
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([[segue identifier] isEqualToString:@"MapViewSegue"]){
MapController *cvc =
(MapController *)[segue destinationViewController];
NSIndexPath *selectedIndex = self.tableView.indexPathForSelectedRow;
Venue *v = (Venue *)[self.entries objectAtIndex:[selectedIndex row]];
/****** Note the difference from CODE 1 above! ******/
cvc.venue.latitude = v.latitude;
cvc.venue.longitude = v.longitude;
// At this point,
// both cvc.venue.latitude and cvc.venue.longitude are nil
}
}
コードで述べたように、NSStringプロパティはprepareSegue内で設定できるようですが、自分のオブジェクトをインスタンス化しようとすると、nilになってしまいます。なぜこれが起こっているのか疑問に思いました。前もって感謝します!