视图控制器传值

Posted

技术标签:

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

我有一个带有 Controller Aios 应用程序,它使用采用 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“窥视”上下文。 【参考方案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

【讨论】:

以上是关于视图控制器传值的主要内容,如果未能解决你的问题,请参考以下文章

UI 设置代理 实现视图控制器间的传值操作

[iOS开发]block传值

UI 多个视图控制器(UIViewController)间的 协议传值

UI 07 _ 导航视图控制器 与 属性传值

从视图到控制器的传值方法(表单)

iOS 页面间几种传值方式(属性,代理,block,单例,通知)