视图控制器传值
Posted
技术标签:
【中文标题】视图控制器传值【英文标题】: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“窥视”上下文。 【参考方案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
【讨论】:
以上是关于视图控制器传值的主要内容,如果未能解决你的问题,请参考以下文章