UIPageViewControllerDelegateのカスタムクラスを作成するにはどうすればよいですか?

モデル

を使用してiOSアプリを作成していUIPageViewControllerます。私のルートビューコントローラーはでViewController、そのUIPageViewController下に子VCとして追加しました。

最初に、私は自分ViewControllerをページビューVCデリゲートとして作成しましたUIPageViewControllerDelegate::

extension ViewController: UIPageViewControllerDelegate {



    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {

        // set the pageControl.currentPage to the index of the current viewController in pages
        if let viewControllers = pageViewController.viewControllers as? [UIViewController] {
            if let viewControllerIndex = self.detailPagedVC.pages.index(of: viewControllers[0]) {
                self.detailPagedVC.pageControl.currentPage = viewControllerIndex

                // if current page is a single person view controller, zoom to that person's face
                if let singlePersonViewController = self.detailPagedVC.pages[viewControllerIndex] as? SinglePersonPageViewController {

                    // print("didFinishAnimating: \(viewControllerIndex)")
                    self.zoomableImageVC.zoomableImageView.zoom(to: self.identificationResults[viewControllerIndex].face.rect, with: Constants.contentSpanRatio, animated: true)
                } else if let summaryPageViewController = self.detailPagedVC.pages[viewControllerIndex] as? SummaryPageViewController {
                    self.zoomableImageVC.zoomableImageView.zoom(to: self.zoomableImageVC.zoomableImageView.imageView.bounds, with: Constants.contentSpanRatio, animated: true)
                } else {
                    print("gw: err: unkown type of page controller in paged view ")
                }
            }
        }


    }
}

この方法は問題なく機能します。委任関数を専用クラスに移動することを決定するまで:

class PeoplePageViewDelegate: NSObject, UIPageViewControllerDelegate{

    private struct Constants {

        // the ratio of the content (e..g face) taken inside the entire view
        static let contentSpanRatio: CGFloat = 0.8

    }

    // store a reference to the object which will take the actual action
    // action 1: zooming
    weak var zoomingActionTaker: ZoomableImageView?

    // action 2: paging
    weak var pagingActionTaker: PeoplePageViewController?


    // the delegator who relies on this object
    unowned let delegator: PeoplePageViewController

    init(delegator: PeoplePageViewController) {
        self.delegator = delegator

        // wire back to delegator 
        // self.pagingActionTaker = delegator // gw: mind the nuance difference, you chain a weak ref on a unowned ref, what can go wrong?

        super.init()
    }




    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        print("gw:0")
        // set the pageControl.currentPage to the index of the current viewController in pages
        if let viewControllers = pageViewController.viewControllers as? [UIViewController] {
            print("gw:1")
            if let viewControllerIndex = self.delegator.pages.index(of: viewControllers[0]) {
                 print("gw:2")
                self.pagingActionTaker?.pageControl.currentPage = viewControllerIndex

                // if current page is a single person view controller, zoom to that person's face
                if let singlePersonViewController = self.delegator.pages[viewControllerIndex] as? SinglePersonPageViewController {

                     print("gw:3")
                    self.zoomingActionTaker?.zoom(to: singlePersonViewController.identification.face.rect, with: Constants.contentSpanRatio, animated: true)


                } else if let summaryPageViewController = self.delegator.pages[viewControllerIndex] as? SummaryPageViewController,

                    let entireImageBounds = self.zoomingActionTaker?.imageView.bounds {
                    print("gw:4")
                    self.zoomingActionTaker?.zoom(to: entireImageBounds, with: Constants.contentSpanRatio, animated: true)
                } else {
                    print("gw: err: unkown type of page controller in paged view ")
                }
            }
        }


    }
}

これにより問題が発生します。pageViewController(_: didFinishAnimating:previousViewControllers:transitionCompleted)デリゲートをこの新しいクラスのインスタンスに設定したにもかかわらず、関数がまったく呼び出されません。

私が考えることができる唯一のことは、新しいデリゲートオブジェクトはもうVCではないということです(以前は私のメインVCでした)。だから私はこの行動の変化がVC階層に関連していると思いますか?

私は何か見落としてますか?

モデル

(この回答は、OOPerのコメントに触発されています)。

原因は、最初weakはデリゲートオブジェクトへの参照のみを保持しているためであることが判明しましたこのような:

前:

class ViewController:  UIViewController { 
    init() {

        self.pageViewController.delegate = PeoplePageViewDelegate(….)


    }

}

ここでの問題は、実行ポイントがinitメソッドスコープを通過するPeoplePageViewDelegateと、参照カウントがゼロであるためにガベージコレクションが行われることです。

修正方法:

のフィールドとして強力な参照を追加したViewControllerので、デリゲートオブジェクトが保持されます。

後:

class ViewController:  UIViewController { 

    var myStrongReference: PeoplePageViewDelegate?
    init() {

        self.myStrongReference = PeoplePageViewDelegate(….)

        self.pageViewController.delegate = self.myStrongReference

    }

}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

uiimageviewのカスタムクラスを作成するにはどうすればよいですか-swift

分類Dev

Emberでカスタムエラークラスを作成するにはどうすればよいですか?

分類Dev

Xcode + Swift 4でカスタムUIBarButtonItemクラスを作成するにはどうすればよいですか?

分類Dev

JavaでカスタムJButtonクラスを作成するにはどうすればよいですか?

分類Dev

カスタムサブスクライバーを作成するにはどうすればよいですか?

分類Dev

kotlinでカスタムフォントを使用してTextViewのカスタムクラスを作成するにはどうすればよいですか?

分類Dev

トーチのクラスシステムを使用してカスタムクラスを作成するにはどうすればよいですか

分類Dev

GitHubで課題のカスタムラベルを作成するにはどうすればよいですか?

分類Dev

DatePicker for UWPのカスタムレンダラーを作成するにはどうすればよいですか?

分類Dev

カスタムクラスの子をGameSceneに追加するにはどうすればよいですか?

分類Dev

Laravel 5で独自のカスタムクラスを追加するにはどうすればよいですか?

分類Dev

Silexのカスタムクラスで$ appを使用するにはどうすればよいですか?

分類Dev

UITableViewセクションのカスタム背景を作成するにはどうすればよいですか?

分類Dev

フラッターでカスタムチェックボックスのリストを作成するにはどうすればよいですか?

分類Dev

kendo.Window()のカスタムcssクラスを指定するにはどうすればよいですか?

分類Dev

特定のクラスを起動するカスタムEclipse実行ランチャーを作成するにはどうすればよいですか?

分類Dev

C#でカスタムカラーを作成するにはどうすればよいですか?

分類Dev

AngularJSのメソッドで使用できるカスタムオブジェクトクラスを作成するにはどうすればよいですか?

分類Dev

djangoでカスタムミックスインを作成するにはどうすればよいですか?

分類Dev

パラメータの有効性をチェックするカスタムセッターを作成するにはどうすればよいですか?

分類Dev

onCreateでカスタムクレームを作成するにはどうすればよいですか?

分類Dev

MaterialDesignInXamlToolkitカスタムカラーテーマを作成するにはどうすればよいですか?

分類Dev

カスタムアノテーションが付けられたクラスのリストを作成するにはどうすればよいですか?

分類Dev

カスタムランダム分布関数を作成するにはどうすればよいですか?

分類Dev

Swiftでカスタムクラスの等価性テストを作成するにはどうすればよいですか?

分類Dev

楕円のカスタムストロークカラーを作成するにはどうすればよいですか?

分類Dev

クライアント側でカスタムの「POST」リクエストを作成するにはどうすればよいですか?

分類Dev

フラッターでシークバーのカスタムサムを作成するにはどうすればよいですか?

分類Dev

JavaScriptでカスタムエラーを作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    uiimageviewのカスタムクラスを作成するにはどうすればよいですか-swift

  2. 2

    Emberでカスタムエラークラスを作成するにはどうすればよいですか?

  3. 3

    Xcode + Swift 4でカスタムUIBarButtonItemクラスを作成するにはどうすればよいですか?

  4. 4

    JavaでカスタムJButtonクラスを作成するにはどうすればよいですか?

  5. 5

    カスタムサブスクライバーを作成するにはどうすればよいですか?

  6. 6

    kotlinでカスタムフォントを使用してTextViewのカスタムクラスを作成するにはどうすればよいですか?

  7. 7

    トーチのクラスシステムを使用してカスタムクラスを作成するにはどうすればよいですか

  8. 8

    GitHubで課題のカスタムラベルを作成するにはどうすればよいですか?

  9. 9

    DatePicker for UWPのカスタムレンダラーを作成するにはどうすればよいですか?

  10. 10

    カスタムクラスの子をGameSceneに追加するにはどうすればよいですか?

  11. 11

    Laravel 5で独自のカスタムクラスを追加するにはどうすればよいですか?

  12. 12

    Silexのカスタムクラスで$ appを使用するにはどうすればよいですか?

  13. 13

    UITableViewセクションのカスタム背景を作成するにはどうすればよいですか?

  14. 14

    フラッターでカスタムチェックボックスのリストを作成するにはどうすればよいですか?

  15. 15

    kendo.Window()のカスタムcssクラスを指定するにはどうすればよいですか?

  16. 16

    特定のクラスを起動するカスタムEclipse実行ランチャーを作成するにはどうすればよいですか?

  17. 17

    C#でカスタムカラーを作成するにはどうすればよいですか?

  18. 18

    AngularJSのメソッドで使用できるカスタムオブジェクトクラスを作成するにはどうすればよいですか?

  19. 19

    djangoでカスタムミックスインを作成するにはどうすればよいですか?

  20. 20

    パラメータの有効性をチェックするカスタムセッターを作成するにはどうすればよいですか?

  21. 21

    onCreateでカスタムクレームを作成するにはどうすればよいですか?

  22. 22

    MaterialDesignInXamlToolkitカスタムカラーテーマを作成するにはどうすればよいですか?

  23. 23

    カスタムアノテーションが付けられたクラスのリストを作成するにはどうすればよいですか?

  24. 24

    カスタムランダム分布関数を作成するにはどうすればよいですか?

  25. 25

    Swiftでカスタムクラスの等価性テストを作成するにはどうすればよいですか?

  26. 26

    楕円のカスタムストロークカラーを作成するにはどうすればよいですか?

  27. 27

    クライアント側でカスタムの「POST」リクエストを作成するにはどうすればよいですか?

  28. 28

    フラッターでシークバーのカスタムサムを作成するにはどうすればよいですか?

  29. 29

    JavaScriptでカスタムエラーを作成するにはどうすればよいですか?

ホットタグ

アーカイブ