从ViewController转场至Window Controller时PrepareForSegue未被调用
解决思路与方案
1. 确认Storyboard的Segue配置正确性
- 打开Storyboard,选中目标Segue,在Attributes Inspector中:
- 确保Identifier字段与代码中的
"ModalSegue"完全匹配(MacOS下标识符区分大小写) - 确认Segue的Kind设置为
Sheet或Modal(这是MacOS中从ViewController向WindowController发起模态转场的正确类型) - 检查连线逻辑:是从按钮直接拖到SplitWindowController,而非拖到其内部的子ViewController
- 确保Identifier字段与代码中的
2. 手动触发Segue(强制触发PrepareForSegue)
若自动连线的Segue未触发PrepareForSegue,可改为在按钮点击事件中手动调用PerformSegue,确保方法被系统调用:
partial void OnOpenSplitWindowButtonClicked(NSObject sender) { PerformSegue("ModalSegue", this); }
3. 完善PrepareForSegue中的类型校验
在PrepareForSegue中添加空值检查,避免类型转换失败导致数据传递失效:
public override void PrepareForSegue(NSStoryboardSegue segue, NSObject sender) { base.PrepareForSegue(segue, sender); if (segue.Identifier == "ModalSegue") { var splitWindowController = segue.DestinationController as SplitWindowController; if (splitWindowController != null) { splitWindowController.Presentor = this; splitWindowController.Filename = filename; } } }
4. 备选方案:通过SplitWindowController的内容视图控制器传递数据
若上述方法仍无效,可直接获取SplitWindowController内部的目标ViewController传递数据(需替换YourSplitContentViewController为实际的内容控制器类型):
public override void PrepareForSegue(NSStoryboardSegue segue, NSObject sender) { base.PrepareForSegue(segue, sender); if (segue.Identifier == "ModalSegue") { var splitWindowController = segue.DestinationController as SplitWindowController; if (splitWindowController != null) { var targetVC = splitWindowController.Window.ContentViewController as YourSplitContentViewController; if (targetVC != null) { targetVC.Filename = filename; targetVC.Presentor = this; } } } }
5. 检查SplitWindowController的生命周期方法
确认WindowDidLoad方法中没有重置Filename或Presentor属性,避免覆盖已传递的数据。
内容的提问来源于stack exchange,提问作者shiekh
相关产品推荐
相关产品推荐

