在iOS项目中,我有一个主ViewController和第二个ViewController,第二个ViewController显示为一个带有来自导航栏按钮的segue的Popover。在那个popover中有一个带有以下代码的按钮:
class Pop: UIViewController {
@IBAction func colorOnePressed(_ sender: Any) {
let vc = ViewController()
vc. zoomIn()
}
}
这是第一个视图控制器的方法:
class ViewController: UIViewController {
@IBOutlet weak var mainTextField: UITextView!
...
func zoomIn() {
mainTextField.font = UIFont(name: "Helvetica Neue", size: CGFloat(18.00))
}
}
不幸的是(显然对你们中的许多人来说)我得到了一个致命的错误:"在解开一个Optional值"时意外地发现了nil。
答案 0 :(得分:2)
您正尝试从ViewController的新实例调用该方法。相反,您需要在Popover VC中声明delegate属性,并将prepareForSegue:sender:
方法中的原始父VC作为Popover VC的委托传递。
答案 1 :(得分:1)
通过Aleksandr Medvedev关注此问题的答案,并通过TheAppMentor将此答案转到另一个问题,我通过使用委托设计模式实现了这一点。如果它对某人有用,我会在代码下面发布。
注意:我经常看到你使用UIPopoverPresentationControllerDelegate协议,但我已经创建了一个自定义协议(ZoomProtocol),所以我可以包含我的方法(zoomOut())。
在主视图控制器中:
import UIKit
// declare a protocol, that lists variables and methods
// the delegate is expected to respond to
protocol ZoomProtocol {
func zoomOut()
}
// set this view controller as the delegate
class ViewController: UIViewController, ZoomProtocol {
...
// make your presenting view controller conform to the protocol
zoomOut() {
// do something
}
// pass the this view controller as a delegate for the Popover view controller
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let pop = segue.destination as? PopViewController {
pop.delegate = self
}
}
}
在弹出窗口控制器中:
import UIKit
class PopViewController: UIViewController {
var delegate : ZoomProtocol?
...
// when you want to, call the method on the presenting view controller
@IBAction func zoomOutButtonPressed(_ sender: Any) {
delegate?.zoomOut()
}
}
答案 2 :(得分:0)
在父视图控制器中,覆盖准备设置弹出窗口:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "yourPopoverIdentifier" {
let popoverVC = segue.destination
popoverVC.modalPresentationStyle = UIModalPresentationStyle.popover
popoverVC.popoverPresentationController!.delegate = self
}
}
然后在孩子的视图控制器中,你可以简单地调用presentsViewController来访问父母的功能。在这种情况下,父级是默认的View Controller,ViewController。
@IBAction func buttonClick(_ sender: Any) {
let parentVC = self.presentingViewController as! ViewController
parentVC.functionOnParent()
}