メソッドを上書きする必要がありますprepareForSegue:sender:
。クイックフィックスは
- (void)showList:(Subject *)subject animated:(BOOL)animated
{
[self performSegueWithIdentifier:@"showDetail" sender:subject];
}
...
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"showDetail"]) {
ListsViewController *controller = ([segue.destinationViewController isKindOfClass:[ListsViewController class]]) ? segue.destinationViewController : nil;
controller.subject = ([sender isKindOfClass:[Subject class]]) ? subject : nil;
}
}
コードが機能しなかった理由は、showList:animated:
メソッドでListsViewController
インスタンスを作成して を割り当てたsubject
が、このビュー コントローラーが表示されなかったためです。代わりに、クラスについて何も知らないクラスperformSegueWithIdentifier:sender
の別のインスタンスを作成します。そのため、UIStoryboardSegue がストーリーボードから目的のビュー コントローラーをインスタンス化するのを待ってから、必要な方法で構成する必要があります。これはメソッドで行うことができます。ListsViewController
subject
prepareForSegue:sender:
subject
また、それは送信者ではないため、メソッドの送信者として使用するのは最善の考えではないかもしれませんperformSegueWithIdentifier:sender
:)。私がすることは、View Controller クラスでプロパティ サブジェクトを作成し、それを使用することです。prepareForSegue:sender:
@interface MyViewController ()
@property (strong, nonatomic) Subject *subject;
@end
@implementation MyViewController
- (void)showList:(Subject *)subject animated:(BOOL)animated
{
self.subject = subject;
[self performSegueWithIdentifier:@"showDetail" sender:self];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"showDetail"]) {
ListsViewController *controller = ([segue.destinationViewController isKindOfClass:[ListsViewController class]]) ? segue.destinationViewController : nil;
controller.subject = self.subject;
}
}
...
@end