1

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になってしまいます。なぜこれが起こっているのか疑問に思いました。前もって感謝します!

4

1 に答える 1

0

2番目のコードは、cvc.venueが何も指していないため、機能しません。MapControllerクラスでvenueオブジェクトをインスタンス化していないためです。カスタムオブジェクトには特別なことは何もありません。次の場合と同じです。@property(nonatomic)NSArray * array; --新しい配列オブジェクトをインスタンス化するまで、arrayはnilになります。

于 2012-10-13T06:53:41.730 に答える