swift - 从 Swift 4 中的 Popover Viewcontroller 实时更新 UIViewController

标签 swift debugging uiviewcontroller scenekit switchcontrol

现在我正在试验 SceneKit DebugOptions。 我正在尝试使用 Popover ViewController 中的开关 Controller 实时更新/显示 Scenekits 调试选项。

我尝试了很多东西,比如用户默认、委托(delegate)和协议(protocol),但我仍然无法实时看到结果,每次我都必须终止应用程序并重新启动它才能看到结果。

所以,如果有人能回答我的问题,我将不胜感激:D

enter image description here

我添加到 MainVC 的扩展

extension ViewController: UIPopoverPresentationControllerDelegate, DebugOptions {

func wireFrameEnabled(enabled: Bool) {
    if enabled == true {
        print(enabled)
    }
}

func showCameraEnabled(enabled: Bool) {

}

func showAllDebugOptions(enabled: Bool) {

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let popoverController = segue.destination.popoverPresentationController, let button = sender as? UIButton else { return }
    popoverController.delegate = self
    popoverController.sourceRect = button.bounds
    let debugMenuVC = popoverController.presentedViewController as! DebugMenuVC
    debugMenuVC.delegate? = self
}

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
    return .none
}

}

协议(protocol)

protocol DebugOptions {
func wireFrameEnabled(enabled: Bool)
func showCameraEnabled(enabled: Bool)
func showAllDebugOptions(enabled: Bool)

}

调试菜单VC

class DebugMenuVC: UIViewController {
@IBOutlet weak var bgView: UIView!
@IBOutlet weak var showWireFrameSwitch: UISwitch!
@IBOutlet weak var showCameraSwitch: UISwitch!
@IBOutlet weak var showAllSwitch: UISwitch!

var delegate: DebugOptions?

override func viewWillLayoutSubviews() {
    preferredContentSize = CGSize(width: 150, height: 300)
}

override func viewDidLoad() {
    super.viewDidLoad()
    buttonCheck()
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)


}

@IBAction func aSwitchBtnWasPressed( _ sender: UISwitch ) {
    if (sender.tag == 0) && (sender.isOn == true) {
        userDefaults.set(true, forKey: SHOW_WIRE_FRAME)
        delegate?.wireFrameEnabled(enabled: true)


    } else if (sender.tag == 0) && (sender.isOn == false) {
        userDefaults.set(false, forKey: SHOW_WIRE_FRAME)
        delegate?.wireFrameEnabled(enabled: false)

    }

}

func buttonCheck() {
    if userDefaults.bool(forKey: SHOW_WIRE_FRAME) == true{
        showWireFrameSwitch.isOn = true
    } else {
        showWireFrameSwitch.isOn = false
    }

}

}

最佳答案

在 debubMenuVC.delegate 中不应是可选的。这就是委托(delegate)方法总是失败的原因:D

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let popoverController = segue.destination.popoverPresentationController, let button = sender as? UIButton else { return }
    popoverController.delegate = self
    popoverController.sourceRect = button.bounds
    let debugMenuVC = popoverController.presentedViewController as! DebugMenuVC
    debugMenuVC.delegate? = self
}

关于swift - 从 Swift 4 中的 Popover Viewcontroller 实时更新 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49576431/

相关文章:

ios - Realm 添加(_,更新: true) removes existing relationships

swift - Facebook 共享对话框失败 - 操作无法快速完成

iphone - 我如何创建一个循环来检查每次迭代时是否有新的 IBAction 输入?

ios - UIViewController 将浮点值传递给 UIView 方法

ios - 使用 Storyboard时 UIView 委托(delegate)在什么阶段设置

swift - 将 url 从标记传递到 Controller

swift - 将 Range 和 StrideTo 转换为 Sequence 时出现特殊错误

JavaScript 不报告错误

c# - 由于在输出窗口中输出类型名称导致调试缓慢

visual-studio-2008 - 使用VS2008完成调试Web应用程序后,为什么Internet Explorer关闭?