- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
segue 和 instantiateViewController 有什么区别?
我一直在尝试弄清楚如何使用 segues 将图像从一个 View Controller 发送到另一个 View Controller 和 2 个答案(Passing Image to another View Controller (Swift) 和 How do I segue an image to another ViewController and display it within an ImageView?)都说要使用 segues 但在尝试使用 segues 时我遇到了一些问题,例如照片库关闭后第二个 View Controller 未显示或图像未显示。
继续示例
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.destination is XferImageViewController {
print("Test: ", pickedImage.image)
let xferVC = segue.destination as? XferImageViewController
xferVC?.storedImage = pickedImage.image
}
print("WHAT IS GOING ON")
// if segue.destination is XferImageViewController {
// let xferVC = segue.destination as? XferImageViewController
// print(pickedImage.image)
// //xferVC?.storedImage = pickedImage.image
// xferVC?.storedImage = pickedImageVar
// }
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
pickedImage.image = image
} else {
print("Something went wrong")
}
let image = info[UIImagePickerControllerOriginalImage] as? UIImage
dismiss(animated:true, completion: nil)
performSegue(withIdentifier: "xferImage", sender: self)
}
实例化 View Controller 示例
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
pickedImage.image = image
} else {
print("Something went wrong")
}
let image = info[UIImagePickerControllerOriginalImage] as? UIImage
dismiss(animated:true, completion: nil)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "xferImage") as! XferImageViewController
controller.storedImage = image
present(controller, animated: true, completion: nil)
}
所以在使用 InstantiateViewController 而不是 segue 之后,我得到了我想要的结果。两者有什么区别? (我确定那个 segue 标识符,尝试过 segue.destination 和 Storyboard ID 但仍然没有得到我需要的东西)有可能我不知道如何在照片库取消调用后使用 segue 但仍然想知道区别。
最佳答案
问题在于,当您启动转场时,转场对 View Controller 层次结构的状态有特殊要求。你必须推迟 performSegue(withIdentifier:sender:)
直到 dismiss
完成,即将它放入 dismiss
的完成句柄中:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
pickedImage.image = image
} else {
print("Something went wrong")
}
dismiss(animated: true) {
self.performSegue(withIdentifier: "xferImage", sender: self)
}
}
以上对我来说效果很好。
顺便说一句,你可以简化你的prepare(for:sender:)
实现:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let xferVC = segue.destination as? XferImageViewController {
xferVC.storedImage = pickedImage.image
}
}
两个有些不相关的观察结果:
如果 pickedImage
是一个 ImageView ,我建议将它重命名(并更新 Storyboard中的导出)为 pickedImageView
。避免混淆 UIImage
属性和 UIImageView
导出是一个很好的约定。
这是一个更小的观察,但在 Model-View-Controller 中设计时,您通常不想依赖 UIKit 对象,如 UIImageView
来保存模型对象,即所选图像。它暗示了“ View ”对象和“模型”对象之间的概念混淆。另外,如果当前 View Controller 没有 UIImageView
怎么办?
我个人建议将所选图像存储在单独的 UIImage?
属性中:
private var selectedImage: UIImage?
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
selectedImage = image
// if you also want to update a `UIImageView` in the current
// view controller, fine, do that, but it shouldn't be confused
// with the "model".
//
// pickedImageView.image = image
} else {
print("Something went wrong")
}
dismiss(animated: true) {
self.performSegue(withIdentifier: "xferImage", sender: self)
}
}
和:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let xferVC = segue.destination as? XferImageViewController {
xferVC.storedImage = selectedImage
}
}
关于ios - Segue 和使用 instantiateViewController 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48219534/
为什么我不能使用类似的方法创建 View Controller 对象resultVC = ResultViewController() 而不是下面的方式。 let storyboard
我有这段代码,但是我没有在第二个 View Controller 中接收数据...我在这里做错了什么? let storyboard = UIStoryboard(name: "Pos
我是ios开发新手,所以请原谅我的无知。我注意到,当我使用 UICollectionViewCell 时,我可以调用 dequeueReusableCell 来实例化或调用现有单元格。我想知道 Vie
我有一个经典的主从逻辑,并尝试在点击事件中使用 InstantiateViewController 创建细节 UIViewController 的实例。 这是我的代码, MasterViewContr
我的自定义导航栏中有一个菜单表格 View 。如果我单击一个单元格,它应该将我带到另一个 View Controller 。但是当我点击它时我的应用程序崩溃了。 func tableView(_ ta
我正在尝试做的事情: 我正在尝试按下导航栏右上角的 + 按钮,将应用推送到新 View (使用 navigationController.pushViewController),从新 View 获取一
swift 3.0 根据我在这里的发现,UIStoryboard 总是在函数 instantiateViewController(withIdentifier:) 中返回非可选实例。 open cla
segue 和 instantiateViewController 有什么区别? 我一直在尝试弄清楚如何使用 segues 将图像从一个 View Controller 发送到另一个 View Con
我正在使用 storyboard.instantiateViewController 来启动 TableViewController,但是当我尝试向下转换它时,出现错误: Could not cast
基本上我有五个 View Controller ,第一个是初始 View Controller 有两个文本字段,用户可以在其中输入值。之后,根据用户从两个选择器 View 中的选择,他/她将在点击“下
我已经创建了第二个带有 Storyboard的 View Controller 。我已经指定了一个 StoryBoard ID。我为这个 Controller 创建了一个类,并在 Storyboard
为什么我们需要在使用 UIStoryboard 的 instantiateViewController(withIdentifier:) 方法实例化 View Controller 之后使用关键字进行
我正在尝试为我的项目中的导航获取更多的通用解决方案,并且我一直想知道 segues 与手动实例化的 VC。 我在 atm 中的做法是,我在 Storyboard 中拥有从一个 View 到另一组 Vi
我希望有人能帮助我解决我遇到的这个问题。 我正在尝试将UIViewController数组添加到UIPageViewController。但是,每当我尝试通过方法 instantiateViewCon
我试图理解两个 View Controller 之间的通信。 在没有 segue 的情况下传递数据时,我看到了两种创建目标 Controller 实例的方法。 第一个是storyboard?.inst
从sb.instantiateViewController(withIdentifier:)创建一个vc10,不能使用它的属性甚至将它的类型转换为ViewController10 。 下面是我的代码:
当从代码启动 UIViewController 时,它需要运行的数据作为参数传递到 init 方法中并保存在非可选属性中,因此当 ViewDidLoad() 是您可以对数据和 View 执行任何您需要
我使用的是我的物理设备,而不是模拟器。 我正在使用 storyboard.instantiateViewController(withIdentifier:) 实例化一个 vc 并以模态方式呈现它。我
我正在处理 Xamarin IOS/monotouch 项目。一段时间以来我一直被这个错误所困。这些是代码行 var prfc = this.Storyboard.InstantiateViewCon
我收到这个错误 - InstantiateViewController(identifier:creator:)' is only available in iOS 13.0 or newer 为了解
我是一名优秀的程序员,十分优秀!