Swift:尝试更改从另一个swift文件调用的函数中的对象属性时,意外地发现“ nil”

时间:2018-11-15 12:09:51

标签: ios swift xcode

因此,在我的情节提要中,我有一个带有容器视图的UIViewController,其中嵌入了一个UITableViewController。就是这样的样子:https://i.imgur.com/0yBWtbG.png

但是现在我想设置由相机拍摄的照片,但是问题是:UIImageView在UITableViewController内部,而打开相机的按钮在UIViewController内部(您可以在上传的屏幕快照中看到相机图标)。

所以,我尝试了这个:

UIViewController的代码:

@IBAction func openCamera(_ sender: UIButton) {
    let image = UIImagePickerController()
    image.delegate = self

    image.sourceType = UIImagePickerController.SourceType.camera
    image.allowsEditing = false

    self.present(image, animated: true)
    {

    }
}
 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
{

    let info = convertFromUIImagePickerControllerInfoKeyDictionary(info)

    if let image = info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.originalImage)] as? UIImage
    {
        takenPhoto = image //takenPhoto is a global variable
        let CIV = CreateIssue()
        CIV.showImage()
    }
    else
    {

    }

    self.dismiss(animated: true, completion: nil)
}
fileprivate func convertFromUIImagePickerControllerInfoKeyDictionary(_ input: [UIImagePickerController.InfoKey: Any]) -> [String: Any] {
    return Dictionary(uniqueKeysWithValues: input.map {key, value in (key.rawValue, value)})
}


fileprivate func convertFromUIImagePickerControllerInfoKey(_ input: UIImagePickerController.InfoKey) -> String {
    return input.rawValue
}
}

UITableViewController的代码:

public func showPicture() {
  ivPicture.isHidden = false //here I get Unexpectedly found nil after taking a picture from the camera
  ivPicture.image = takenPhoto
}

但是,如果我尝试在ViewDidLoad中调用该函数,则效果很好:

override func viewDidLoad() {
  showPicture()
}

最近几天,我发布了一个类似的问题,但是我试图通过segues从另一个swift文件中更改变量,并被告知我使用prepare for segue方法,但是在这种情况下,我只是在调用一个函数另一个swift文件和对象属于同一swift文件。我是否也需要使用“准备缝制”方法?还是我做错了什么?

提前谢谢

2 个答案:

答案 0 :(得分:0)

您创建子vc的实例

let CIV = CreateIssue()
CIV.showImage()

该脚本未从情节提要中加载,因此所有出口均为nil,因此请替换此

let CIV = CreateIssue()

使用

let CIV =  self.children[0] as! CreateIssue

答案 1 :(得分:0)

要记住的一件事-UIView,Tabbleview及其单元都是不同的类/对象。即使它们出现在同一用户界面上,它们之间也没有任何自然的关系。表格视图单元格中的按钮是该单元格类的成员,而不是表或包含该表的视图。

一个问题-您是否需要在Tableview单元格中具有此按钮,或者它可以仅作为UIView的一部分存在?从您的示例尚不清楚,是否需要重复这些单元格/是否需要多个单元格实例(通常是UITableViewCell用例),或者是否只需要单个单元格。