【问题标题】:View Controller value passing视图控制器传值
【发布时间】:2018-05-22 22:19:39
【问题描述】:

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

这个controller B主要是用来填充信息,然后添加到Controller A上的tableview中。

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

问题:

Controller B有一个属性

var didPresentVia3dTouch : Bool = false

还有一个方法:

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

所以当Controller A中的tablecell被强制触摸时,这个方法应该将didPresentVia3dTouch的值从false设置为true,而不是通过导航项呈现按钮作为一般的“添加”调用。

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

var controllerBref = AddEditViewController()

所以在方法中

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

我从 Controller B 调用 setPreference 方法,如下所示:

controllerBRef.setPreference(true)

为了调用 Controller B 来充当该单元格上数据的编辑视图。

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

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

【问题讨论】:

  • 我要做的就是使用两个不同的视图控制器类。我认为您对 DRY 的使用在这里放错了地方。一个视图控制器可以是另一个视图控制器的子类,除了一个用于 3D“窥视”上下文。

标签: ios swift delegates viewcontroller


【解决方案1】:

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

用途:

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

【讨论】:

  • 谢谢你,伙计,它成功了。然而,我确实在 viewDidAppear 方法中使用了标题,所以在测试它时,不知何故,当视图为 false 时,标题需要 1 秒来加载并显示 viewController 的名称。有什么想法吗?
  • 抱歉,不,不是此处显示的内容。但你可以用那里的相关代码问另一个问题
【解决方案2】:

问题在于这一行

var controllerBref = AddEditViewController()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多