Swift 如果用户单击“后退”按钮,则快速添加操作

Swift 如果用户单击“后退”按钮,则快速添加操作,swift,stack,warnings,Swift,Stack,Warnings,我使用以下代码成功检测到用户是否单击了后退按钮: override func viewWillDisappear(animated: Bool) { let viewControllers: NSArray = self.navigationController?.viewControllers as! NSArray if viewControllers.indexOfObject(self) == NSNotFound { self.navigationCon

我使用以下代码成功检测到用户是否单击了后退按钮:

override func viewWillDisappear(animated: Bool) {
    let viewControllers: NSArray = self.navigationController?.viewControllers as! NSArray
    if viewControllers.indexOfObject(self) == NSNotFound {
        self.navigationController?.setNavigationBarHidden(true, animated: true)
    }

    super.viewWillDisappear(animated)
}
let viewControllers: [UIViewController] = self.navigationController?.viewControllers as! [UIViewController]
override func viewWillDisappear(animated: Bool) {
    if let viewControllers = navigationController?.viewControllers as? [UIViewController] {
        if let index = find(viewControllers, self) {
            navigationController?.setNavigationBarHidden(true, animated: true)
        }
    }

    viewWillDisappear(animated)
}
但我得到以下警告:

从“[AnyObject]”强制转换到不相关类型“NSArray”总是失败


是否有一种“更整洁”的方法来实现这一点?

基本上,问题是您试图强制转换为objective-c数组类型NSArray。Swift使用数组而不是NSArray/NSMutableArray。如果要在Swift中强制转换数组,必须指定数组中对象的类型。因此,以下代码:

override func viewWillDisappear(animated: Bool) {
    let viewControllers: NSArray = self.navigationController?.viewControllers as! NSArray
    if viewControllers.indexOfObject(self) == NSNotFound {
        self.navigationController?.setNavigationBarHidden(true, animated: true)
    }

    super.viewWillDisappear(animated)
}
let viewControllers: [UIViewController] = self.navigationController?.viewControllers as! [UIViewController]
override func viewWillDisappear(animated: Bool) {
    if let viewControllers = navigationController?.viewControllers as? [UIViewController] {
        if let index = find(viewControllers, self) {
            navigationController?.setNavigationBarHidden(true, animated: true)
        }
    }

    viewWillDisappear(animated)
}
将其强制转换为UIViewController的数组(Swift数组)。实际上,你可以把它写得更短,只需要这样:

let viewControllers = self.navigationController?.viewControllers as! [UIViewController]

您应该使用Swift数组-
[UIViewController]

固定问题:

override func viewWillDisappear(animated: Bool) {
        let viewControllers: [UIViewController] = self.navigationController?.viewControllers as [UIViewController]

        if let index = find(viewControllers, self)
        {
            //your object exists in that is at index

        }
        else
        {
           //your object is not in the navigation controller
           self.navigationController?.setNavigationBarHidden(true, animated: true)
        }

    super.viewWillDisappear(animated)
}
if find(viewControllers, self) == nil
{
    //your object isnt in the viewControllers array

}
如果让else,则可以使用:

override func viewWillDisappear(animated: Bool) {
        let viewControllers: [UIViewController] = self.navigationController?.viewControllers as [UIViewController]

        if let index = find(viewControllers, self)
        {
            //your object exists in that is at index

        }
        else
        {
           //your object is not in the navigation controller
           self.navigationController?.setNavigationBarHidden(true, animated: true)
        }

    super.viewWillDisappear(animated)
}
if find(viewControllers, self) == nil
{
    //your object isnt in the viewControllers array

}

请尝试以下代码:

override func viewWillDisappear(animated: Bool) {
    let viewControllers: NSArray = self.navigationController?.viewControllers as! NSArray
    if viewControllers.indexOfObject(self) == NSNotFound {
        self.navigationController?.setNavigationBarHidden(true, animated: true)
    }

    super.viewWillDisappear(animated)
}
let viewControllers: [UIViewController] = self.navigationController?.viewControllers as! [UIViewController]
override func viewWillDisappear(animated: Bool) {
    if let viewControllers = navigationController?.viewControllers as? [UIViewController] {
        if let index = find(viewControllers, self) {
            navigationController?.setNavigationBarHidden(true, animated: true)
        }
    }

    viewWillDisappear(animated)
}

在我看来,使用find()更符合Swift。如果找到,find()将返回元素的索引,否则返回nil。

I get
无法使用类型为“([AnyObject]?,…”的参数列表调用“find”。
I get
[UIViewController]没有名为“indexOfObject”的成员
这将不起作用。在Swift中,navigationController.ViewController将始终包含self。有一种比查看视图中的视图控制器更简单的方法
视图将消失
。调用
IsbeingDismised
内部
视图将消失