0

我的代码在从图库中选择图片并将其显示在同一视图中时工作正常,现在卡住的是,当单击“下一步”按钮时,将选择的 UIImageView 转移到下一个活动

这是打开画廊的代码

@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!

我在这里做错了什么,请指导我

4

4 回答 4

2

您不能在尚未呈现的视图中设置数据。因此,将图像传递给第二个视图并将该图像设置为在 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()
    }

}
于 2015-05-20T07:29:22.130 回答
0

您不能UIImageView直接在第二个视图控制器中访问。而是在第二个视图控制器中创建变量UIImage并将您选择的分配UIImage给它。稍后在viewdidload第二个 View Controller 中设置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
}
于 2015-05-20T06:53:31.010 回答
0

您正在对图像视图使用弱引用并试图在其他控制器中获取它。执行以下操作。

@IBOutlet 强变量 imgv:UIImageView

其次,您获取视图控制器的方式错误...尝试如下

if segue.identifier == "ShowCounterSegue"
{
    if let destinationVC = segue.destinationViewController as? OtherViewController{
        destinationVC.numberToDisplay = counter
     }
 }
于 2015-05-20T07:07:57.723 回答
0
  1. 在 PostView 中,只需创建变量,如var img: UIImage!

  2. 将此行替换pass.imgv.image = imageChosen.imagepass.img = imageChosen.image

  3. 在 PostView 的 viewDidLoad() 中,添加这一行,imgv.image = image

我们不能IBOutlets从 firstView 设置 secondView 的属性,因为 ViewController 的 IBOutlets会在执行后获取内存viewDidLoad()

因此,您必须创建适当的数据变量来将数据传递给 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;
        }
    }
}
于 2015-05-20T07:08:32.230 回答