แผ่นการตรวจจับถูกปิดบน iOS 13


120

ก่อน iOS 13 มีการนำเสนอตัวควบคุมมุมมองที่ใช้เพื่อครอบคลุมทั้งหน้าจอ และเมื่อปิดviewDidAppearฟังก์ชันพาเรนต์วิวคอนโทรลเลอร์จะถูกเรียกใช้งาน

ตอนนี้ iOS 13 จะนำเสนอตัวควบคุมมุมมองเป็นแผ่นงานเป็นค่าเริ่มต้นซึ่งหมายความว่าการ์ดจะครอบคลุมตัวควบคุมมุมมองที่อยู่เบื้องหลังบางส่วนซึ่งหมายความว่าviewDidAppearจะไม่มีการเรียกใช้เนื่องจากตัวควบคุมมุมมองหลักไม่เคยหายไป

มีวิธีตรวจสอบว่าแผ่นตัวควบคุมมุมมองที่นำเสนอถูกปิดหรือไม่ ฟังก์ชั่นอื่น ๆ ที่ฉันสามารถแทนที่ในตัวควบคุมมุมมองหลักแทนที่จะใช้ผู้รับมอบสิทธิ์บางประเภท ?


5
พูดคุยกันได้ดีในdeveloper.apple.com/videos/play/wwdc2019/224
แมตต์

มีวิธียกเลิกแผ่นโมดอลทั้งหมดในคราวเดียวไปที่ root vc หรือไม่?
Weslie


ทำไมคุณต้องรู้เมื่อถูกไล่ออก? หากต้องการโหลดข้อมูลซ้ำและอัปเดต UI การแจ้งเตือนหรือ KVO อาจเป็นทางเลือกที่ดี
martn_st

คำตอบ:


61

มีวิธีตรวจสอบว่าแผ่นตัวควบคุมมุมมองที่นำเสนอถูกปิดหรือไม่

ใช่.

ฟังก์ชั่นอื่น ๆ บางอย่างที่ฉันสามารถแทนที่ในตัวควบคุมมุมมองหลักแทนที่จะใช้ผู้รับมอบสิทธิ์บางประเภท?

ไม่ใช่ "ผู้รับมอบสิทธิ์บางประเภท" เป็นวิธีที่คุณทำ presentationControllerDidDismiss(_:)ทำให้ตัวเองตัวแทนควบคุมการนำเสนอและการแทนที่

https://developer.apple.com/documentation/uikit/uiadaptivepresentationcontrollerdelegate/3229889-presentationcontrollerdiddismiss


การขาดเหตุการณ์ที่สร้างโดยรันไทม์ทั่วไปซึ่งแจ้งให้คุณทราบว่าตัวควบคุมมุมมองที่นำเสนอไม่ว่าจะเต็มจอหรือไม่ถูกปิดนั้นเป็นปัญหาอย่างแท้จริง แต่ไม่ใช่ปัญหาใหม่เนื่องจากมีตัวควบคุมมุมมองที่นำเสนอแบบไม่เต็มหน้าจออยู่เสมอ ตอนนี้ (ใน iOS 13) มีมากกว่านี้! ฉันอุทิศคำถามและคำตอบแยกต่างหากสำหรับหัวข้อนี้ที่อื่น: Unified UIViewController การตรวจจับ "กลายเป็นส่วนหน้า"? .


6
แค่นี้ยังไม่พอ หากคุณมี nabber ใน VC ที่นำเสนอและปุ่มแถบแบบกำหนดเองที่ปิดมุมมองของคุณโดยใช้โปรแกรมตัวควบคุมการนำเสนอจะไม่ถูกเรียก
Irina

15
สวัสดี @Irina - หากคุณปิดการดูโดยใช้โปรแกรมคุณไม่จำเป็นต้องมีการติดต่อกลับเพราะคุณปิดการดูของคุณโดยใช้โปรแกรมคุณรู้ว่าคุณทำเพราะคุณทำเช่นนั้น วิธีการมอบหมายจะใช้เฉพาะในกรณีที่ผู้ใช้ทำเท่านั้น
แมต

6
@matt ขอบคุณสำหรับคำตอบ เมื่อมุมมองถูกปิดโดยทางโปรแกรมจะไม่ถูกเรียก (ตามที่ Irina กล่าว) และคุณคิดถูกที่เรารู้ว่าเราทำ ฉันแค่คิดว่ามีโค้ดสำเร็จรูปจำนวนมากที่ไม่จำเป็นที่จะต้องเขียนเพื่อให้ได้ 'viewWillAppear' ประเภทหนึ่งด้วยรูปแบบการนำเสนอโมดอลใหม่ใน iOS13 จะยุ่งเป็นพิเศษเมื่อคุณจัดการการกำหนดเส้นทางผ่านสถาปัตยกรรมที่มีการแยกเส้นทาง (ในผู้ประสานงาน MVVM + หรือประเภทเราเตอร์ใน VIPER เป็นต้น)
Adam Waite

3
@AdamWaite ฉันเห็นด้วย แต่ปัญหานี้ไม่ใช่เรื่องใหม่ เรามีปัญหานี้มาหลายปีแล้วด้วยป๊อปโอเวอร์ที่มีตัวควบคุมมุมมองที่นำเสนอแบบไม่เต็มหน้าจอพร้อมการแจ้งเตือนและอื่น ๆ ฉันถือว่านี่เป็นข้อบกพร่องร้ายแรงใน "เหตุการณ์" ของ Apple ฉันแค่บอกว่าความเป็นจริงคืออะไรและทำไม ฉันต่อสู้กับปัญหาโดยตรงที่นี่: stackoverflow.com/questions/54602662/…
แม

1
presentationControllerDidDismiss (_ :) ไม่ถูกเรียกเมื่อฉันคลิกปุ่มย้อนกลับใน Child VC ความช่วยเหลือใด ๆ
กฤษณะมีนา

42

นี่คือตัวอย่างโค้ดของตัวควบคุมมุมมองหลักซึ่งจะได้รับแจ้งเมื่อตัวควบคุมมุมมองลูกที่แสดงเป็นแผ่นงาน (เช่นในลักษณะเริ่มต้นของ iOS 13) ถูกปิด:

public final class Parent: UIViewController, UIAdaptivePresentationControllerDelegate
{
  // This is assuming that the segue is a storyboard segue; 
  // if you're manually presenting, just see the delegate there.
  public override func prepare(for segue: UIStoryboardSegue, sender: Any?)
  {
    if segue.identifier == "mySegue" {
      segue.destination.presentationController?.delegate = self;
    }
  }

  public func presentationControllerDidDismiss(
    _ presentationController: UIPresentationController)
  {
    // Only called when the sheet is dismissed by DRAGGING.
    // You'll need something extra if you call .dismiss() on the child.
    // (I found that overriding dismiss in the child and calling
    // presentationController.delegate?.presentationControllerDidDismiss
    // works well).
  }
}

คำตอบของ Jerland2 สับสนเนื่องจาก (a) ผู้ถามเดิมต้องการรับการเรียกใช้ฟังก์ชันเมื่อแผ่นงานถูกปิด (ในขณะที่เขาใช้ presentationControllerDidAttemptToDismiss ซึ่งเรียกว่าเมื่อผู้ใช้พยายามและไม่สามารถปิดแผ่นงาน) และ (b) การตั้งค่า isModalInPresentation เป็นมุมฉากทั้งหมดและในความเป็นจริงจะทำให้แผ่นงานที่นำเสนอไม่สามารถปิดได้ (ซึ่งตรงข้ามกับสิ่งที่ OP ต้องการ)


6
นี้ใช้งานได้ดี เพียงแค่เคล็ดลับว่าหากคุณใช้ตัวควบคุมการนำทางบน VC ที่คุณเรียกคุณควรกำหนดตัวควบคุมการนำทางเป็นตัวควบคุมการนำเสนอหรือไม่, มอบหมาย (ไม่ใช่ VC ที่ nav มีเป็น topViewController)
instAustralia

@instAustralia คุณช่วยอธิบายเหตุผลหรืออ้างอิงเอกสารได้ไหม ขอบคุณ.
Ahmed Osama

presentationControllerDidDismiss จะเรียกมันอย่างไรเมื่อผู้ใช้กดปุ่มย้อนกลับ
กฤษณะมีนา

@AhmedOsama - ตัวควบคุมการนำทางเป็นตัวควบคุมการนำเสนอดังนั้นจึงเป็นผู้รับมอบสิทธิ์เนื่องจากจะเป็นผู้ตอบสนองต่อการเลิกจ้าง ฉันได้ลอง VC ที่ฝังอยู่ใน Nav Controller ด้วย แต่นี่คือที่ที่ปุ่มจริงของฉันที่จะปิดและตอบสนอง ฉันไม่พบมันโดยตรงในเอกสารของ Apple แต่มีการอ้างอิงที่นี่sarunw.com/posts/modality-changes-in-ios13
instAustralia

26

อีกทางเลือกหนึ่งในการกลับมาviewWillAppearและviewDidAppearตั้งค่า

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen

ตัวเลือกนี้ครอบคลุมแบบเต็มหน้าจอและหลังจากปิดแล้วให้เรียกใช้วิธีการข้างต้น


2
ขอบคุณ PiterPan. นี่คือการทำงาน นี่เป็นการแก้ปัญหาที่ดีและเร็วที่สุด
Erkam KUCET

ขอขอบคุณสำหรับวิธีที่รวดเร็วและเชื่อถือได้ในการคืนค่าพฤติกรรมเริ่มต้นในอดีต เป็นเรื่องดีที่สามารถแก้ไขปัญหานี้ได้ทันทีจากนั้นวางแผนการเปลี่ยนแปลงไปสู่พฤติกรรมใหม่อย่างมีเหตุผล
Ian Lovejoy

14
นี่เป็นวิธีแก้ปัญหามากกว่าการแก้ไข ไม่ใช่เรื่องดีสำหรับทุกคนที่จะเปลี่ยนกลับไปใช้สไตล์ชีต iOS 12 iOS 13 เจ๋งมาก! :)
Matt

1
โปรดใช้สิ่งนี้อย่างระมัดระวังสำหรับ iPad เนื่องจาก iPad มีค่าเริ่มต้นในการนำเสนอเป็น pageSheet เมื่อนำเสนอแบบแยกส่วน สิ่งนี้จะบังคับให้ iPad แสดงเป็นแบบเต็มหน้าจอ
wyu

ไม่ได้ผลสำหรับฉัน ฉันเปิดตัวควบคุมโมดอล ปิดด้วยการปิด แต่ willAppear ไม่ถูกเรียก ทำไม? ขอบคุณ
neo999

20

สำหรับผู้อ่านในอนาคตนี่คือคำตอบที่สมบูรณ์ยิ่งขึ้นพร้อมการใช้งาน:

  1. ในตัวควบคุมมุมมองรูทเตรียมสำหรับการทำต่อเพิ่มสิ่งต่อไปนี้ (สมมติว่าโมดอลของคุณมีตัวควบคุมการนำทาง)
    // Modal Dismiss iOS 13
    modalNavController.presentationController?.delegate = modalVc
  1. ในตัวควบคุมมุมมองแบบโมดอลให้เพิ่มวิธีการ + ตัวแทนต่อไปนี้
// MARK: - iOS 13 Modal (Swipe to Dismiss)

extension ModalViewController: UIAdaptivePresentationControllerDelegate {
    func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController) {


        print("slide to dismiss stopped")
        self.dismiss(animated: true, completion: nil)
    }
}
  1. ตรวจสอบให้แน่ใจใน modal View Controller ว่าคุณสมบัติต่อไปนี้เป็นจริงเพื่อให้มีการเรียกใช้เมธอด delegate
    self.isModalInPresentation = true
  1. กำไร

1
self.isModalInPresentation = true จากนั้นลากออกไม่ทำงาน ลบวิธีการมอบหมายสายนั้นยังคงเรียกว่าโอเค ขอขอบคุณ.
Yogesh Patel

2
สิ่งนี้สับสนเนื่องจาก (ก) ผู้ถามเดิมต้องการรับการเรียกใช้ฟังก์ชันเมื่อแผ่นงานถูกปิด (ในขณะที่คุณใช้งาน presentationControllerDidAttemptToDismiss ซึ่งเรียกว่าเมื่อผู้ใช้พยายามและไม่สามารถปิดแผ่นงาน) และ (b) การตั้งค่า isModalInPresentation เป็นมุมฉากทั้งหมดและในความเป็นจริงจะทำให้แผ่นงานที่นำเสนอไม่สามารถปิดได้ (ซึ่งตรงข้ามกับสิ่งที่ OP ต้องการ)
Matt

1
ติดตามประเด็นคำตอบของpresentationControllerDidDismiss
@Matt

ไม่ถูกต้องนักเนื่องจากpresentationControllerDidAttemptToDismissมีไว้สำหรับกรณีที่ผู้ใช้พยายามปิด แต่ถูกป้องกันโดยทางโปรแกรม (อ่านเอกสารสำหรับวิธีการนั้นอย่างละเอียด) presentationControllerWillDismissเป็นวิธีการหนึ่งในการตรวจสอบความตั้งใจของผู้ใช้ที่จะยกเลิกหรือpresentationControllerShouldDismissการควบคุมการไล่หรือpresentationControllerDidDismissในการตรวจสอบความเป็นจริงของการถูกไล่
Vitalii

5

รวดเร็ว

วิธีแก้ปัญหาทั่วไปในการโทร viewWillAppearในiOS13

class ViewController: UIViewController {

        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            print("viewWillAppear")
        }

        //Show new viewController
        @IBAction func show(_ sender: Any) {
            let newViewController = NewViewController()
            //set delegate of UIAdaptivePresentationControllerDelegate to self
            newViewController.presentationController?.delegate = self
            present(newViewController, animated: true, completion: nil)
        }
    }

    extension UIViewController: UIAdaptivePresentationControllerDelegate {
        public func presentationControllerDidDismiss( _ presentationController: UIPresentationController) {
            if #available(iOS 13, *) {
                //Call viewWillAppear only in iOS 13
                viewWillAppear(true)
            }
        }
    }

1
dismiss(_)นี้จะจัดการห้ามใช้สไลด์จากด้านบนที่ไม่ได้โดยการเรียกฟังก์ชั่น
Pedro Paulo Amorim

3

DRAG หรือ CALL DISMISS FUNC จะทำงานร่วมกับโค้ดด้านล่าง

1) ในตัวควบคุมมุมมองรูทคุณจะบอกว่าตัวควบคุมมุมมองการนำเสนอเป็นรหัสด้านล่าง

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "presenterID" {
        let navigationController = segue.destination as! UINavigationController
        if #available(iOS 13.0, *) {
            let controller = navigationController.topViewController as! presentationviewcontroller
            // Modal Dismiss iOS 13
            controller.presentationController?.delegate = self
        } else {
            // Fallback on earlier versions
        }
        navigationController.presentationController?.delegate = self

    }
}

2) อีกครั้งในตัวควบคุมมุมมองรูทคุณจะบอกสิ่งที่คุณจะทำเมื่อตัวควบคุมมุมมองการนำเสนอถูกกระจาย

public func presentationControllerDidDismiss(
  _ presentationController: UIPresentationController)
{
    print("presentationControllerDidDismiss")
}

1) ในตัวควบคุมมุมมองการนำเสนอเมื่อคุณกดปุ่มยกเลิกหรือบันทึกในภาพนี้ รหัสด้านล่างนี้จะเรียกว่า

self.dismiss(animated: true) {
        self.presentationController?.delegate?.presentationControllerDidDismiss?(self.presentationController!)
    }

ใส่คำอธิบายภาพที่นี่


1
จำเป็นต้องส่ง navigationController.topViewController ไปยัง presentationViewController หรือไม่ ฉันคิดว่ามันไม่ใช่
Fitsyu

ฉันจะโหลดข้อมูลซ้ำใน VC หลักหลังจากปิดจากปุ่มยกเลิก VC ลูกได้อย่างไร
กฤษณะมีนา

3

แทนที่ viewWillDisappear บน UIViewController ที่ถูกปิด มันจะแจ้งเตือนคุณถึงการเลิกจ้างผ่านisBeingDismissedแฟล็กบูลีน

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if isBeingDismissed {
        print("user is dismissing the vc")
    }
}

** หากผู้ใช้เลื่อนไปครึ่งทางแล้วเลื่อนการ์ดกลับขึ้นการ์ดจะยังคงลงทะเบียนว่าถูกปิดแม้ว่าการ์ดจะไม่ถูกปิดก็ตาม แต่นั่นเป็นกรณีสำคัญที่คุณอาจไม่สนใจ


เกี่ยวกับอะไรself.dismiss(animated: Bool, completion: (() -> Void)?)
iGhost

0

หากคุณต้องการทำบางสิ่งเมื่อผู้ใช้ปิดแผ่นโมดอลจากภายในแผ่นงานนั้น สมมติว่าคุณมีปุ่มปิดที่มี@IBActionและตรรกะเพื่อแสดงการแจ้งเตือนก่อนปิดหรือทำอย่างอื่น คุณแค่ต้องการตรวจจับช่วงเวลาที่ผู้ใช้กดตัวควบคุมดังกล่าวลง

วิธีการมีดังนี้

class MyModalSheetViewController: UIViewController {

     override func viewDidLoad() {
        super.viewDidLoad()

        self.presentationController?.delegate = self
     }

     @IBAction func closeAction(_ sender: Any) {
         // your logic to decide to close or not, when to close, etc.
     }

}

extension MyModalSheetViewController: UIAdaptivePresentationControllerDelegate {

    func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
        return false // <-prevents the modal sheet from being closed
    }

    func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController) {
        closeAction(self) // <- called after the modal sheet was prevented from being closed and leads to your own logic
    }
}

-1

ถ้ามีคนไม่สามารถเข้าถึงตัวควบคุมมุมมองนำเสนอพวกเขาก็สามารถแทนที่วิธีดังต่อไปนี้ในการนำเสนอมุมมองควบคุมและเปลี่ยนmodalPresentationStyleไปfullScreenหรือสามารถเพิ่มหนึ่งในกลยุทธ์ดังกล่าวข้างต้นด้วยวิธีนี้

 override func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) {
    if let _ = viewControllerToPresent as? TargetVC {
        viewControllerToPresent.modalPresentationStyle = .fullScreen
    }
    super.present(viewControllerToPresent, animated: flag, completion: completion)
}

หากตัวควบคุมมุมมองที่นำเสนอเป็นตัวควบคุมการนำทางและคุณต้องการตรวจสอบตัวควบคุมรากสามารถเปลี่ยนเงื่อนไขข้างต้นให้เป็นเช่นนั้นได้

if let _ = (viewControllerToPresent as? UINavigationController)?.viewControllers.first as? TargetVC {
   viewControllerToPresent.modalPresentationStyle = .fullScreen
}

-2

ถ้าคุณใช้ ModalPresentationStyle ใน FullScreen พฤติกรรมของคอนโทรลเลอร์จะกลับมาเหมือนเดิม

ConsultarController controllerConsultar = this.Storyboard.InstantiateViewController ("ConsultarController") เป็น ConsultarController; controllerConsultar.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; this.NavigationController.PushViewController (controllerConsultar จริง);


ทำซ้ำคำตอบที่มีอยู่
แมต

-3

จากมุมมองของฉัน Apple ไม่ควรตั้งpageSheetเป็นค่าเริ่มต้นmodalPresentationStyle

ฉันต้องการนำfullScreenสไตล์กลับมาเป็นค่าเริ่มต้นโดยใช้swizzling

แบบนี้:

private func _swizzling(forClass: AnyClass, originalSelector: Selector, swizzledSelector: Selector) {
    if let originalMethod = class_getInstanceMethod(forClass, originalSelector),
       let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }
}

extension UIViewController {

    static func preventPageSheetPresentationStyle () {
        UIViewController.preventPageSheetPresentation
    }

    static let preventPageSheetPresentation: Void = {
        if #available(iOS 13, *) {
            _swizzling(forClass: UIViewController.self,
                       originalSelector: #selector(present(_: animated: completion:)),
                       swizzledSelector: #selector(_swizzledPresent(_: animated: completion:)))
        }
    }()

    @available(iOS 13.0, *)
    private func _swizzledPresent(_ viewControllerToPresent: UIViewController,
                                        animated flag: Bool,
                                        completion: (() -> Void)? = nil) {
        if viewControllerToPresent.modalPresentationStyle == .pageSheet
                   || viewControllerToPresent.modalPresentationStyle == .automatic {
            viewControllerToPresent.modalPresentationStyle = .fullScreen
        }
        _swizzledPresent(viewControllerToPresent, animated: flag, completion: completion)
    }
}

แล้วใส่บรรทัดนี้กับไฟล์ AppDelegate

UIViewController.preventPageSheetPresentationStyle()

1
นี่เป็นเรื่องที่แยบยล แต่ฉันไม่เห็นด้วยกับมัน มันแฮ็คและยิ่งไปกว่านั้นมันขัดกับเม็ดของ iOS 13 คุณควรจะใช้การนำเสนอแบบ "การ์ด" ใน iOS 13 คำตอบที่ Apple คาดหวังจากเราไม่ใช่ มันคือ "เอาชนะมัน"
แม

เห็นด้วยกับประเด็นของคุณโซลูชันนี้ไม่ได้ช่วยในการใช้รูปแบบการนำเสนอการ์ดตามที่ Apple สนับสนุนเรา อย่างไรก็ตามการตั้งค่าเป็นรูปแบบเริ่มต้นจะทำให้บรรทัดโค้ดที่มีอยู่ผิดพลาดที่ใดที่หนึ่งเพราะpresentingViewControllerจะไม่ทริกเกอร์viewWillAppear
jacob

1
ใช่ แต่อย่างที่ฉันได้พูดไปแล้วในคำตอบของตัวเองนั่นเป็นปัญหาเสมอสำหรับการนำเสนอแบบไม่เต็มหน้าจอ (เช่นป๊อปโอเวอร์และหน้า / แบบฟอร์มบน iPad) ดังนั้นนี่จึงไม่มีอะไรใหม่ แค่ว่าตอนนี้มันมีมากขึ้น อาศัยอยู่viewWillAppearในความรู้สึกที่ไม่ถูกต้องเสมอ แน่นอนว่าฉันไม่ชอบให้ Apple เข้ามาและตัดพื้นออกจากข้างใต้ฉัน แต่อย่างที่บอกว่าเราต้องอยู่กับสิ่งนั้นและทำสิ่งใหม่ ๆ
แม

ในโครงการของฉันมีบางสถานการณ์ที่ฉันไม่รู้ว่าตัวควบคุมมุมมอง (เรียกว่าpresentedController) ถูกนำเสนอที่ไหนและไม่รู้ว่าอะไรคือไฟล์presentingViewController. ตัวอย่างเช่นในบางกรณีฉันต้องใช้UIViewController.topMostViewController()ซึ่งส่งคืนตัวควบคุมมุมมองสูงสุดในหน้าต่างปัจจุบันให้ฉัน นั่นคือเหตุผลที่ฉันต้องการทำ swizzling เพื่อให้พฤติกรรมปัจจุบันทำสิ่งที่ถูกต้อง (รีเฟรชข้อมูล UI) ในviewWillAppearตัวควบคุมมุมมองของฉัน หากคุณมีแนวคิดในการแก้ไขปัญหาดังกล่าวโปรดช่วยด้วย
jacob

วิธีแก้ปัญหาที่ฉันเชื่อมโยงไปในตอนท้ายของคำตอบของฉันใช้งานได้เพื่อแก้ปัญหานั้นฉันเชื่อ การกำหนดค่าในเวลาการนำเสนอต้องใช้เวลาพอสมควร แต่โดยพื้นฐานแล้วจะรับประกันได้ว่าผู้นำเสนอทุกคน (รวมถึงผู้นำเสนอการแจ้งเตือน) จะได้ยินเมื่อตัวควบคุมมุมมองที่นำเสนอถูกปิด
แม

-6

มันจะไม่ง่ายนักที่จะเรียก presentationViewController.viewWillAppear? ถูกไล่ออก?

self.presentingViewController?.viewWillAppear(false)
self.dismiss(animated: true, completion: nil)

4
ไม่ใช่ของคุณที่จะโทร.
แม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.