将 UIImageView 从主视图移动到另一个
moving the UIImageView from the main view to another
我的代码可以很好地从图库中选择图片并将其显示在同一视图中,
现在遇到的问题是,当单击 "next" 按钮时,将选择的 UIImageView 转移到下一个 activity
这是打开图库的代码
@IBAction func gallery(sender: AnyObject) {
if UIImagePickerController.availableMediaTypesForSourceType(.PhotoLibrary) != nil {
picker.allowsEditing = false
picker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
presentViewController(picker, animated: true, completion: nil)
}
}
这是在同一视图中显示图像的代码
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
var chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
imageChosen.contentMode = .ScaleAspectFit
imageChosen.image = chosenImage
dismissViewControllerAnimated(true, completion: nil)
}
现在,在 UIImageView 保存在 imageChosen 之后,这里是用于将该图像传递到下一个视图的代码
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var pass:postView = segue.destinationViewController as! postView
if(segue.identifier == "next"){
pass.imgv.image = imageChosen.image
}
}
导致程序崩溃的这行代码
pass.imgv.image = imageChosen.image
第二个view中的imgv是这样声明的
@IBOutlet weak var imgv: UIImageView!
我哪里做错了,请指导我
您无法在第二个视图控制器中直接访问 UIImageView
。而是在第二个视图控制器中创建变量 UIImage
并将您选择的 UIImage
分配给它。稍后在第二个视图控制器的 viewdidload
中设置 UIImageView
.
第一次观看
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let pass:postView = segue.destinationViewController as! postView
if(segue.identifier == "next"){
pass.tempImage = imageChosen.image
}
}
第二个视图
@IBOutlet weak var imgv: UIImageView!
var tempImage:UIImage!
override func viewDidLoad() {
super.viewDidLoad()
self.imgv.image=tempImage
}
您正在为图像视图使用弱引用并试图在其他控制器中获取它。做如下 .
@IBOutlet 强变量 imgv: UIImageView
其次,您获取视图控制器的方式错误...尝试如下
if segue.identifier == "ShowCounterSegue"
{
if let destinationVC = segue.destinationViewController as? OtherViewController{
destinationVC.numberToDisplay = counter
}
}
在 PostView 中,只需创建变量 var img: UIImage!
将这一行 pass.imgv.image = imageChosen.image
替换为 pass.img = imageChosen.image
在PostView的viewDidLoad()中,添加这一行,imgv.image = image
我们不能从firstView设置secondView的IBOutlets
属性,因为ViewController的IBOutlets会在viewDidLoad()
[=38=执行后获取内存]
因此您必须创建适当的数据变量以将数据传递给 IBOutlet。
这是示例代码。
class FirstViewController: UIViewController {
@IBOutlet weak var imageViewInput: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
//check the condition for your segue.identifier, if any
var destination : NewViewContrller! = segue.destinationViewController as NewViewContrller ;
if let image = imageViewInput?.image {
destination.outputImage = image;
}
}
}
class NewViewContrller: UIViewController {
@IBOutlet weak var outputImageView: UIImageView!
var outputImage: UIImage!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
if let image = outputImage {
outputImageView.image = image;
}
}
}
您不能在尚未呈现的视图中设置数据。因此,将图像传递给第二个视图,并在第二个视图的 viewDidLoad
中将该图像设置为 ImageView
override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!) {
if segue.identifier == "next" {
var pass:second = segue.destinationViewController as! second
pass.currentImage=myImageView.image;
}
}
//第二个视图
class second: UIViewController {
@IBOutlet weak var tempImgView: UIImageView!
var currentImage:UIImage!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
if((currentImage) != nil){
tempImgView.image=currentImage;
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
我的代码可以很好地从图库中选择图片并将其显示在同一视图中, 现在遇到的问题是,当单击 "next" 按钮时,将选择的 UIImageView 转移到下一个 activity
这是打开图库的代码
@IBAction func gallery(sender: AnyObject) {
if UIImagePickerController.availableMediaTypesForSourceType(.PhotoLibrary) != nil {
picker.allowsEditing = false
picker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
presentViewController(picker, animated: true, completion: nil)
}
}
这是在同一视图中显示图像的代码
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
var chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
imageChosen.contentMode = .ScaleAspectFit
imageChosen.image = chosenImage
dismissViewControllerAnimated(true, completion: nil)
}
现在,在 UIImageView 保存在 imageChosen 之后,这里是用于将该图像传递到下一个视图的代码
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var pass:postView = segue.destinationViewController as! postView
if(segue.identifier == "next"){
pass.imgv.image = imageChosen.image
}
}
导致程序崩溃的这行代码
pass.imgv.image = imageChosen.image
第二个view中的imgv是这样声明的
@IBOutlet weak var imgv: UIImageView!
我哪里做错了,请指导我
您无法在第二个视图控制器中直接访问 UIImageView
。而是在第二个视图控制器中创建变量 UIImage
并将您选择的 UIImage
分配给它。稍后在第二个视图控制器的 viewdidload
中设置 UIImageView
.
第一次观看
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let pass:postView = segue.destinationViewController as! postView
if(segue.identifier == "next"){
pass.tempImage = imageChosen.image
}
}
第二个视图
@IBOutlet weak var imgv: UIImageView!
var tempImage:UIImage!
override func viewDidLoad() {
super.viewDidLoad()
self.imgv.image=tempImage
}
您正在为图像视图使用弱引用并试图在其他控制器中获取它。做如下 .
@IBOutlet 强变量 imgv: UIImageView
其次,您获取视图控制器的方式错误...尝试如下
if segue.identifier == "ShowCounterSegue"
{
if let destinationVC = segue.destinationViewController as? OtherViewController{
destinationVC.numberToDisplay = counter
}
}
在 PostView 中,只需创建变量
var img: UIImage!
将这一行
pass.imgv.image = imageChosen.image
替换为pass.img = imageChosen.image
在PostView的viewDidLoad()中,添加这一行,
imgv.image = image
我们不能从firstView设置secondView的IBOutlets
属性,因为ViewController的IBOutlets会在viewDidLoad()
[=38=执行后获取内存]
因此您必须创建适当的数据变量以将数据传递给 IBOutlet。
这是示例代码。
class FirstViewController: UIViewController {
@IBOutlet weak var imageViewInput: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
//check the condition for your segue.identifier, if any
var destination : NewViewContrller! = segue.destinationViewController as NewViewContrller ;
if let image = imageViewInput?.image {
destination.outputImage = image;
}
}
}
class NewViewContrller: UIViewController {
@IBOutlet weak var outputImageView: UIImageView!
var outputImage: UIImage!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
if let image = outputImage {
outputImageView.image = image;
}
}
}
您不能在尚未呈现的视图中设置数据。因此,将图像传递给第二个视图,并在第二个视图的 viewDidLoad
中将该图像设置为 ImageView override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!) {
if segue.identifier == "next" {
var pass:second = segue.destinationViewController as! second
pass.currentImage=myImageView.image;
}
}
//第二个视图
class second: UIViewController {
@IBOutlet weak var tempImgView: UIImageView!
var currentImage:UIImage!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
if((currentImage) != nil){
tempImgView.image=currentImage;
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}