我有一个public function delete()
{
\DB::beginTransaction();
$this
->photo()
->delete()
;
$result = parent::delete();
\DB::commit();
return $result;
}
,显示一个弹出窗口。取消弹出窗口后,我需要在tableViewController
中进行动画处理。我用tableViewController
来称呼它,但是它显示了一个“找到零”错误。我猜这是因为我正在实例化一个新实例,如何在现有的viewController上调用该函数?
TableViewController().test()
答案 0 :(得分:2)
您可以在PopupViewController
中引入一个dismiss回调,并在演示者内部实现它,即如下所示的TableViewController
,并摆脱static
的方法。
class PopupViewController: UIViewController {
public var onDismiss: (() -> Void)?
// Using dismiss callback to notify the subscriber
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
super.dismiss(animated: flag, completion: self.onDismiss)
}
// rest of your code
}
在onDismiss
中实施TableViewController
回调
class TableViewController {
func showPopup() {
let popup : PopupViewController = self.storyboard?.instantiateViewController(withIdentifier: "PopupViewController") as! PopupViewController
popup.onDismiss = {[weak self] in
self?.test()
}
self.presentOnRoot(with: popup)
}
// rest of your code
}
答案 1 :(得分:1)
您可以传递调用该函数的实例以将动画应用于
class PopupViewController {
static func closePopup(outOfIsEditing: Bool, for view: UIViewController) {
if outOfIsEditing == true {
view.test()
}
}
}
用法:PopupViewController.closePopup(outOfIsEditing: true, for: self)
答案 2 :(得分:0)
在这种情况下,我们通常为“当前实例”创建一个静态属性。在加载了视图时分配它最有意义。应该执行以下操作:
class TableViewController: UIViewController {
private(set) static var currentInstance: TableViewController?
override func viewDidLoad() {
super.viewDidLoad()
TableViewController.currentInstance = self
}
}
现在您可以在任何地方打电话
TableViewController.currentInstance?.test()
请注意,这一次仅适用于1个视图控制器。如果您有多个,则最后一个将生效。
此外,如果您需要清除它,可能会导致内存泄漏。例如,如果您关闭此视图控制器,则它将对用户不可见,但仍将由属性保留。这可能是预期效果,也可能不是预期效果。如果您想自动清除它,可以使用weak
属性:
private(set) static weak var currentInstance: TableViewController?