簡體   English   中英

使用情節提要板在兩個控制器之間傳遞數據

[英]Passing data between two controllers using storyboards

我試圖將數據從一個UITableViewController傳遞到另一個。 這是我在初始視圖控制器中的代碼:

- (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];
}

日志輸出顯示它已經傳遞了我想要的數據。 但是,當我執行segue並登錄時, ListsViewControllersubject顯示為null。

有任何想法嗎?

您需要覆蓋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實例並ListsViewController分配了一個subject ,但是從未提供過該視圖控制器。 相反, performSegueWithIdentifier:sender創建ListsViewController類的另一個實例,該實例對subject一無所知。 這就是為什么您需要等待UIStoryboardSegue從情節提要中實例化目標視圖控制器,然后以所需的方式對其進行配置的方法,可以在prepareForSegue:sender:方法中進行此操作。

同樣,在performSegueWithIdentifier:sender方法中使用subject作為發送者不是最好的主意,因為它不是發送者:)。 我要做的是在您的視圖控制器類中創建一個屬性主題,並使用它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

在此方法中實現prepareForSegue並通過日期

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([seque.identifier isEqualToString:@"showDetail"])
{
ListsViewController *lists = seque.destinationViewController;
lists.subject = subject;
}
}

很好,但是現在您需要添加以下內容:

首先代替:

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

您需要發送對象:

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

在您的ListsViewController.h中添加一個屬性:

@property (nonatomic, strong) Subject * subjectSegue;

現在在您的第一個視圖控制器中:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showDetail"]) {
        ListsViewController * lists = (ListsViewController *)[segue destinationViewController];
        lists.subjectSegue = sender;
}

您需要了解performSegueWithIdentifier:sender:創建視圖控制器的新實例。 因此,您創建的ListsViewController不會顯示在屏幕上。

您需要覆蓋`prepareForSegue:sender:

- (void)showList:(Subject *)subject animated:(BOOL)animated 
{
  [self performSegueWithIdentifier:@"showDetail" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showDetail"]) {
        ListsViewController *controller = (ListsViewController *)segue.destinationViewController;
    controller.subject = self.subject;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM