Skip to content

Commit 977436e

Browse files
committed
Remove unowned reference
1 parent 3af7c4d commit 977436e

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

SwiftMessages/SwiftMessagesSegue.swift

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ open class SwiftMessagesSegue: UIStoryboardSegue {
208208
override open func perform() {
209209
(source as? WindowViewController)?.install()
210210
selfRetainer = self
211+
startReleaseMonitor()
211212
if overrideModalPresentationStyle {
212213
destination.modalPresentationStyle = .custom
213214
}
@@ -222,6 +223,19 @@ open class SwiftMessagesSegue: UIStoryboardSegue {
222223
}
223224

224225
fileprivate let safeAreaWorkaroundViewController = UIViewController()
226+
227+
/// The self-retainer will not allow the segue, presenting and presented view controllers to be released if the presenting view controller
228+
/// is removed without first dismissing. This monitor handles that scenario by setting `self.selfRetainer = nil` if
229+
/// the presenting view controller is no longer in the heirarchy.
230+
private func startReleaseMonitor() {
231+
DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in
232+
guard let self = self else { return }
233+
switch self.source.view.window {
234+
case .none: self.selfRetainer = nil
235+
case .some: self.startReleaseMonitor()
236+
}
237+
}
238+
}
225239
}
226240

227241
extension SwiftMessagesSegue {
@@ -288,20 +302,21 @@ extension SwiftMessagesSegue {
288302
extension SwiftMessagesSegue: UIViewControllerTransitioningDelegate {
289303
public func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
290304
let shower = TransitioningPresenter(segue: self)
291-
messenger.defaultConfig.eventListeners.append { [unowned self] in
305+
let hider = self.hider
306+
messenger.defaultConfig.eventListeners.append { [weak self] in
292307
switch $0 {
293308
case .didShow:
294309
shower.completeTransition?(true)
295310
case .didHide:
296-
if let completeTransition = self.hider.completeTransition {
311+
if let completeTransition = hider.completeTransition {
297312
completeTransition(true)
298313
} else {
299314
// Case where message is internally hidden by SwiftMessages, such as with a
300315
// dismiss gesture, rather than by view controller dismissal.
301316
source.dismiss(animated: false, completion: nil)
302317
}
303318
(source as? WindowViewController)?.uninstall()
304-
self.selfRetainer = nil
319+
self?.selfRetainer = nil
305320
default: break
306321
}
307322
}

0 commit comments

Comments
 (0)