视图控制器值传递

View Controller value passing

我有一个 iOS 应用程序,它有 控制器 A,它使用采用 3D 触摸协议的表视图。每个单元格实际上都采用了3D触摸,因此选择单元格时,它将带来模态视图控制器(控制器B)。

控制器 B 基本上用于填充信息,然后将这些信息添加到 控制器 A 上的表视图中。

所以在应用 DRY 原则时,我重新使用 Controller B 来添加和编辑数据。

问题:

控制器 B 有一个 属性

var didPresentVia3dTouch : Bool = false

和一个方法:

public func setPreference(editMode: Bool) {
   self.didPresentVia3dTouch = editMode
}

所以这个方法应该在Controller A中的tablecell被强制触摸时将didPresentVia3dTouch的值从false设置为true,而不是通过导航项按钮作为一般 'Add' 调用显示。

控制器 A 中,我保留了对 控制器 B 的引用,如下所示:

var controllerBref = AddEditViewController()

所以在方法中

func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController)

我从 Controller B 调用方法 setPreference 像这样:

controllerBRef.setPreference(true)

为了调用 控制器 B 作为该单元格数据的编辑视图。

我注意到的一个问题是,当我打印 Controller B 的方法 setPreference(editMode: Bool) 的值时,editMode 常量,它会打印出 true,但在 viewWillAppear、viewDidAppear、viewDidLoad 和所有其他方法中,didPresentVia3dTouch 的值仍然为 false,因此不允许我更改导航栏的标题,无论是处于编辑模式还是添加新模式。

这里有什么我遗漏或不理解的地方吗?我试过委派但无法弄清楚。

问题是这一行

var controllerBref = AddEditViewController()

与当前显示的 VC 没有关系,我的意思是它是一个单独的实例,因此当您显示 B 时将其设置为 controllerBref

您需要在将要显示的视图控制器实例上设置 属性,而不是您实例化并存储在 属性 中的某个随机实例。

使用:

func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
    if let destVC = viewControllerToCommit as? AddEditViewController {
        destVC.setPreference(editMode:true)
    }
}