在我的应用程序中,我有一个可以从两个不同viewControllers
调用的模态视图。让我们称它们为MainViewController
和DetailViewController
.此模态视图也嵌入在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 9
和Swift 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
中,还是在模态视图上填充另一个变量。