gpt4 book ai didi

ios - 扩展单元转换

转载 作者:行者123 更新时间:2023-11-28 16:16:14 25 4
gpt4 key购买 nike

我正在关注 https://github.com/RabbitMC/inbox-replica制作收件箱副本转换的 Objective-C 版本,但我被困在无法制作 Objective-C 代码的代码处。

这是 Swift 代码:

func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
let duration = transitionDuration(transitionContext)
let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
let containerView = transitionContext.containerView()


var foregroundViewController = toViewController
var backgroundViewController = fromViewController

if type == .Dismissing {
foregroundViewController = fromViewController
backgroundViewController = toViewController
}

// get target view
var targetViewController = backgroundViewController
if let navController = targetViewController as? UINavigationController {
targetViewController = navController.topViewController!
}

let targetViewMaybe = (targetViewController as? ExpandingTransitionPresentingViewController)?.expandingTransitionTargetViewForTransition(self)

这是我的 Objective-C 代码:

-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
NSTimeInterval duration = [self transitionDuration:transitionContext];
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *containerView = [transitionContext containerView];

UIViewController *foregroundViewController = toViewController;
UIViewController *backgroundViewController = fromViewController;

if (type == Dismissing) {
foregroundViewController = fromViewController;
backgroundViewController = toViewController;
}

//get the target view
UIViewController *targetViewController = backgroundViewController;
if ([targetViewController isKindOfClass:[UINavigationController class]]) {
UINavigationController *navController = (UINavigationController *)targetViewController;
targetViewController = navController.topViewController;
}

UIView *targetViewMaybe = ([targetViewController conformsToProtocol:@protocol(ExpandingTransitionPresentingViewController)])?[targetViewController expandingTransitionTargetViewForTransition:self]:assert(targetViewMaybe != nil);

现在问题出在我不得不调用 targetViewController 上的协议(protocol)方法,这是一个 UIViewController 但编译器提示我错误:

UIViewController does not have visible interface that declares the selector 'expandingTransitionTargetViewForTransition'

最佳答案

问题的原因是targetViewControllerUIViewController类型。但是您尝试从某些协议(protocol)调用方法。解决方案是在检查它确实符合协议(protocol)后,将指针转换为适当的类型。

帮自己一个忙,避免像最后一行那样冗长、难以阅读且无法调试的行:

UIView *targetViewMaybe = ([targetViewController conformsToProtocol:@protocol(ExpandingTransitionPresentingViewController)])?[targetViewController expandingTransitionTargetViewForTransition:self]:assert(targetViewMaybe != nil);

将其拆分为易于管理的内容。以下解决了该问题并使代码更易于阅读和调试:

if ([targetViewController conformsToProtocol:@protocol(ExpandingTransitionPresentingViewController)]) {
id<ExpandingTransitionPresentingViewController> controller = (id<ExpandingTransitionPresentingViewController>)targetViewController;
UIView *targetView = [controller expandingTransitionTargetViewForTransition:self];
// Do something with targetView
} else {
// Handle as needed
}

关于ios - 扩展单元转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39050891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com