gpt4 book ai didi

ios - 3D Touch、peek 和 pop 崩溃并出现 fatal error : unexpectedly found nil while unwrapping an Optional value

转载 作者:行者123 更新时间:2023-11-28 15:55:13 25 4
gpt4 key购买 nike

编辑:

我有一个包含 2 个单元格的 tableView,我正在尝试使用 3DTouch 实现 Peek & Pop。

  • 这 2 个单元格通过 modalView 重定向到 2 个不同的 View Controller
  • 当用户点击第一个 View Controller 上的单元格时,我将数据发送到第二个 View Controller
  • 当用户在第二个 View Controller 中选择一个单元格时,模态视图被关闭,数据被发送回第一个 View Controller

我设法使每个单独的单元格都可以查看并与其他单元格相比将其提升,但是一旦我想弹出它并重定向到其他 View Controller ,我的应用程序就会崩溃

这是我的 1stVC 代码:我在 viewDidLoad 中注册预览:

if( traitCollection.forceTouchCapability == .available){
registerForPreviewing(with: self, sourceView: self.tableView)
}

然后我通过实现 2 个方法来遵守协议(protocol) UIViewControllerPreviewingDelegate:

func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {

guard let indexPath = tableView?.indexPathForRow(at: location) else { return nil }
previewingContext.sourceRect = tableTest.rectForRow(at: indexPath)

let sb = UIStoryboard(name: "Main", bundle: nil)
guard let detailVC = sb.instantiateViewController(withIdentifier: "DestinationViewController") as? DestinationViewController else { return nil }

return detailVC

}

func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit :UIViewController) {
show(viewControllerToCommit, sender: self)
}

func tableView(...didSelectRowAt) 中:

if (indexPath.row == 0) {
guard let controller = storyboard?.instantiateViewController(withIdentifier: "DestinationViewController") as? DestinationViewController else { return }
controller.titlePassed = cell?.textLabel?.text
controller.variableIn2ndVC = theVariabletoSend
controller.anotherVarIn2nd = theVariabletoSend2
...
...
navigationController?.present(controller, animated: true, completion: nil)
}

我的第二个 View Controller 的代码:

var titlePassed: String?
var variableIn2ndVC: String?
var anotherVarIn2nd: String?
...
...
@IBAction func cancelButton(_ sender: AnyObject) {
self.dismiss(animated: true, completion: nil)
}

...
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 && titlePassed == "FROM" {
return 1
} else {
return Stations.count
}
}

public func numberOfSections(in tableView: UITableView) -> Int {
if titlePassed == "FROM" {
return 2
} else {
return 1
}
}

didSelectRowAt 中,我有一些回调将一些数据发送到第一个 Controller

当用户点击单元格时,我获取 textLabel 中的文本并使用回调将其发送给第一个 VC

public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath.section == 1 && titlePassed == "FROM" {
let stringToSendBack = cell?.textLabel!.text

// put str in callBack in order to access it in the 1st VC
callBack?(str!)
dismiss(animated: true, completion: nil)
}

最佳答案

我想你已经解决了,但我只是总结一下你已经得出的结论,仅供记录。

让我们暂时忽略 peek 和 pop。然后,当您通常响应用户在单元格上的点击从主 Controller 转到细节 Controller (DestinationViewController) 时,您可以这样做(代码缩写):

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard let controller = storyboard?.instantiateViewController(withIdentifier: "DestinationViewController") as? DestinationViewController else { return }
controller.titlePassed = cell?.textLabel?.text
controller.variableIn2ndVC = theVariabletoSend
controller.anotherVarIn2nd = theVariabletoSend2
navigationController?.present(controller, animated: true, completion: nil)
}

到目前为止,还不错。现在让我们来看看图片。这是一个完全不同的情况。您可以像这样创建导航 Controller (同样是缩写):

func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
let sb = UIStoryboard(name: "Main", bundle: nil)
guard let detailVC = sb.instantiateViewController(withIdentifier: "DestinationViewController") as? DestinationViewController else { return nil }
return detailVC
}

看出区别了吗?

  • 在第一种情况下,您要创建 DestinationViewController 并配置它

  • 在第二种情况下,您创建了 DestinationViewController 但完全忽略了配置它。因此,它是未配置的,它的所有属性都是 nil

该事实稍后会以某种方式 catch 您,并导致崩溃。

如果您想先查看然后弹出,也就是说,在 3D 触摸后呈现 DestinationViewController,就像用户只是点击单元格时所做的那样,您必须做您希望做的所有事情如果用户只是点击了单元格就完成了。您可以在两个 UIViewControllerPreviewingDelegate 方法中的任何一个中执行此操作,但是如果您在第一个方法中没有这样做,则必须肯定在第二个方法中执行此操作,因为这是实际呈现 View 的方法 Controller 。否则,您将呈现一个损坏的 View Controller (如您所知)。

因此,总而言之,您的问题是由 tableView(_:didSelectRowAt) 和两个 UIViewControllerPreviewingDelegate 方法以某种方式交织在一起的假设引起的。他们不是。这是两种完全不同的情况——用户点击,或者用户 3D 按下​​。您需要为它们中的每个创建和配置 View Controller 的完整实现。

关于ios - 3D Touch、peek 和 pop 崩溃并出现 fatal error : unexpectedly found nil while unwrapping an Optional value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41865331/

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