查看控制器值传递

时间:2018-05-22 22:19:40

标签: ios swift delegates viewcontroller

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

控制器B 主要用于填充信息,然后将其添加到控制器A 上的表格视图中。

因此,在应用DRY原则时,我正在重复使用控制器B 来添加和编辑数据。

问题:

控制器B 有一个属性

var didPresentVia3dTouch : Bool = false

和方法:

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

因此,当控制器A 中的表格单元被强制触摸时,此方法应该将 didPresentVia3dTouch 的值设置为true,而不是通过导航项呈现按钮作为一般“添加”电话。

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

var controllerBref = AddEditViewController()

所以在方法中

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

我从控制器B 中调用方法 setPreference ,如下所示:

controllerBRef.setPreference(true)

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

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

我在这里缺少什么或不理解?我试过代表团,但无法弄清楚。

2 个答案:

答案 0 :(得分:1)

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

使用:

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

答案 1 :(得分:0)

问题是这一行

var controllerBref = AddEditViewController()

与当前呈现的VC无关,我的意思是它是一个单独的实例,所以当你出现B时将其设置为controllerBref