如何通过Segue初始化需传入UIImage的第三方ViewController
用Segue给第三方ViewController传递UIImage的实操方案
嘿,这个需求我之前也碰到过,把代码模态跳转改成Segue传参其实很容易,一步步来就行:
第一步:在Storyboard里配置Segue
- 打开你的Storyboard,从当前ViewController(就是原来写代码跳转的那个VC)按住Control键拖线到
ThirdPartyViewController,在弹出的菜单里选Present Modally - 选中刚才创建的Segue,在右侧的Attributes Inspector里,给它设置一个唯一的标识符,比如
showThirdPartyEditor——这个标识符是后面代码里识别Segue用的,别写错了
第二步:实现Segue的传参逻辑
在当前ViewController的代码里,重写prepare(for:sender:)方法,这是Segue传参的关键入口:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 先判断是不是我们要触发的那个Segue guard segue.identifier == "showThirdPartyEditor", let thirdPartyVC = segue.destination as? ThirdPartyViewController else { return } // 直接把你的UIImage赋值给目标VC的对应属性 thirdPartyVC.image = myUIImage }
第三步:触发Segue
触发方式分两种情况:
- 如果是按钮触发:直接在Storyboard里把按钮和刚才的Segue连起来就行,不用写额外代码
- 如果是代码触发(比如某个逻辑判断后跳转):调用下面的方法就行
performSegue(withIdentifier: "showThirdPartyEditor", sender: nil)
注意事项:处理第三方VC的初始化限制
有些第三方ViewController可能只提供了带UIImage参数的初始化方法,没有实现Storyboard需要的init?(coder:),这时候会导致Storyboard初始化崩溃。你需要做个小调整:
如果第三方VC的代码是类似这样的(没有实现init?(coder:)):
class ThirdPartyViewController: UIViewController { let image: UIImage init(image: UIImage) { self.image = image super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
那你可以给它加个扩展,补充实现init?(coder:),同时把image改成可选的var:
extension ThirdPartyViewController { required init?(coder: NSCoder) { self.image = nil super.init(coder: coder) } } // 或者直接修改原类(如果有权限的话) class ThirdPartyViewController: UIViewController { var image: UIImage! // 改成隐式可选的变量 init(image: UIImage) { self.image = image super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { super.init(coder: coder) } }
这样Storyboard就能正常初始化VC,之后我们在prepare方法里给image赋值就没问题了。
内容的提问来源于stack exchange,提问作者Susan Ho
相关产品推荐
相关产品推荐

