【问题标题】:Get class name of UIViewController in swift快速获取 UIViewController 的类名
【发布时间】:2014-12-09 02:32:40
【问题描述】:

如何快速获取UIViewController类的类名

在 Objective C 中,我们可以这样做:

self.appDelegate = (shAppDelegate *)[[UIApplication sharedApplication] delegate];
    UIViewController *last_screen = self.appDelegate.popScreens.lastObject ;

    if(last_screen.class != self.navigationController.visibleViewController.class){

    //.......

}

但很快我就这样尝试了

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let last_screen = appDelegate.popScreens?.lastObject as UIViewController

不能这样做。

if last_screen.class != self.navigationController.visibleViewController.class{

//....

}

没有UIViewController 的类方法,即最后一屏

【问题讨论】:

    标签: ios objective-c uiviewcontroller swift


    【解决方案1】:

    该属性在 Swift 中称为 dynamicType

    【讨论】:

      【解决方案2】:

      要知道你的班级名称,你可以这样称呼:

      var className = NSStringFromClass(yourClass.classForCoder)
      

      【讨论】:

        【解决方案3】:

        扩展 juangdelvalle 的answer

        我将此作为扩展添加,以便它可以重用并且更容易从任何视图控制器调用。同样在某些情况下,Swift 中的 NSStringFromClass 返回格式如下的字符串:

        .viewControllerClassName

        修改了这个扩展属性,去掉了项目名前缀,只返回类名。

        extension UIViewController {
            var className: String {
                NSStringFromClass(self.classForCoder).components(separatedBy: ".").last!
            }
        }
        

        【讨论】:

        • 当您说“在某些情况下”时,您的意思是它不会返回一致的答案吗?
        • 其实点之前的第一部分是模块名。因此,如果您的类是在外部库中定义的,您将看到模块名称。然而,最后一部分应该是真正的类名。除非 Apple 出于某种原因决定更改此功能。
        • 为什么不直接使用呢? ``` let viewControllerName = "(viewControllerInstance.classForCoder())" ```
        【解决方案4】:

        这是 isuru 答案的 swift3 版本。

        extension UIViewController {
            var className: String {
                return NSStringFromClass(self.classForCoder).components(separatedBy: ".").last!;
            }
        }
        

        【讨论】:

        • 多了一个 ';'最后。
        • :) @alasker 。猜我不是一个快速的开发者。
        【解决方案5】:

        swift 3 中的一个简单方法是编写以下代码:

        例如:

        let className = String(describing: self)
        

        类:

        let className = String(describing: YourViewController.self)
        

        【讨论】:

          【解决方案6】:

          不需要知道你的类名的最简洁的方法是这样的。

          let name = String(describing: type(of: self))
          

          【讨论】:

            【解决方案7】:

            使用String.init(describing: self.classForCoder)

            示例:

            let viewControllerName = String.init(describing: self.classForCoder)
            print("ViewController Name: \(viewControllerName)")
            

            【讨论】:

              【解决方案8】:

              斯威夫特 4

              假设我们有一个名为HomeViewController 的类。然后您可以使用以下代码获取类的名称:

              let class_name = "\(HomeViewController.classForCoder())"
              

              classForCoder() 方法返回 AnyClass 对象(您的类的名称),我们将其转换为用户的字符串。

              【讨论】:

                【解决方案9】:

                怎么样:

                    extension NSObject {
                
                    static var stringFromType: String? {
                        return NSStringFromClass(self).components(separatedBy: ".").last
                    }
                
                    var stringFromInstance: String? {
                        return NSStringFromClass(type(of: self)).components(separatedBy: ".").last
                    }
                }
                

                【讨论】:

                  【解决方案10】:

                  Swift 5 解决方案:

                  extension NSObject {
                    var className: String {
                      return String(describing: type(of: self))
                    }
                  
                    class var className: String {
                      return String(describing: self)
                    }
                  }
                  

                  用法:

                  class TextFieldCell: UITableVIewCell {
                  }
                  
                  class LoginViewController: UIViewController {
                    let cellClassName = TextFieldCell.className
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2018-11-07
                    • 2019-09-17
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-10-25
                    • 1970-01-01
                    • 2018-06-29
                    • 2017-03-02
                    相关资源
                    最近更新 更多