【问题标题】:Get Title of current ViewController获取当前 ViewController 的 Title
【发布时间】:2018-08-13 12:07:57
【问题描述】:

我想将当前加载的 ViewController 的名称作为字符串。

我得到了这个运行良好的代码:

    if let window = UIApplication.shared.delegate?.window {
        var viewcontroller = window!.rootViewController
        if(viewcontroller is UINavigationController){
            viewcontroller = (viewcontroller as! UINavigationController).visibleViewController

        }
        print(String(describing: viewcontroller!))
    }

但结果看起来不是这样的:

 "MyViewController1"

看起来像这样:

<myapplication.MyViewController1: 0x30141e210>

我怎样才能获得 ViewController 的名称/标题?必须有一些更有效的方法,然后在"." and ":" 之间拆分字符串。

编辑:“vc!.nibName”将不起作用,因为我正在使用情节提要!

编辑 2: 结果应该是这样的:"MyViewController1"

编辑 3: print(viewcontroller?.title) 也不起作用。它只是返回“nil”

任何帮助将不胜感激!

【问题讨论】:

  • 我想获取当前加载的“ViewController”的类名,-the ViewController currently displayed to the user-在我的情况下,我使用您可以在上面的问题中找到的代码来获取这个名称和到目前为止,此解决方案正在运行,但它不仅将名称作为字符串返回,而且还返回了这个疯狂的 &lt;myapplication.MyViewController1: 0x30141e210&gt; 字符串。 我想解决这个问题! @rmaddy @Leo Dabus
  • 这可以通过你投反对票的答案来完成,我现在已经删除了...print(String(describing: type(of: viewcontroller!)))
  • 不行! - 使用@MarcGarcia 的代码将返回“TabBarController”之类的类型,而不是“MyViewController1”! Just try the code on your own and it will open your minds ... :)
  • 但是这段代码运行良好! 100% - 就像我添加的那样 - 是否自己尝试!
  • 我同意@rmaddy。您在此处发布的内容与您拥有的内容不匹配。 Jonas0000 如果你愿意,你可以分享你的完整代码,我会尽力帮助你。

标签: ios swift uiviewcontroller storyboard viewcontroller


【解决方案1】:

如果让 titleString = viewController.navigationItem.title { 打印(标题字符串) }

【讨论】:

    【解决方案2】:

    这个函数会返回当前ViewController的名字:

    /// Returns The Class Name Of A Given View Controller
    ///
    /// - Parameter viewController: UIViewController
    /// - Returns: String
    func classNameFrom(_ viewController: UIViewController) -> String{
    
        let currentViewControllerName = NSStringFromClass(viewController.classForCoder).components(separatedBy: ".").last!
    
        print("Current View Controller = \(currentViewControllerName)")
    
        return currentViewControllerName
    
    }
    

    您可以致电ViewDidLoad 等:

    print(classNameFrom(self))
    

    第二种方法,也许是更强大的解决方案:

    extension UIViewController {
    
    /// Returns The Top Most ViewController In The Navigation Controller
    ///
    /// - Parameter base: UIViewController
    /// - Returns: UIViewController
    func topViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
    
        if let navigationController = base as? UINavigationController {
            return topViewController(base: navigationController.visibleViewController)
        }
        if let tabBarController = base as? UITabBarController {
            if let selected = tabBarController.selectedViewController {
                return topViewController(base: selected)
            }
        }
        if let presentedViewController = base?.presentedViewController {
            return topViewController(base: presentedViewController)
        }
        return base
    }
    
    /// Returns The Class Name Of A Given View Controller
    ///
    /// - Parameter viewController: UIViewController
    /// - Returns: String
    func classNameFrom(_ viewController: UIViewController) -> String{
    
        let currentViewControllerName = NSStringFromClass(viewController.classForCoder).components(separatedBy: ".").last!
    
        print("Current View Controller = \(currentViewControllerName)")
    
        return currentViewControllerName
    
        }
     }
    

    可以这样称呼:

      guard let thisViewController = topViewController(base: self) else { return }
            print(classNameFrom(thisViewController))
    

    【讨论】:

      【解决方案3】:

      似乎没有人正确理解我的问题。这就是我现在使用这个“菜鸟”解决方案的原因:

         if let window = UIApplication.shared.delegate?.window {
              var viewcontroller = window!.rootViewController
              if(viewcontroller is UINavigationController){
                  viewcontroller = (viewcontroller as! UINavigationController).visibleViewController
              }
              let viewControllerString = String(describing: viewcontroller!).split(separator: ".")[1].split(separator: ":")[0]
              print(viewControllerString)
          }
      

      我希望有人能正确回答这个问题,只要我们可能不得不忍受这些代码行!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-27
        • 2021-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多