呈现和嵌入式视图控制器之间的交互

时间:2013-07-01 05:38:59

标签: ios

  • VC1在容器视图中嵌入VC2。 VC2是表VC。

  • 单击VC2中的单元格会推送VC3。

  • VC3在容器视图中嵌入VC4。

visual 如何从VC4.m 中获得对VC1的引用?

我尝试self.parentViewController.presentingViewController.parentViewControllerself.parentViewController.presentingViewController,但似乎没有效果。

但后来我决定看看当我使用委托来存储对VC1的引用时它是否会起作用,而且我对VC1上的所有公共属性仍然是null。在这种情况下,VC1会不会在内存中吗?如果没有,为什么不呢?如果是这样,为什么其(强)属性为空呢?

编辑:我刚刚通过NSLogs发现VC4中的viewDidLoad在VC2中didSelectRowAtIndexPath完成执行并设置委托引用之前执行,这可以解释为什么这种方法不起作用。如何确保仅在didSelectRowAtIndexPath中所有其他行完成时才推送下一个VC?而且无论如何,VC1上还有其他公共属性在选择行之前已经设置(非空)(我刚用VC2中的didSelectRow中的NSLog验证了这一点),并且它们正在变为空当我尝试通过任何方法通过VC4访问它们时。

(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Navigation logic may go here. Create and push another view controller.
/*
 <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
 // ...
 // Pass the selected object to the new view controller.
 [self.navigationController pushViewController:detailViewController animated:YES];
 */

// set reference to selected convo. it is stored in ConversationsParentVC public property
self.conversationsParentVC.selectedConvo = self.conversationsParentVC.conversationsArray[indexPath.row];

// temp
AppDelegate *delegate = getAppDelegate;
delegate.activeVC = self.conversationsParentVC;
ConversationsParentVC *convosParentVC = (ConversationsParentVC*)delegate.activeVC;
NSLog(@"boop %@", delegate.activeVC);
NSLog(@"beep %i", convosParentVC.conversationsArray.count);
}

stack trace

1 个答案:

答案 0 :(得分:3)

当您从表格视图单元格设置推送segue时,segue会在调用tableView:didSelectRowAtIndexPath:方法之前触发。您需要在源视图控制器的prepareForSegue:sender:方法中将您的信息传递到目标视图控制器。

另外,您可能会发现this answer有帮助。

您可能还会发现知道sender中的prepareForSegue:sender:参数是表格视图单元格,并且表格视图的indexPathForSelectedRow已经设置为单元格的索引路径很有用。