【问题标题】:After picking image from UIImagePickerController() I try to show a UIAlertViewController() but it does not appear and locks the screen从 UIImagePickerController() 选择图像后,我尝试显示 UIAlertViewController() 但它没有出现并锁定屏幕
【发布时间】:2016-04-14 14:15:20
【问题描述】:

当用户从相册中选择一张图片后,系统会提示他们在 UIAlertController 中输入一个值。但是,控制器没有出现,屏幕变得无法点击。

这很奇怪,因为我在用户拍照时使用完全相同的代码。

当 self.getVal() 方法没有被调用时,代码可以工作。它按预期工作。使用日志记录,代码中没有错误。基本上它就像在当前 viewController 视图后面创建了 AlertController。屏幕变得完全不可点击,因为它没有被关闭。 (那是我的两便士)

见下面的代码:

@IBAction func addBarButtonPressed(sender: UIBarButtonItem) {

    var alert = UIAlertController(title: "Camera or Existing Photo", message: "Take a photo with the camera, or use an existing photo on your device.", preferredStyle: UIAlertControllerStyle.Alert)

    alert.addAction(UIAlertAction(title: "Camera", style: .Default, handler: { (action: UIAlertAction!) in
        self.presentCamera()
    }))

    alert.addAction(UIAlertAction(title: "Photos", style: .Default, handler: { (action: UIAlertAction!) in
        self.presentPhotos()
    }))

    presentViewController(alert, animated: true, completion: nil)

}

func presentPhotos(){
    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.SavedPhotosAlbum){

        let imagePickerController = UIImagePickerController()
        imagePickerController.delegate = self
        imagePickerController.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum
        imagePickerController.mediaTypes = [kUTTypeImage as String]
        imagePickerController.allowsEditing = false

        self.presentViewController(imagePickerController, animated: true, completion: nil)
    }
}

func presentCamera() {

    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera){

        let imagePickerController = UIImagePickerController()
        imagePickerController.delegate = self
        imagePickerController.sourceType = UIImagePickerControllerSourceType.Camera
        imagePickerController.mediaTypes = [kUTTypeImage as String]
        imagePickerController.allowsEditing = false

        self.presentViewController(imagePickerController, animated: true, completion: nil)
    }
}

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

    self.dismissViewControllerAnimated(true, completion: nil)

    if (picker.sourceType == UIImagePickerControllerSourceType.Camera || picker.sourceType == UIImagePickerControllerSourceType.SavedPhotosAlbum)
    {
        let myImageName = NSUUID().UUIDString
        let imagePath = ImageHelperService.fileInDocumentsDirectory(myImageName)

        if ImageHelperService.saveImage(image, path: imagePath) {

            // TODO:
            // Error: This right here, when removed it runs and dismisses and updates fine, just the alertcontroller never appears so can never be dismissed
            self.getVal()

            while(!self.alertViewDismissed) {
                NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeIntervalSinceNow: 0.1))

            }

            let success = DataOperationsService().SaveThingyMaBob(myImageName, value: self.alertViewValue!, bar: self.bar!)            
            if success {

                self.tableView.reloadData()
                self.doChart()

            } else {
                // TODO: Handle error
                debugPrint("Error, save failed")
            }

        } else {
            print("image save failed")
        }        
    }
}

func getVal() {
    self.alertViewDismissed = false

    let alert = UIAlertController(title: "Enter a value", message: "val", preferredStyle: .Alert)

    alert.addTextFieldWithConfigurationHandler({ (textField) -> Void in
        textField.text = ""
        textField.keyboardType = .DecimalPad
    })

    alert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: { (action) -> Void in
        print("Skip")
        self.alertViewValue = nil
        self.alertViewDismissed = true
    }))

    alert.addAction(UIAlertAction(title: "Submit", style: .Default , handler: { (action) -> Void in
        let textField = alert.textFields![0] as UITextField
        print("Text field: \(textField.text)")
        self.alertViewValue = UtilitiesService.textFieldUnwrapToDouble(textField.text!)
        self.alertViewDismissed = true

    }))

    self.presentViewController(alert, animated: true, completion: nil)
}

【问题讨论】:

  • 也许 self.dismissViewControllerAnimated(true, completion: nil) 是问题所在?您是否尝试过将代码放置在dismissViewControllerAnimated 的完成块中?
  • 我尝试从那里调用self.getVal(),但我会尝试整个代码块:)
  • @JeremyHerrero 有点进展,AlertController 现在显示,但它不是难以处理的,我无法关闭、提交甚至单击文本字段来输入文本。我会尝试进一步调试:)
  • 你可以试试self.performSelector(#selector(getVal), withObject: nil, afterDelay: 1)。如果延迟有帮助,那么那里可能会有线索。
  • 恐怕同样的结果,我只是想设置alert.becomeFirstResponder()

标签: ios swift


【解决方案1】:

我通过在选择图像之前拨打UIAlertController 解决了这个问题。

这不是一个确切的解决方法,但如果您可以灵活地选择首先显示的内容,则更多的是一种解决方法。

【讨论】:

    猜你喜欢
    • 2021-03-28
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2017-08-12
    相关资源
    最近更新 更多