Swift 如果用户单击后退按钮则添加操作

Swift add action if user click back button

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

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)
}

但我收到以下警告:

Cast from '[AnyObject]?' to unrelated type 'NSArray' always fails

有"neater"方法吗?

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

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

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

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

而不是 NSArray,您应该使用 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 let else,您可以使用:

if find(viewControllers, self) == nil
{
    //your object isnt in the viewControllers array

}

试试下面的代码:

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() 将 return 元素的索引,否则为 nil。