将UIImageView从主视图移动到另一个
我的代码工作正常,从图库中select图片,并显示在同一视图中,现在陷入了什么,正在将选中的UIImageView转移到下一个活动,当“下一步”button被点击
这里是打开画廊的代码
@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) }
现在在保存在imageChosen中的UIImageView之后,下面是用于将该图像传递到下一个视图的代码
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
第二个视图中的imgv是这样声明的
@IBOutlet weak var imgv: UIImageView!
我在这里做错了什么,请指导我
您无法在尚未呈现的视图中设置数据。 因此,传递图像到第二个视图,并将图像设置为在secondView的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() } }
您正在使用图像视图的弱引用,并试图将其在其他控制器中。 做如下。
@IBOutlet强有力的imgv:UIImageView
其次,你的方式来获取视图控制器错误…尝试如下
if segue.identifier == "ShowCounterSegue" { if let destinationVC = segue.destinationViewController as? OtherViewController{ destinationVC.numberToDisplay = counter } }
您不能直接在第二个View Controller中访问UIImageView
。 而是在第二个视图控制器中创build可变的UIImage
,并将所选的UIImage
分配给它。 稍后在第二个View Controller的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 }
-
在PostView中,只需创build像
var img: UIImage!
这样的variablesvar img: UIImage!
-
用
pass.imgv.image = imageChosen.image
replace这一行pass.imgv.image = imageChosen.image
pass.img = imageChosen.image
-
在PostView的viewDidLoad()中,添加这一行
imgv.image = image
我们不能从firstView中设置secondView的IBOutlets
的属性,因为ViewController的IBOutlets 会在执行viewDidLoad()
之后得到内存。
所以你必须创build适当的数据variables来将数据传递给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; } } }