//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use objc2::__framework_prelude::*;
use objc2_foundation::*;

use crate::*;

// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct UIModalTransitionStyle(pub NSInteger);
impl UIModalTransitionStyle {
    #[doc(alias = "UIModalTransitionStyleCoverVertical")]
    pub const CoverVertical: Self = Self(0);
    #[doc(alias = "UIModalTransitionStyleFlipHorizontal")]
    pub const FlipHorizontal: Self = Self(1);
    #[doc(alias = "UIModalTransitionStyleCrossDissolve")]
    pub const CrossDissolve: Self = Self(2);
    #[doc(alias = "UIModalTransitionStylePartialCurl")]
    pub const PartialCurl: Self = Self(3);
}

unsafe impl Encode for UIModalTransitionStyle {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

unsafe impl RefEncode for UIModalTransitionStyle {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct UIModalPresentationStyle(pub NSInteger);
impl UIModalPresentationStyle {
    pub const UIModalPresentationFullScreen: Self = Self(0);
    pub const UIModalPresentationPageSheet: Self = Self(1);
    pub const UIModalPresentationFormSheet: Self = Self(2);
    pub const UIModalPresentationCurrentContext: Self = Self(3);
    pub const UIModalPresentationCustom: Self = Self(4);
    pub const UIModalPresentationOverFullScreen: Self = Self(5);
    pub const UIModalPresentationOverCurrentContext: Self = Self(6);
    pub const UIModalPresentationPopover: Self = Self(7);
    pub const UIModalPresentationBlurOverFullScreen: Self = Self(8);
    pub const UIModalPresentationNone: Self = Self(-1);
    pub const UIModalPresentationAutomatic: Self = Self(-2);
}

unsafe impl Encode for UIModalPresentationStyle {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

unsafe impl RefEncode for UIModalPresentationStyle {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

extern_protocol!(
    pub unsafe trait UIContentContainer: NSObjectProtocol + IsMainThreadOnly {
        #[method(preferredContentSize)]
        unsafe fn preferredContentSize(&self) -> CGSize;

        #[method(preferredContentSizeDidChangeForChildContentContainer:)]
        unsafe fn preferredContentSizeDidChangeForChildContentContainer(
            &self,
            container: &ProtocolObject<dyn UIContentContainer>,
        );

        #[method(systemLayoutFittingSizeDidChangeForChildContentContainer:)]
        unsafe fn systemLayoutFittingSizeDidChangeForChildContentContainer(
            &self,
            container: &ProtocolObject<dyn UIContentContainer>,
        );

        #[method(sizeForChildContentContainer:withParentContainerSize:)]
        unsafe fn sizeForChildContentContainer_withParentContainerSize(
            &self,
            container: &ProtocolObject<dyn UIContentContainer>,
            parent_size: CGSize,
        ) -> CGSize;

        #[cfg(feature = "UIViewControllerTransitionCoordinator")]
        #[method(viewWillTransitionToSize:withTransitionCoordinator:)]
        unsafe fn viewWillTransitionToSize_withTransitionCoordinator(
            &self,
            size: CGSize,
            coordinator: &ProtocolObject<dyn UIViewControllerTransitionCoordinator>,
        );

        #[cfg(all(
            feature = "UITraitCollection",
            feature = "UIViewControllerTransitionCoordinator"
        ))]
        #[method(willTransitionToTraitCollection:withTransitionCoordinator:)]
        unsafe fn willTransitionToTraitCollection_withTransitionCoordinator(
            &self,
            new_collection: &UITraitCollection,
            coordinator: &ProtocolObject<dyn UIViewControllerTransitionCoordinator>,
        );
    }

    unsafe impl ProtocolType for dyn UIContentContainer {}
);

extern "C" {
    pub static UIViewControllerShowDetailTargetDidChangeNotification: &'static NSNotificationName;
}

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[cfg(feature = "UIResponder")]
    pub struct UIViewController;

    #[cfg(feature = "UIResponder")]
    unsafe impl ClassType for UIViewController {
        #[inherits(NSObject)]
        type Super = UIResponder;
        type Mutability = MainThreadOnly;
    }
);

#[cfg(feature = "UIResponder")]
unsafe impl NSCoding for UIViewController {}

#[cfg(feature = "UIResponder")]
unsafe impl NSObjectProtocol for UIViewController {}

#[cfg(all(feature = "UIAppearance", feature = "UIResponder"))]
unsafe impl UIAppearanceContainer for UIViewController {}

#[cfg(feature = "UIResponder")]
unsafe impl UIContentContainer for UIViewController {}

#[cfg(all(feature = "UIFocus", feature = "UIResponder"))]
unsafe impl UIFocusEnvironment for UIViewController {}

#[cfg(feature = "UIResponder")]
unsafe impl UIResponderStandardEditActions for UIViewController {}

#[cfg(all(feature = "UIResponder", feature = "UITraitCollection"))]
unsafe impl UITraitEnvironment for UIViewController {}

extern_methods!(
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[method_id(@__retain_semantics Init initWithNibName:bundle:)]
        pub unsafe fn initWithNibName_bundle(
            this: Allocated<Self>,
            nib_name_or_nil: Option<&NSString>,
            nib_bundle_or_nil: Option<&NSBundle>,
        ) -> Retained<Self>;

        #[method_id(@__retain_semantics Init initWithCoder:)]
        pub unsafe fn initWithCoder(
            this: Allocated<Self>,
            coder: &NSCoder,
        ) -> Option<Retained<Self>>;

        #[cfg(feature = "UIView")]
        #[method_id(@__retain_semantics Other view)]
        pub fn view(&self) -> Option<Retained<UIView>>;

        #[cfg(feature = "UIView")]
        #[method(setView:)]
        pub fn setView(&self, view: Option<&UIView>);

        #[method(loadView)]
        pub unsafe fn loadView(&self);

        #[method(loadViewIfNeeded)]
        pub unsafe fn loadViewIfNeeded(&self);

        #[cfg(feature = "UIView")]
        #[method_id(@__retain_semantics Other viewIfLoaded)]
        pub unsafe fn viewIfLoaded(&self) -> Option<Retained<UIView>>;

        #[deprecated]
        #[method(viewWillUnload)]
        pub unsafe fn viewWillUnload(&self);

        #[deprecated]
        #[method(viewDidUnload)]
        pub unsafe fn viewDidUnload(&self);

        #[method(viewDidLoad)]
        pub unsafe fn viewDidLoad(&self);

        #[method(isViewLoaded)]
        pub unsafe fn isViewLoaded(&self) -> bool;

        #[deprecated = "Loading Interface Builder products will not be supported in a future version of visionOS."]
        #[method_id(@__retain_semantics Other nibName)]
        pub unsafe fn nibName(&self) -> Option<Retained<NSString>>;

        #[deprecated = "Loading Interface Builder products will not be supported in a future version of visionOS."]
        #[method_id(@__retain_semantics Other nibBundle)]
        pub unsafe fn nibBundle(&self) -> Option<Retained<NSBundle>>;

        #[cfg(feature = "UIStoryboard")]
        #[deprecated = "Loading Interface Builder products will not be supported in a future version of visionOS."]
        #[method_id(@__retain_semantics Other storyboard)]
        pub unsafe fn storyboard(&self) -> Option<Retained<UIStoryboard>>;

        #[deprecated = "Loading Interface Builder products will not be supported in a future version of visionOS."]
        #[method(performSegueWithIdentifier:sender:)]
        pub unsafe fn performSegueWithIdentifier_sender(
            &self,
            identifier: &NSString,
            sender: Option<&AnyObject>,
        );

        #[deprecated = "Loading Interface Builder products will not be supported in a future version of visionOS."]
        #[method(shouldPerformSegueWithIdentifier:sender:)]
        pub unsafe fn shouldPerformSegueWithIdentifier_sender(
            &self,
            identifier: &NSString,
            sender: Option<&AnyObject>,
        ) -> bool;

        #[cfg(feature = "UIStoryboardSegue")]
        #[deprecated = "Loading Interface Builder products will not be supported in a future version of visionOS."]
        #[method(prepareForSegue:sender:)]
        pub unsafe fn prepareForSegue_sender(
            &self,
            segue: &UIStoryboardSegue,
            sender: Option<&AnyObject>,
        );

        #[deprecated = "Loading Interface Builder products will not be supported in a future version of visionOS."]
        #[method(canPerformUnwindSegueAction:fromViewController:sender:)]
        pub unsafe fn canPerformUnwindSegueAction_fromViewController_sender(
            &self,
            action: Sel,
            from_view_controller: &UIViewController,
            sender: Option<&AnyObject>,
        ) -> bool;

        #[deprecated]
        #[method(canPerformUnwindSegueAction:fromViewController:withSender:)]
        pub unsafe fn canPerformUnwindSegueAction_fromViewController_withSender(
            &self,
            action: Sel,
            from_view_controller: &UIViewController,
            sender: &AnyObject,
        ) -> bool;

        #[cfg(feature = "UIStoryboardSegue")]
        #[deprecated = "Loading Interface Builder products will not be supported in a future version of visionOS."]
        #[method_id(@__retain_semantics Other allowedChildViewControllersForUnwindingFromSource:)]
        pub unsafe fn allowedChildViewControllersForUnwindingFromSource(
            &self,
            source: &UIStoryboardUnwindSegueSource,
        ) -> Retained<NSArray<UIViewController>>;

        #[cfg(feature = "UIStoryboardSegue")]
        #[deprecated = "Loading Interface Builder products will not be supported in a future version of visionOS."]
        #[method_id(@__retain_semantics Other childViewControllerContainingSegueSource:)]
        pub unsafe fn childViewControllerContainingSegueSource(
            &self,
            source: &UIStoryboardUnwindSegueSource,
        ) -> Option<Retained<UIViewController>>;

        #[deprecated]
        #[method_id(@__retain_semantics Other viewControllerForUnwindSegueAction:fromViewController:withSender:)]
        pub unsafe fn viewControllerForUnwindSegueAction_fromViewController_withSender(
            &self,
            action: Sel,
            from_view_controller: &UIViewController,
            sender: Option<&AnyObject>,
        ) -> Option<Retained<UIViewController>>;

        #[cfg(feature = "UIStoryboardSegue")]
        #[deprecated = "Loading Interface Builder products will not be supported in a future version of visionOS."]
        #[method(unwindForSegue:towardsViewController:)]
        pub unsafe fn unwindForSegue_towardsViewController(
            &self,
            unwind_segue: &UIStoryboardSegue,
            subsequent_vc: &UIViewController,
        );

        #[cfg(feature = "UIStoryboardSegue")]
        #[deprecated]
        #[method_id(@__retain_semantics Other segueForUnwindingToViewController:fromViewController:identifier:)]
        pub unsafe fn segueForUnwindingToViewController_fromViewController_identifier(
            &self,
            to_view_controller: &UIViewController,
            from_view_controller: &UIViewController,
            identifier: Option<&NSString>,
        ) -> Option<Retained<UIStoryboardSegue>>;

        #[method(viewWillAppear:)]
        pub unsafe fn viewWillAppear(&self, animated: bool);

        #[method(viewIsAppearing:)]
        pub unsafe fn viewIsAppearing(&self, animated: bool);

        #[method(viewDidAppear:)]
        pub unsafe fn viewDidAppear(&self, animated: bool);

        #[method(viewWillDisappear:)]
        pub unsafe fn viewWillDisappear(&self, animated: bool);

        #[method(viewDidDisappear:)]
        pub unsafe fn viewDidDisappear(&self, animated: bool);

        #[method(viewWillLayoutSubviews)]
        pub unsafe fn viewWillLayoutSubviews(&self);

        #[method(viewDidLayoutSubviews)]
        pub unsafe fn viewDidLayoutSubviews(&self);

        #[method_id(@__retain_semantics Other title)]
        pub unsafe fn title(&self) -> Option<Retained<NSString>>;

        #[method(setTitle:)]
        pub unsafe fn setTitle(&self, title: Option<&NSString>);

        #[method(didReceiveMemoryWarning)]
        pub unsafe fn didReceiveMemoryWarning(&self);

        #[method_id(@__retain_semantics Other parentViewController)]
        pub unsafe fn parentViewController(&self) -> Option<Retained<UIViewController>>;

        #[deprecated]
        #[method_id(@__retain_semantics Other modalViewController)]
        pub unsafe fn modalViewController(&self) -> Option<Retained<UIViewController>>;

        #[method_id(@__retain_semantics Other presentedViewController)]
        pub unsafe fn presentedViewController(&self) -> Option<Retained<UIViewController>>;

        #[method_id(@__retain_semantics Other presentingViewController)]
        pub unsafe fn presentingViewController(&self) -> Option<Retained<UIViewController>>;

        #[method(definesPresentationContext)]
        pub unsafe fn definesPresentationContext(&self) -> bool;

        #[method(setDefinesPresentationContext:)]
        pub unsafe fn setDefinesPresentationContext(&self, defines_presentation_context: bool);

        #[method(providesPresentationContextTransitionStyle)]
        pub unsafe fn providesPresentationContextTransitionStyle(&self) -> bool;

        #[method(setProvidesPresentationContextTransitionStyle:)]
        pub unsafe fn setProvidesPresentationContextTransitionStyle(
            &self,
            provides_presentation_context_transition_style: bool,
        );

        #[method(restoresFocusAfterTransition)]
        pub unsafe fn restoresFocusAfterTransition(&self) -> bool;

        #[method(setRestoresFocusAfterTransition:)]
        pub unsafe fn setRestoresFocusAfterTransition(&self, restores_focus_after_transition: bool);

        #[method_id(@__retain_semantics Other focusGroupIdentifier)]
        pub unsafe fn focusGroupIdentifier(&self) -> Option<Retained<NSString>>;

        #[method(setFocusGroupIdentifier:)]
        pub unsafe fn setFocusGroupIdentifier(&self, focus_group_identifier: Option<&NSString>);

        #[method_id(@__retain_semantics Other interactionActivityTrackingBaseName)]
        pub unsafe fn interactionActivityTrackingBaseName(&self) -> Option<Retained<NSString>>;

        #[method(setInteractionActivityTrackingBaseName:)]
        pub unsafe fn setInteractionActivityTrackingBaseName(
            &self,
            interaction_activity_tracking_base_name: Option<&NSString>,
        );

        #[method(isBeingPresented)]
        pub unsafe fn isBeingPresented(&self) -> bool;

        #[method(isBeingDismissed)]
        pub unsafe fn isBeingDismissed(&self) -> bool;

        #[method(isMovingToParentViewController)]
        pub unsafe fn isMovingToParentViewController(&self) -> bool;

        #[method(isMovingFromParentViewController)]
        pub unsafe fn isMovingFromParentViewController(&self) -> bool;

        #[cfg(feature = "block2")]
        #[method(presentViewController:animated:completion:)]
        pub unsafe fn presentViewController_animated_completion(
            &self,
            view_controller_to_present: &UIViewController,
            flag: bool,
            completion: Option<&block2::Block<dyn Fn()>>,
        );

        #[cfg(feature = "block2")]
        #[method(dismissViewControllerAnimated:completion:)]
        pub unsafe fn dismissViewControllerAnimated_completion(
            &self,
            flag: bool,
            completion: Option<&block2::Block<dyn Fn()>>,
        );

        #[deprecated]
        #[method(presentModalViewController:animated:)]
        pub unsafe fn presentModalViewController_animated(
            &self,
            modal_view_controller: &UIViewController,
            animated: bool,
        );

        #[deprecated]
        #[method(dismissModalViewControllerAnimated:)]
        pub unsafe fn dismissModalViewControllerAnimated(&self, animated: bool);

        #[method(modalTransitionStyle)]
        pub unsafe fn modalTransitionStyle(&self) -> UIModalTransitionStyle;

        #[method(setModalTransitionStyle:)]
        pub unsafe fn setModalTransitionStyle(
            &self,
            modal_transition_style: UIModalTransitionStyle,
        );

        #[method(modalPresentationStyle)]
        pub unsafe fn modalPresentationStyle(&self) -> UIModalPresentationStyle;

        #[method(setModalPresentationStyle:)]
        pub unsafe fn setModalPresentationStyle(
            &self,
            modal_presentation_style: UIModalPresentationStyle,
        );

        #[method(modalPresentationCapturesStatusBarAppearance)]
        pub unsafe fn modalPresentationCapturesStatusBarAppearance(&self) -> bool;

        #[method(setModalPresentationCapturesStatusBarAppearance:)]
        pub unsafe fn setModalPresentationCapturesStatusBarAppearance(
            &self,
            modal_presentation_captures_status_bar_appearance: bool,
        );

        #[method(disablesAutomaticKeyboardDismissal)]
        pub unsafe fn disablesAutomaticKeyboardDismissal(&self) -> bool;

        #[deprecated]
        #[method(wantsFullScreenLayout)]
        pub unsafe fn wantsFullScreenLayout(&self) -> bool;

        #[deprecated]
        #[method(setWantsFullScreenLayout:)]
        pub unsafe fn setWantsFullScreenLayout(&self, wants_full_screen_layout: bool);

        #[cfg(feature = "UIGeometry")]
        #[method(edgesForExtendedLayout)]
        pub unsafe fn edgesForExtendedLayout(&self) -> UIRectEdge;

        #[cfg(feature = "UIGeometry")]
        #[method(setEdgesForExtendedLayout:)]
        pub unsafe fn setEdgesForExtendedLayout(&self, edges_for_extended_layout: UIRectEdge);

        #[method(extendedLayoutIncludesOpaqueBars)]
        pub unsafe fn extendedLayoutIncludesOpaqueBars(&self) -> bool;

        #[method(setExtendedLayoutIncludesOpaqueBars:)]
        pub unsafe fn setExtendedLayoutIncludesOpaqueBars(
            &self,
            extended_layout_includes_opaque_bars: bool,
        );

        #[deprecated = "Use UIScrollView's contentInsetAdjustmentBehavior instead"]
        #[method(automaticallyAdjustsScrollViewInsets)]
        pub unsafe fn automaticallyAdjustsScrollViewInsets(&self) -> bool;

        #[deprecated = "Use UIScrollView's contentInsetAdjustmentBehavior instead"]
        #[method(setAutomaticallyAdjustsScrollViewInsets:)]
        pub unsafe fn setAutomaticallyAdjustsScrollViewInsets(
            &self,
            automatically_adjusts_scroll_view_insets: bool,
        );

        #[cfg(all(feature = "UIGeometry", feature = "UIScrollView", feature = "UIView"))]
        #[method(setContentScrollView:forEdge:)]
        pub unsafe fn setContentScrollView_forEdge(
            &self,
            scroll_view: Option<&UIScrollView>,
            edge: NSDirectionalRectEdge,
        );

        #[cfg(all(feature = "UIGeometry", feature = "UIScrollView", feature = "UIView"))]
        #[method_id(@__retain_semantics Other contentScrollViewForEdge:)]
        pub unsafe fn contentScrollViewForEdge(
            &self,
            edge: NSDirectionalRectEdge,
        ) -> Option<Retained<UIScrollView>>;

        #[method(preferredContentSize)]
        pub unsafe fn preferredContentSize(&self) -> CGSize;

        #[method(setPreferredContentSize:)]
        pub unsafe fn setPreferredContentSize(&self, preferred_content_size: CGSize);

        #[cfg(feature = "UIApplication")]
        #[deprecated = "Has no effect on visionOS"]
        #[method(preferredStatusBarStyle)]
        pub unsafe fn preferredStatusBarStyle(&self) -> UIStatusBarStyle;

        #[deprecated = "Has no effect on visionOS"]
        #[method(prefersStatusBarHidden)]
        pub unsafe fn prefersStatusBarHidden(&self) -> bool;

        #[cfg(feature = "UIApplication")]
        #[deprecated = "Has no effect on visionOS"]
        #[method(preferredStatusBarUpdateAnimation)]
        pub unsafe fn preferredStatusBarUpdateAnimation(&self) -> UIStatusBarAnimation;

        #[method(setNeedsStatusBarAppearanceUpdate)]
        pub fn setNeedsStatusBarAppearanceUpdate(&self);

        #[method_id(@__retain_semantics Other targetViewControllerForAction:sender:)]
        pub unsafe fn targetViewControllerForAction_sender(
            &self,
            action: Sel,
            sender: Option<&AnyObject>,
        ) -> Option<Retained<UIViewController>>;

        #[method(showViewController:sender:)]
        pub unsafe fn showViewController_sender(
            &self,
            vc: &UIViewController,
            sender: Option<&AnyObject>,
        );

        #[method(showDetailViewController:sender:)]
        pub unsafe fn showDetailViewController_sender(
            &self,
            vc: &UIViewController,
            sender: Option<&AnyObject>,
        );

        #[cfg(feature = "UIInterface")]
        #[method(preferredUserInterfaceStyle)]
        pub unsafe fn preferredUserInterfaceStyle(&self) -> UIUserInterfaceStyle;

        #[method(setNeedsUserInterfaceAppearanceUpdate)]
        pub unsafe fn setNeedsUserInterfaceAppearanceUpdate(&self);

        #[cfg(feature = "UIInterface")]
        #[method(overrideUserInterfaceStyle)]
        pub unsafe fn overrideUserInterfaceStyle(&self) -> UIUserInterfaceStyle;

        #[cfg(feature = "UIInterface")]
        #[method(setOverrideUserInterfaceStyle:)]
        pub unsafe fn setOverrideUserInterfaceStyle(
            &self,
            override_user_interface_style: UIUserInterfaceStyle,
        );
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new(mtm: MainThreadMarker) -> Retained<Self>;
    }
);

extern_methods!(
    /// UIViewControllerRotation
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[deprecated = "Please use instance method `setNeedsUpdateOfSupportedInterfaceOrientations`."]
        #[method(attemptRotationToDeviceOrientation)]
        pub fn attemptRotationToDeviceOrientation(mtm: MainThreadMarker);

        #[cfg(feature = "UIOrientation")]
        #[deprecated]
        #[method(shouldAutorotateToInterfaceOrientation:)]
        pub unsafe fn shouldAutorotateToInterfaceOrientation(
            &self,
            to_interface_orientation: UIInterfaceOrientation,
        ) -> bool;

        #[deprecated = "Update supported interface orientations and call setNeedsUpdateOfSupportedInterfaceOrientations to indicate a change."]
        #[method(shouldAutorotate)]
        pub unsafe fn shouldAutorotate(&self) -> bool;

        #[cfg(feature = "UIOrientation")]
        #[method(supportedInterfaceOrientations)]
        pub unsafe fn supportedInterfaceOrientations(&self) -> UIInterfaceOrientationMask;

        #[cfg(feature = "UIOrientation")]
        #[method(preferredInterfaceOrientationForPresentation)]
        pub unsafe fn preferredInterfaceOrientationForPresentation(&self)
            -> UIInterfaceOrientation;

        #[method(setNeedsUpdateOfSupportedInterfaceOrientations)]
        pub unsafe fn setNeedsUpdateOfSupportedInterfaceOrientations(&self);

        #[cfg(feature = "UIView")]
        #[deprecated = "Header views are animated along with the rest of the view hierarchy"]
        #[method_id(@__retain_semantics Other rotatingHeaderView)]
        pub unsafe fn rotatingHeaderView(&self) -> Option<Retained<UIView>>;

        #[cfg(feature = "UIView")]
        #[deprecated = "Footer views are animated along with the rest of the view hierarchy"]
        #[method_id(@__retain_semantics Other rotatingFooterView)]
        pub unsafe fn rotatingFooterView(&self) -> Option<Retained<UIView>>;

        #[cfg(feature = "UIOrientation")]
        #[deprecated]
        #[method(interfaceOrientation)]
        pub unsafe fn interfaceOrientation(&self) -> UIInterfaceOrientation;

        #[cfg(feature = "UIOrientation")]
        #[deprecated = "Implement viewWillTransitionToSize:withTransitionCoordinator: instead"]
        #[method(willRotateToInterfaceOrientation:duration:)]
        pub unsafe fn willRotateToInterfaceOrientation_duration(
            &self,
            to_interface_orientation: UIInterfaceOrientation,
            duration: NSTimeInterval,
        );

        #[cfg(feature = "UIOrientation")]
        #[deprecated]
        #[method(didRotateFromInterfaceOrientation:)]
        pub unsafe fn didRotateFromInterfaceOrientation(
            &self,
            from_interface_orientation: UIInterfaceOrientation,
        );

        #[cfg(feature = "UIOrientation")]
        #[deprecated = "Implement viewWillTransitionToSize:withTransitionCoordinator: instead"]
        #[method(willAnimateRotationToInterfaceOrientation:duration:)]
        pub unsafe fn willAnimateRotationToInterfaceOrientation_duration(
            &self,
            to_interface_orientation: UIInterfaceOrientation,
            duration: NSTimeInterval,
        );

        #[cfg(feature = "UIOrientation")]
        #[deprecated]
        #[method(willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:)]
        pub unsafe fn willAnimateFirstHalfOfRotationToInterfaceOrientation_duration(
            &self,
            to_interface_orientation: UIInterfaceOrientation,
            duration: NSTimeInterval,
        );

        #[cfg(feature = "UIOrientation")]
        #[deprecated]
        #[method(didAnimateFirstHalfOfRotationToInterfaceOrientation:)]
        pub unsafe fn didAnimateFirstHalfOfRotationToInterfaceOrientation(
            &self,
            to_interface_orientation: UIInterfaceOrientation,
        );

        #[cfg(feature = "UIOrientation")]
        #[deprecated]
        #[method(willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:)]
        pub unsafe fn willAnimateSecondHalfOfRotationFromInterfaceOrientation_duration(
            &self,
            from_interface_orientation: UIInterfaceOrientation,
            duration: NSTimeInterval,
        );
    }
);

extern_methods!(
    /// UIViewControllerEditing
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[method(isEditing)]
        pub unsafe fn isEditing(&self) -> bool;

        #[method(setEditing:)]
        pub unsafe fn setEditing(&self, editing: bool);

        #[method(setEditing:animated:)]
        pub unsafe fn setEditing_animated(&self, editing: bool, animated: bool);

        #[cfg(all(feature = "UIBarButtonItem", feature = "UIBarItem"))]
        #[method_id(@__retain_semantics Other editButtonItem)]
        pub unsafe fn editButtonItem(&self) -> Retained<UIBarButtonItem>;
    }
);

extern_methods!(
    /// UISearchDisplayControllerSupport
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[cfg(feature = "UISearchDisplayController")]
        #[deprecated]
        #[method_id(@__retain_semantics Other searchDisplayController)]
        pub unsafe fn searchDisplayController(&self)
            -> Option<Retained<UISearchDisplayController>>;
    }
);

extern "C" {
    pub static UIViewControllerHierarchyInconsistencyException: &'static NSExceptionName;
}

extern_methods!(
    /// UIContainerViewControllerProtectedMethods
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[method_id(@__retain_semantics Other childViewControllers)]
        pub unsafe fn childViewControllers(&self) -> Retained<NSArray<UIViewController>>;

        #[method(addChildViewController:)]
        pub unsafe fn addChildViewController(&self, child_controller: &UIViewController);

        #[method(removeFromParentViewController)]
        pub unsafe fn removeFromParentViewController(&self);

        #[cfg(all(feature = "UIView", feature = "block2"))]
        #[method(transitionFromViewController:toViewController:duration:options:animations:completion:)]
        pub unsafe fn transitionFromViewController_toViewController_duration_options_animations_completion(
            &self,
            from_view_controller: &UIViewController,
            to_view_controller: &UIViewController,
            duration: NSTimeInterval,
            options: UIViewAnimationOptions,
            animations: Option<&block2::Block<dyn Fn()>>,
            completion: Option<&block2::Block<dyn Fn(Bool)>>,
        );

        #[method(beginAppearanceTransition:animated:)]
        pub unsafe fn beginAppearanceTransition_animated(&self, is_appearing: bool, animated: bool);

        #[method(endAppearanceTransition)]
        pub unsafe fn endAppearanceTransition(&self);

        #[deprecated = "Has no effect on visionOS"]
        #[method_id(@__retain_semantics Other childViewControllerForStatusBarStyle)]
        pub unsafe fn childViewControllerForStatusBarStyle(
            &self,
        ) -> Option<Retained<UIViewController>>;

        #[deprecated = "Has no effect on visionOS"]
        #[method_id(@__retain_semantics Other childViewControllerForStatusBarHidden)]
        pub unsafe fn childViewControllerForStatusBarHidden(
            &self,
        ) -> Option<Retained<UIViewController>>;

        #[cfg(feature = "UITraitCollection")]
        #[deprecated = "Use the traitOverrides property on the child view controller instead"]
        #[method(setOverrideTraitCollection:forChildViewController:)]
        pub unsafe fn setOverrideTraitCollection_forChildViewController(
            &self,
            collection: Option<&UITraitCollection>,
            child_view_controller: &UIViewController,
        );

        #[cfg(feature = "UITraitCollection")]
        #[deprecated = "Use the traitOverrides property on the child view controller instead"]
        #[method_id(@__retain_semantics Other overrideTraitCollectionForChildViewController:)]
        pub unsafe fn overrideTraitCollectionForChildViewController(
            &self,
            child_view_controller: &UIViewController,
        ) -> Option<Retained<UITraitCollection>>;

        #[method_id(@__retain_semantics Other childViewControllerForUserInterfaceStyle)]
        pub unsafe fn childViewControllerForUserInterfaceStyle(
            &self,
        ) -> Option<Retained<UIViewController>>;
    }
);

extern_methods!(
    /// UIContainerViewControllerCallbacks
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[deprecated]
        #[method(automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers)]
        pub unsafe fn automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers(
            &self,
        ) -> bool;

        #[deprecated = "Manually forward viewWillTransitionToSize:withTransitionCoordinator: if necessary"]
        #[method(shouldAutomaticallyForwardRotationMethods)]
        pub unsafe fn shouldAutomaticallyForwardRotationMethods(&self) -> bool;

        #[method(shouldAutomaticallyForwardAppearanceMethods)]
        pub unsafe fn shouldAutomaticallyForwardAppearanceMethods(&self) -> bool;

        #[method(willMoveToParentViewController:)]
        pub unsafe fn willMoveToParentViewController(&self, parent: Option<&UIViewController>);

        #[method(didMoveToParentViewController:)]
        pub unsafe fn didMoveToParentViewController(&self, parent: Option<&UIViewController>);
    }
);

extern_methods!(
    /// UIStateRestoration
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[method_id(@__retain_semantics Other restorationIdentifier)]
        pub unsafe fn restorationIdentifier(&self) -> Option<Retained<NSString>>;

        #[method(setRestorationIdentifier:)]
        pub unsafe fn setRestorationIdentifier(&self, restoration_identifier: Option<&NSString>);

        #[cfg(feature = "UIStateRestoration")]
        #[method(restorationClass)]
        pub unsafe fn restorationClass(&self) -> Option<&'static AnyClass>;

        #[cfg(feature = "UIStateRestoration")]
        #[method(setRestorationClass:)]
        pub unsafe fn setRestorationClass(&self, restoration_class: Option<&AnyClass>);

        #[method(encodeRestorableStateWithCoder:)]
        pub unsafe fn encodeRestorableStateWithCoder(&self, coder: &NSCoder);

        #[method(decodeRestorableStateWithCoder:)]
        pub unsafe fn decodeRestorableStateWithCoder(&self, coder: &NSCoder);

        #[method(applicationFinishedRestoringState)]
        pub unsafe fn applicationFinishedRestoringState(&self);
    }
);

#[cfg(all(feature = "UIResponder", feature = "UIStateRestoration"))]
unsafe impl UIStateRestoring for UIViewController {}

extern_methods!(
    /// UIConstraintBasedLayoutCoreMethods
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[method(updateViewConstraints)]
        pub unsafe fn updateViewConstraints(&self);
    }
);

extern_methods!(
    /// UIViewControllerTransitioning
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[cfg(feature = "UIViewControllerTransitioning")]
        #[method_id(@__retain_semantics Other transitioningDelegate)]
        pub unsafe fn transitioningDelegate(
            &self,
        ) -> Option<Retained<ProtocolObject<dyn UIViewControllerTransitioningDelegate>>>;

        #[cfg(feature = "UIViewControllerTransitioning")]
        #[method(setTransitioningDelegate:)]
        pub unsafe fn setTransitioningDelegate(
            &self,
            transitioning_delegate: Option<
                &ProtocolObject<dyn UIViewControllerTransitioningDelegate>,
            >,
        );
    }
);

extern_methods!(
    /// UILayoutSupport
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[cfg(feature = "NSLayoutConstraint")]
        #[deprecated = "Use view.safeAreaLayoutGuide.topAnchor instead of topLayoutGuide.bottomAnchor"]
        #[method_id(@__retain_semantics Other topLayoutGuide)]
        pub unsafe fn topLayoutGuide(&self) -> Retained<ProtocolObject<dyn UILayoutSupport>>;

        #[cfg(feature = "NSLayoutConstraint")]
        #[deprecated = "Use view.safeAreaLayoutGuide.bottomAnchor instead of bottomLayoutGuide.topAnchor"]
        #[method_id(@__retain_semantics Other bottomLayoutGuide)]
        pub unsafe fn bottomLayoutGuide(&self) -> Retained<ProtocolObject<dyn UILayoutSupport>>;

        #[cfg(feature = "UIGeometry")]
        #[method(additionalSafeAreaInsets)]
        pub unsafe fn additionalSafeAreaInsets(&self) -> UIEdgeInsets;

        #[cfg(feature = "UIGeometry")]
        #[method(setAdditionalSafeAreaInsets:)]
        pub unsafe fn setAdditionalSafeAreaInsets(&self, additional_safe_area_insets: UIEdgeInsets);

        #[cfg(feature = "UIGeometry")]
        #[method(systemMinimumLayoutMargins)]
        pub unsafe fn systemMinimumLayoutMargins(&self) -> NSDirectionalEdgeInsets;

        #[method(viewRespectsSystemMinimumLayoutMargins)]
        pub unsafe fn viewRespectsSystemMinimumLayoutMargins(&self) -> bool;

        #[method(setViewRespectsSystemMinimumLayoutMargins:)]
        pub unsafe fn setViewRespectsSystemMinimumLayoutMargins(
            &self,
            view_respects_system_minimum_layout_margins: bool,
        );

        #[method(viewLayoutMarginsDidChange)]
        pub unsafe fn viewLayoutMarginsDidChange(&self);

        #[method(viewSafeAreaInsetsDidChange)]
        pub unsafe fn viewSafeAreaInsetsDidChange(&self);
    }
);

extern_methods!(
    /// UIKeyCommand
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[cfg(all(
            feature = "UICommand",
            feature = "UIKeyCommand",
            feature = "UIMenuElement"
        ))]
        #[method(addKeyCommand:)]
        pub unsafe fn addKeyCommand(&self, key_command: &UIKeyCommand);

        #[cfg(all(
            feature = "UICommand",
            feature = "UIKeyCommand",
            feature = "UIMenuElement"
        ))]
        #[method(removeKeyCommand:)]
        pub unsafe fn removeKeyCommand(&self, key_command: &UIKeyCommand);
    }
);

extern_methods!(
    /// UIPerformsActions
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[method(performsActionsWhilePresentingModally)]
        pub unsafe fn performsActionsWhilePresentingModally(&self) -> bool;
    }
);

extern_methods!(
    /// NSExtensionAdditions
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[method_id(@__retain_semantics Other extensionContext)]
        pub unsafe fn extensionContext(&self) -> Option<Retained<NSExtensionContext>>;
    }
);

#[cfg(feature = "UIResponder")]
unsafe impl NSExtensionRequestHandling for UIViewController {}

extern_methods!(
    /// UIPresentationController
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[cfg(feature = "UIPresentationController")]
        #[method_id(@__retain_semantics Other presentationController)]
        pub unsafe fn presentationController(&self) -> Option<Retained<UIPresentationController>>;

        #[cfg(all(
            feature = "UIPresentationController",
            feature = "UISheetPresentationController"
        ))]
        #[method_id(@__retain_semantics Other sheetPresentationController)]
        pub unsafe fn sheetPresentationController(
            &self,
        ) -> Option<Retained<UISheetPresentationController>>;

        #[cfg(all(
            feature = "UIPopoverPresentationController",
            feature = "UIPresentationController"
        ))]
        #[method_id(@__retain_semantics Other popoverPresentationController)]
        pub unsafe fn popoverPresentationController(
            &self,
        ) -> Option<Retained<UIPopoverPresentationController>>;

        #[cfg(feature = "UIPresentationController")]
        #[method_id(@__retain_semantics Other activePresentationController)]
        pub unsafe fn activePresentationController(
            &self,
        ) -> Option<Retained<UIPresentationController>>;

        #[method(isModalInPresentation)]
        pub unsafe fn isModalInPresentation(&self) -> bool;

        #[method(setModalInPresentation:)]
        pub unsafe fn setModalInPresentation(&self, modal_in_presentation: bool);
    }
);

extern_protocol!(
    pub unsafe trait UIViewControllerPreviewing:
        NSObjectProtocol + IsMainThreadOnly
    {
        #[cfg(feature = "UIGestureRecognizer")]
        #[deprecated = "UIViewControllerPreviewing is deprecated. Please use UIContextMenuInteraction."]
        #[method_id(@__retain_semantics Other previewingGestureRecognizerForFailureRelationship)]
        unsafe fn previewingGestureRecognizerForFailureRelationship(
            &self,
        ) -> Retained<UIGestureRecognizer>;

        #[deprecated = "UIViewControllerPreviewing is deprecated. Please use UIContextMenuInteraction."]
        #[method_id(@__retain_semantics Other delegate)]
        unsafe fn delegate(
            &self,
        ) -> Retained<ProtocolObject<dyn UIViewControllerPreviewingDelegate>>;

        #[cfg(all(feature = "UIResponder", feature = "UIView"))]
        #[deprecated = "UIViewControllerPreviewing is deprecated. Please use UIContextMenuInteraction."]
        #[method_id(@__retain_semantics Other sourceView)]
        unsafe fn sourceView(&self) -> Retained<UIView>;

        #[deprecated = "UIViewControllerPreviewing is deprecated. Please use UIContextMenuInteraction."]
        #[method(sourceRect)]
        unsafe fn sourceRect(&self) -> CGRect;

        #[deprecated = "UIViewControllerPreviewing is deprecated. Please use UIContextMenuInteraction."]
        #[method(setSourceRect:)]
        unsafe fn setSourceRect(&self, source_rect: CGRect);
    }

    unsafe impl ProtocolType for dyn UIViewControllerPreviewing {}
);

extern_protocol!(
    pub unsafe trait UIViewControllerPreviewingDelegate:
        NSObjectProtocol + IsMainThreadOnly
    {
        #[cfg(feature = "UIResponder")]
        #[deprecated = "UIViewControllerPreviewing is deprecated. Please use UIContextMenuInteraction."]
        #[method_id(@__retain_semantics Other previewingContext:viewControllerForLocation:)]
        unsafe fn previewingContext_viewControllerForLocation(
            &self,
            previewing_context: &ProtocolObject<dyn UIViewControllerPreviewing>,
            location: CGPoint,
        ) -> Option<Retained<UIViewController>>;

        #[cfg(feature = "UIResponder")]
        #[deprecated = "UIViewControllerPreviewing is deprecated. Please use UIContextMenuInteraction."]
        #[method(previewingContext:commitViewController:)]
        unsafe fn previewingContext_commitViewController(
            &self,
            previewing_context: &ProtocolObject<dyn UIViewControllerPreviewing>,
            view_controller_to_commit: &UIViewController,
        );
    }

    unsafe impl ProtocolType for dyn UIViewControllerPreviewingDelegate {}
);

extern_methods!(
    /// UIViewControllerPreviewingRegistration
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[cfg(feature = "UIView")]
        #[deprecated = "UIViewControllerPreviewing is deprecated. Please use UIContextMenuInteraction."]
        #[method_id(@__retain_semantics Other registerForPreviewingWithDelegate:sourceView:)]
        pub unsafe fn registerForPreviewingWithDelegate_sourceView(
            &self,
            delegate: &ProtocolObject<dyn UIViewControllerPreviewingDelegate>,
            source_view: &UIView,
        ) -> Retained<ProtocolObject<dyn UIViewControllerPreviewing>>;

        #[deprecated = "UIViewControllerPreviewing is deprecated. Please use UIContextMenuInteraction."]
        #[method(unregisterForPreviewingWithContext:)]
        pub unsafe fn unregisterForPreviewingWithContext(
            &self,
            previewing: &ProtocolObject<dyn UIViewControllerPreviewing>,
        );
    }
);

extern_methods!(
    /// UIScreenEdgesDeferringSystemGestures
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[method_id(@__retain_semantics Other childViewControllerForScreenEdgesDeferringSystemGestures)]
        pub unsafe fn childViewControllerForScreenEdgesDeferringSystemGestures(
            &self,
        ) -> Option<Retained<UIViewController>>;

        #[cfg(feature = "UIGeometry")]
        #[method(preferredScreenEdgesDeferringSystemGestures)]
        pub unsafe fn preferredScreenEdgesDeferringSystemGestures(&self) -> UIRectEdge;

        #[method(setNeedsUpdateOfScreenEdgesDeferringSystemGestures)]
        pub fn setNeedsUpdateOfScreenEdgesDeferringSystemGestures(&self);
    }
);

extern_methods!(
    /// UIHomeIndicatorAutoHidden
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[method_id(@__retain_semantics Other childViewControllerForHomeIndicatorAutoHidden)]
        pub unsafe fn childViewControllerForHomeIndicatorAutoHidden(
            &self,
        ) -> Option<Retained<UIViewController>>;

        #[method(prefersHomeIndicatorAutoHidden)]
        pub unsafe fn prefersHomeIndicatorAutoHidden(&self) -> bool;

        #[method(setNeedsUpdateOfHomeIndicatorAutoHidden)]
        pub fn setNeedsUpdateOfHomeIndicatorAutoHidden(&self);
    }
);

extern_methods!(
    /// UIPointerLockSupport
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[method_id(@__retain_semantics Other childViewControllerForPointerLock)]
        pub unsafe fn childViewControllerForPointerLock(
            &self,
        ) -> Option<Retained<UIViewController>>;

        #[method(prefersPointerLocked)]
        pub unsafe fn prefersPointerLocked(&self) -> bool;

        #[method(setNeedsUpdateOfPrefersPointerLocked)]
        pub unsafe fn setNeedsUpdateOfPrefersPointerLocked(&self);
    }
);

extern_methods!(
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[cfg(feature = "UIContentConfiguration")]
        #[method_id(@__retain_semantics Other contentUnavailableConfiguration)]
        pub unsafe fn contentUnavailableConfiguration(
            &self,
        ) -> Option<Retained<ProtocolObject<dyn UIContentConfiguration>>>;

        #[cfg(feature = "UIContentConfiguration")]
        #[method(setContentUnavailableConfiguration:)]
        pub unsafe fn setContentUnavailableConfiguration(
            &self,
            content_unavailable_configuration: Option<&ProtocolObject<dyn UIContentConfiguration>>,
        );

        #[cfg(feature = "UIContentUnavailableConfigurationState")]
        #[method_id(@__retain_semantics Other contentUnavailableConfigurationState)]
        pub unsafe fn contentUnavailableConfigurationState(
            &self,
        ) -> Retained<UIContentUnavailableConfigurationState>;

        #[method(setNeedsUpdateContentUnavailableConfiguration)]
        pub unsafe fn setNeedsUpdateContentUnavailableConfiguration(&self);

        #[cfg(feature = "UIContentUnavailableConfigurationState")]
        #[method(updateContentUnavailableConfigurationUsingState:)]
        pub unsafe fn updateContentUnavailableConfigurationUsingState(
            &self,
            state: &UIContentUnavailableConfigurationState,
        );
    }
);

extern_methods!(
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[deprecated = "UIViewControllerPreviewing is deprecated. Please use UIContextMenuInteraction."]
        #[method_id(@__retain_semantics Other previewActionItems)]
        pub unsafe fn previewActionItems(
            &self,
        ) -> Retained<NSArray<ProtocolObject<dyn UIPreviewActionItem>>>;
    }
);

extern_methods!(
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[cfg(feature = "UITraitCollection")]
        #[method_id(@__retain_semantics Other traitOverrides)]
        pub unsafe fn traitOverrides(&self) -> Retained<ProtocolObject<dyn UITraitOverrides>>;

        #[method(updateTraitsIfNeeded)]
        pub unsafe fn updateTraitsIfNeeded(&self);
    }
);

#[cfg(all(feature = "UIResponder", feature = "UITraitCollection"))]
unsafe impl UITraitChangeObservable for UIViewController {}

// NS_ENUM
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct UIContainerBackgroundStyle(pub NSInteger);
impl UIContainerBackgroundStyle {
    #[doc(alias = "UIContainerBackgroundStyleAutomatic")]
    pub const Automatic: Self = Self(0);
    #[doc(alias = "UIContainerBackgroundStyleGlass")]
    pub const Glass: Self = Self(1);
    #[doc(alias = "UIContainerBackgroundStyleHidden")]
    pub const Hidden: Self = Self(2);
}

unsafe impl Encode for UIContainerBackgroundStyle {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

unsafe impl RefEncode for UIContainerBackgroundStyle {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

extern_methods!(
    #[cfg(feature = "UIResponder")]
    unsafe impl UIViewController {
        #[method(preferredContainerBackgroundStyle)]
        pub unsafe fn preferredContainerBackgroundStyle(&self) -> UIContainerBackgroundStyle;

        #[method_id(@__retain_semantics Other childViewControllerForPreferredContainerBackgroundStyle)]
        pub unsafe fn childViewControllerForPreferredContainerBackgroundStyle(
            &self,
        ) -> Option<Retained<UIViewController>>;

        #[method(setNeedsUpdateOfPreferredContainerBackgroundStyle)]
        pub unsafe fn setNeedsUpdateOfPreferredContainerBackgroundStyle(&self);
    }
);

extern_protocol!(
    pub unsafe trait UIPreviewActionItem: NSObjectProtocol + IsMainThreadOnly {
        #[method_id(@__retain_semantics Other title)]
        unsafe fn title(&self) -> Retained<NSString>;
    }

    unsafe impl ProtocolType for dyn UIPreviewActionItem {}
);

// NS_ENUM
#[deprecated = "Please use UIContextMenuInteraction."]
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct UIPreviewActionStyle(pub NSInteger);
impl UIPreviewActionStyle {
    #[deprecated = "Please use UIContextMenuInteraction."]
    #[doc(alias = "UIPreviewActionStyleDefault")]
    pub const Default: Self = Self(0);
    #[deprecated = "Please use UIContextMenuInteraction."]
    #[doc(alias = "UIPreviewActionStyleSelected")]
    pub const Selected: Self = Self(1);
    #[deprecated = "Please use UIContextMenuInteraction."]
    #[doc(alias = "UIPreviewActionStyleDestructive")]
    pub const Destructive: Self = Self(2);
}

unsafe impl Encode for UIPreviewActionStyle {
    const ENCODING: Encoding = NSInteger::ENCODING;
}

unsafe impl RefEncode for UIPreviewActionStyle {
    const ENCODING_REF: Encoding = Encoding::Pointer(&Self::ENCODING);
}

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[deprecated = "Please use UIContextMenuInteraction."]
    pub struct UIPreviewAction;

    unsafe impl ClassType for UIPreviewAction {
        type Super = NSObject;
        type Mutability = MainThreadOnly;
    }
);

unsafe impl NSCopying for UIPreviewAction {}

unsafe impl NSObjectProtocol for UIPreviewAction {}

unsafe impl UIPreviewActionItem for UIPreviewAction {}

extern_methods!(
    unsafe impl UIPreviewAction {
        #[cfg(all(feature = "UIResponder", feature = "block2"))]
        #[deprecated = "Please use UIContextMenuInteraction."]
        #[method(handler)]
        pub unsafe fn handler(
            &self,
        ) -> NonNull<
            block2::Block<
                dyn Fn(NonNull<ProtocolObject<dyn UIPreviewActionItem>>, NonNull<UIViewController>),
            >,
        >;

        #[cfg(all(feature = "UIResponder", feature = "block2"))]
        #[deprecated = "Please use UIContextMenuInteraction."]
        #[method_id(@__retain_semantics Other actionWithTitle:style:handler:)]
        pub unsafe fn actionWithTitle_style_handler(
            title: &NSString,
            style: UIPreviewActionStyle,
            handler: &block2::Block<dyn Fn(NonNull<UIPreviewAction>, NonNull<UIViewController>)>,
            mtm: MainThreadMarker,
        ) -> Retained<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl UIPreviewAction {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new(mtm: MainThreadMarker) -> Retained<Self>;
    }
);

extern_class!(
    #[derive(Debug, PartialEq, Eq, Hash)]
    #[deprecated = "Please use UIContextMenuInteraction."]
    pub struct UIPreviewActionGroup;

    unsafe impl ClassType for UIPreviewActionGroup {
        type Super = NSObject;
        type Mutability = MainThreadOnly;
    }
);

unsafe impl NSCopying for UIPreviewActionGroup {}

unsafe impl NSObjectProtocol for UIPreviewActionGroup {}

unsafe impl UIPreviewActionItem for UIPreviewActionGroup {}

extern_methods!(
    unsafe impl UIPreviewActionGroup {
        #[deprecated = "Please use UIContextMenuInteraction."]
        #[method_id(@__retain_semantics Other actionGroupWithTitle:style:actions:)]
        pub unsafe fn actionGroupWithTitle_style_actions(
            title: &NSString,
            style: UIPreviewActionStyle,
            actions: &NSArray<UIPreviewAction>,
            mtm: MainThreadMarker,
        ) -> Retained<Self>;
    }
);

extern_methods!(
    /// Methods declared on superclass `NSObject`
    unsafe impl UIPreviewActionGroup {
        #[method_id(@__retain_semantics Init init)]
        pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;

        #[method_id(@__retain_semantics New new)]
        pub unsafe fn new(mtm: MainThreadMarker) -> Retained<Self>;
    }
);
