gpt4 book ai didi

ios - 尝试从外部模态视图 Controller 调用 View Controller 函数时出现 fatal error

转载 作者:行者123 更新时间:2023-11-28 10:59:09 24 4
gpt4 key购买 nike

总结

我目前面临一个在 Objective-C 中一直运行良好的问题,但我似乎无法让它在 Swift(特别是 v3)中运行。这都是使用 Storyboard构建的。我有两个独立的 View Controller :

  1. ViewController: WKWebView 和 UIButtonItems
  2. SideMenuTableView:UITableView 和 UIButtons

目前,SideMenu 以模态方式弹出到 ViewController 之上,并通过 UIButtons 列出一组操作。我想我会离开最简单的例子,只是为了把这个想法记下来。在此示例中,我试图完成的是从 UIButton tap (SideMenuTableView) 重新加载 WKWebView (ViewController)。如果事情仍然不清楚,下面是我试图得到的更清晰的图片:

Screenshots.png

目前,我可以使用简单的 Storyboard segue (Kind: Present Modally) 调用 SideMenu。此外,我可以忽略在简单的 close() 函数中实现的 SideMenu。但是,当尝试调用刷新函数时,我收到以下错误消息:

fatal error: unexpectedly found nil while unwrapping an Optional value

代码

import UIKit
import WebKit

class ViewController: UIViewController, UINavigationControllerDelegate, WKNavigationDelegate {

var webView: WKWebView!

override func viewDidLoad() {
super.viewDidLoad()

let webURL = URL(string: "https://google.ca")
let webRequest = URLRequest(url: webURL!)
webView.load(webRequest)

func refresh() {
webView.reload()
}
}



import Foundation

class SideMenuTableView: UITableViewController {

@IBAction fileprivate func close() {
self.dismiss(animated: true, completion: nil)
}

@IBAction func refresh(sender: AnyObject!) {
ViewController().refresh()
close()
}
}

编辑:更新了转场代码。

// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
if let vc = segue.destination as? SideMenuTableView {
vc.delegate = self
}
}
}

最佳答案

您正在使用 ViewController().refresh() 初始化一个新的 UIViewController。委托(delegate)模式是一种更好的方式来完成你正在尝试的事情:

创建协议(protocol):

protocol MainViewControllerDelegate /* Can be called whatever you like */ {
func refresh()
}

并使您的 ViewController 符合它。

在您的 SideMenuTableView 中创建一个变量来保存对其委托(delegate)的引用。

weak var delegate: MainViewControllerDelegate? 

ViewController 的 prepareForSegue() 函数中。检查目标转场是否是您的 SideMenuTableView:

if let vc = destination.vc as? SideMenuTableView {
vc.delegate = self
}

现在在您的@IBAction 按钮中点击SideMenuTableView 调用委托(delegate)方法。

@IBAction func refresh(sender: AnyObject!) {
delegate?.refresh()
close()
}

因为你的 ViewController 符合这个协议(protocol)(它必须在它的类中有一个刷新函数),刷新函数将被执行。

关于ios - 尝试从外部模态视图 Controller 调用 View Controller 函数时出现 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41686489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com