You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin新手求助:如何判断当前ViewController是被Push还是Present?

判断ViewController是Push还是Present的方法

嘿,作为刚接触Xamarin.iOS的新手,这个问题确实挺容易卡壳的!我当初找了好久才摸清楚门道,现在把靠谱的方法分享给你~

核心判断逻辑

我们可以通过ViewController的两个关键属性来区分两种跳转方式:

  • NavigationController:如果当前VC是被Push到导航栈中的,这个属性会指向对应的导航控制器
  • PresentingViewController:如果当前VC是被Present出来的,这个属性会指向发起Present操作的那个控制器

具体实现代码

首先在你的ViewController类中添加两个判断方法:

// 判断是否是被Push进来的
private bool IsViewControllerPushed()
{
    // 导航控制器存在,且当前VC不是导航栈的根控制器,说明是被Push进来的
    return NavigationController != null && NavigationController.ViewControllers.First() != this;
}

// 判断是否是被Present出来的
private bool IsViewControllerPresented()
{
    // PresentingViewController不为空,说明是被Present出来的
    return PresentingViewController != null;
}

然后在需要执行返回操作的地方(比如点击返回按钮),根据判断结果执行对应的操作:

// 示例:点击返回按钮时的处理
private void OnBackButtonClicked(object sender, EventArgs e)
{
    if (IsViewControllerPushed())
    {
        // 被Push进来的,执行Pop操作
        NavigationController.PopViewController(true);
    }
    else if (IsViewControllerPresented())
    {
        // 被Present出来的,执行Dismiss操作
        DismissViewController(true, null);
    }
}

额外注意点

如果遇到导航控制器被整体Present的情况(比如把UINavigationController作为Present的目标),这时候栈内的VC的PresentingViewController会是null,但导航控制器本身的PresentingViewController不为空。如果需要关闭整个页面,你可能需要判断导航控制器是否被Present,再执行Dismiss:

if (NavigationController?.PresentingViewController != null)
{
    NavigationController.DismissViewController(true, null);
}

内容的提问来源于stack exchange,提问作者user6159419

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:12:09