[英]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並登錄時, ListsViewController
的subject
顯示為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.