gpt4 book ai didi

ios - willMoveToWindow 被调用两次

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:34:16 24 4
gpt4 key购买 nike

我在调整 willMoveToWindow: 时遇到一个问题,它在 View 上被调用了两次。

当一个新的 View Controller 被推送到一个 UINavigationController 上时,

willMoveToWindow: 在具有 nil 值的现有 View 上调用(有意义,因为 View 正在移出屏幕)

在那之后,方法 willMoveToWindow: 被再次调用,但现在与原始窗口一起调用。

我最初的想法是在原始方法开始之前调配并调用 window 属性。

为了安全起见,我创建了一个小型示例项目并确认了相同的行为。

基本上我需要一种方法来确定 View 不在 window 上(因为当 View 移动到实际上不应该运行的窗口时我正在触发逻辑(在至少不是两次))

作为引用,可以使用以下代码重现该问题:

  @implementation RandomView

-(void)willMoveToWindow:(UIWindow *)newWindow {
// when the new view controller is pushed -
//the method is called twice on the existing view (on the screen view)-
//first time will be called with nil -
//second time with the original window
NSLog(@"********%s <RandomView %p> <Window %p>",__PRETTY_FUNCTION__,self,newWindow);
}

-(void)didMoveToWindow {
NSLog(@"********%s <RandomView %p> <Window %p>",__PRETTY_FUNCTION__,self,self.window);
}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
RandomView *k = [[RandomView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:k];
}


-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
ViewController *vc = [[ViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
});
});

//[self becomeFirstResponder];
}
@end

编辑控制台

    [RandomView willMoveToWindow:] <RandomView 0x7f8b21e16630> <Window 0x7f8b21d220d0>
[RandomView didMoveToWindow] <RandomView 0x7f8b21e16630> <Window 0x7f8b21d220d0>
//THIS IS THE ISSUE
[RandomView willMoveToWindow:] <RandomView 0x7f8b21e16630> <Window 0x0>
[RandomView didMoveToWindow] <RandomView 0x7f8b21e16630> <Window 0x0>
[RandomView willMoveToWindow:] <RandomView 0x7f8b21e16630> <Window 0x7f8b21d220d0>
[RandomView didMoveToWindow] <RandomView 0x7f8b21e16630> <Window 0x7f8b21d220d0>

[RandomView willMoveToWindow:] <RandomView 0x7f8b21e16630> <Window 0x0>
[RandomView didMoveToWindow] <RandomView 0x7f8b21e16630> <Window 0x0>

最佳答案

我也遇到了同样的问题

但在通过响应链查找 View 层次结构后,有一个小的不同可以检查。我不确定这是否安全。

但我认为 Apple 以错误的顺序执行动画代码,如果他们先将动画 View 添加到窗口,willMoveToWindow: 将不会调用两次。

2017-03-08 22:49:35.167 view[36189:410065] show
0x7fa9c36059f0,MyView
0x7fa9c3407cb0,UIView
0x7fa9c340b9d0,ViewController
0x7fa9c3403c50,UIViewControllerWrapperView
0x7fa9c340ee90,UINavigationTransitionView
0x7fa9c5802d10,UILayoutContainerView
0x7fa9c381ee00,UINavigationController
0x7fa9c3609c40,UIWindow
0x7fa9c3400020,UIApplication
0x608000038900,AppDelegate
2017-03-08 22:49:54.501 view[36189:410065] hide
0x7fa9c36059f0,MyView
0x7fa9c3407cb0,UIView
0x7fa9c340b9d0,ViewController
0x7fa9c3500bd0,UIView <----- not real hide
2017-03-08 22:49:54.501 view[36189:410065] show
0x7fa9c36059f0,MyView
0x7fa9c3407cb0,UIView
0x7fa9c340b9d0,ViewController
0x7fa9c3500bd0,UIView
0x7fa9c3403c50,UIViewControllerWrapperView
0x7fa9c340ee90,UINavigationTransitionView
0x7fa9c5802d10,UILayoutContainerView
0x7fa9c381ee00,UINavigationController
0x7fa9c3609c40,UIWindow
0x7fa9c3400020,UIApplication
0x608000038900,AppDelegate
2017-03-08 22:49:54.501 view[36189:410065] show
0x7fa9c35062f0,MyView
0x7fa9c3505ae0,UIView
0x7fa9c58030c0,ViewController
0x7fa9c3506c10,_UIParallaxDimmingView
0x7fa9c35022c0,UIView
0x7fa9c3403c50,UIViewControllerWrapperView
0x7fa9c340ee90,UINavigationTransitionView
0x7fa9c5802d10,UILayoutContainerView
0x7fa9c381ee00,UINavigationController
0x7fa9c3609c40,UIWindow
0x7fa9c3400020,UIApplication
0x608000038900,AppDelegate
2017-03-08 22:49:55.037 view[36189:410065] hide
0x7fa9c36059f0,MyView
0x7fa9c3407cb0,UIView
0x7fa9c340b9d0,ViewController <----- real hide

关于ios - willMoveToWindow 被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34484518/

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