【问题标题】:Swift - Proper usage of AnyObjectSwift - AnyObject 的正确使用
【发布时间】:2015-10-27 23:56:01
【问题描述】:

我是swift 的新手。我正在使用storyboard,根据登录信息,我将UIViewController 更改为加载。下面是sn-p。

class func viewControllerWithName(name: String) -> UIViewController?
    {
        let storyboard = mainStoryboard()
        let viewController: AnyObject! = storyboard.instantiateViewControllerWithIdentifier(name)
        return viewController as? UIViewController
    }

func setUpController {
        let viewController: AnyObject!
        if self.user() == "admin" {
            viewController:AdminViewController = self.viewControllerWithName("admin") !as! AdminViewController
        } else {
            viewController:UserViewController = self.viewControllerWithName("user") !as! UserViewController
        }
        self.addChildViewController(viewController)
        viewController.view.frame = container.frame
        self.view.addSubview(viewController.view)
        viewController.didMoveToParentViewController(self)
    }

我尝试了很多方法,但是我无法对viewController 进行类型转换。我得到错误,说

Cannot invoke 'addChildViewController' with an argument list of type '(AnyObject!)'

实现此目的的正确格式是什么?

【问题讨论】:

  • 尝试将let viewController: AnyObject!更改为let viewController: UIViewController!
  • 没用。它在setUpController() 的第 3 行给了我错误,它说,一行上的连续语句必须用 ';'' 分隔,建议我添加 ';'在viewController';':AdminViewController 之间。第 5 行也一样。

标签: ios iphone swift ios7 ios8


【解决方案1】:

当你知道它将成为一个视图控制器时,你为什么将它声明为AnyObject?将其声明为UIViewController,您提到的错误应该会消失。

您不需要在 if-else 部分执行viewController:AdminViewController。无论如何,您都在强制转换 viewControllerWithName 方法的输出。

【讨论】:

    【解决方案2】:

    在这种情况下,您表示 viewController 是 AnyObject 类型:

    let viewController: AnyObject!
    

    要将 UIVIewController 传递给 addChildViewController,您可以尝试以下操作:

    let viewController = self.viewControllerWithName("admin") as! AdminViewController
    
    self.addChildViewController(viewController)
    

    在 swift 中,您不能在运行时更改 let 或 var 类型

    【讨论】:

      【解决方案3】:

      更新您的代码并将 AnyObject 更改为 UIViewController:

      class func viewControllerWithName(name: String) -> UIViewController?
          {
              let storyboard = mainStoryboard()
              let viewController = storyboard.instantiateViewControllerWithIdentifier(name) as? UIViewController
              return viewController 
          }
      
      func setUpController {
              let viewController: UIViewController!
              if self.user() == "admin" {
                  viewController = self.viewControllerWithName("admin")!
              } else {
                  viewController = self.viewControllerWithName("user")! 
              }
              self.addChildViewController(viewController)
              viewController.view.frame = container.frame
              self.view.addSubview(viewController.view)
              viewController.didMoveToParentViewController(self)
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-07
        • 2014-11-06
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 2016-02-06
        相关资源
        最近更新 更多