我的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,因此不允许我更改导航栏的标题是否在编辑模式下或添加新模式。
我在这里缺少什么或不理解?我试过代表团,但无法弄清楚。
答案 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