如何在 Swift 2 中的 UINavigationController 周围获取 presentingViewCon



在我的应用程序中,我有一个可以从两个不同viewControllers调用的模态视图。让我们称它们为MainViewControllerDetailViewController.此模态视图也嵌入在UINavigationController 中。

我正在尝试根据哪个语句做一个 if/else 语句,ViewController触发了模态的出现。

我目前在模态ViewController中的代码是:

if presentingViewController is DetailTableViewController {
        //Update a current Distance
        if let managedObjectContext = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext {
            distance.name = name!
            distance.length = length!
            if let distanceImage = distanceImageView.image {
                distance.image = UIImagePNGRepresentation(distanceImage)
            }
            do {
                try managedObjectContext.save()
            } catch {
                print(error)
                return
            }
        }
    } else if presentingViewController is ViewController {
        //Save a new Distance
        if let managedObjectContext = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext {
            distance = NSEntityDescription.insertNewObjectForEntityForName("Distance", inManagedObjectContext: managedObjectContext) as! Distance
            distance.name = name!
            distance.length = length!
            if let distanceImage = distanceImageView.image {
                distance.image = UIImagePNGRepresentation(distanceImage)
            }
            do {
                try managedObjectContext.save()
            } catch {
                print(error)
                return
            }
        }
    }

看来presentingViewController的结果只是返回它嵌入的UINavigationController。有没有办法绕过该控制器并针对首先指向UINavigationController的观点进行测试?

我正在与iOS 9Swift 2一起工作.提前感谢任何帮助!

我想你呈现的是导航控制器。因此,可以测试导航控制器属性,即视图控制器,它将返回视图控制器数组,即MainViewController和DetailViewController。所以这里可以使用数组的过滤器操作来检查要测试的控制器。如下图所示。

let controllerList = (presentingViewController as? UINavigationController).viewControllers
let isControllerExsist = controllerList.filter{$0 is MainViewController}
if isControllerExsist.count>0
{
print("isMainViewCntroller")
}

如果它只在两个视图控制器之间,则可以将Bool传递给目标视图控制器。

在你的第一个VC中:

let destinationVC = DestinationVC() 
// or storyboard.instantiateViewControllerWithIdentifier("destinationVC") as! DestinationVC
destinationVC.isDetail = true
showViewController(destinationVC)
在您的

目的地VC,在您的-viewDidLoad

if isDetail {
    if let managedObjectContext = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext {
        distance.name = name!
        distance.length = length!
        if let distanceImage = distanceImageView.image {
            distance.image = UIImagePNGRepresentation(distanceImage)
        }
        do {
            try managedObjectContext.save()
        } catch {
            print(error)
            return
        }
    }
} else {
    //Save a new Distance
    if let managedObjectContext = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext {
        distance = NSEntityDescription.insertNewObjectForEntityForName("Distance", inManagedObjectContext: managedObjectContext) as! Distance
        distance.name = name!
        distance.length = length!
        if let distanceImage = distanceImageView.image {
            distance.image = UIImagePNGRepresentation(distanceImage)
        }
        do {
            try managedObjectContext.save()
        } catch {
            print(error)
            return
        }
    }
}

并在您的第二个VC中将布尔isDetail设置为假

我建议使用prepareForSegue并在您要访问的视图控制器上填充一个字段(使其成为弱变量! 如果您要选择的视图控制器是导航控制器(可能是导航控制器),则需要使用 var 创建自定义导航控制器,然后演示视图控制器将是此自定义类型,并将具有呈现视图控制器。 无论是在导航控制器的prepareForSegue中,还是在模态视图上填充另一个变量。

最新更新