1

あるデータから別のデータに渡そうとしていますUITableViewController。これは、最初のView Controllerの私のコードです:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
Subject *subject = (Subject *)[self.fetchedResultsController objectAtIndexPath:indexPath];
[self showList:subject animated:YES];
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}

- (void)showList:(Subject *)subject animated:(BOOL)animated {
ListsViewController *lists = [[ListsViewController alloc] initWithStyle:UITableViewStyleGrouped];
lists.subject = subject;
NSLog(@"%@", lists.subject);

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

ログ出力は、必要なデータが渡されたことを示していました。ただし、セグエを実行してログに記録するsubjectと、ListsViewControllernull が表示されます。

何か案は?

4

4 に答える 4

2

メソッドを上書きする必要があります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 がストーリーボードから目的のビュー コントローラーをインスタンス化するのを待ってから、必要な方法で構成する必要があります。これはメソッドで行うことができます。ListsViewControllersubjectprepareForSegue: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
于 2013-10-18T08:52:00.980 に答える
0

このメソッドで prepareForSegue を実装し、日付を渡します

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([seque.identifier isEqualToString:@"showDetail"])
{
ListsViewController *lists = seque.destinationViewController;
lists.subject = subject;
}
}
于 2013-10-18T08:53:08.027 に答える
0

これで問題ありませんが、次を追加する必要があります。

最初の代わりに:

[self performSegueWithIdentifier:@"showDetail" sender:self];

オブジェクトを送信する必要があります:

[self performSegueWithIdentifier:@"showDetail" sender:subject];

ListsViewController.h にプロパティを追加します。

@property (nonatomic, strong) Subject * subjectSegue;

そして今、あなたの最初のView Controllerで:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showDetail"]) {
        ListsViewController * lists = (ListsViewController *)[segue destinationViewController];
        lists.subjectSegue = sender;
}
于 2013-10-18T08:55:26.353 に答える