如何在viewDidAppear中只做一次一些东西?

All*_*len 24 viewdidappear ios

我想检查粘贴板并在视图出现时显示警告(如果它包含特定值).我可以将代码放入viewDidLoad以确保它只被调用一次,但问题是警报视图显示得太快.我知道我可以设置一个计时器来推迟警报的外观,但我认为这不是一个好的解决方法.

我检查了问题iOS 7 - viewDidLoad和viewDidAppear之间的区别,发现有一个步骤可以检查视图是否存在.所以我想知道这样做是否有任何api?

更新:"仅一次"表示视图控制器实例的生命周期.

rma*_*ddy 63

您可以使用标准的内置方法.

Objective-C的:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if ([self isBeingPresented] || [self isMovingToParentViewController]) {
        // Perform an action that will only be done once
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特3:

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

    if self.isBeingPresented || self.isMovingToParentViewController {
        // Perform an action that will only be done once
    }
}
Run Code Online (Sandbox Code Playgroud)

isBeingPresented当视图控制器首次显示为模态显示的结果时,调用为true.isMovingToParentViewController首次将视图控制器推入导航堆栈时为true.第一次出现视图控制器时,其中一个将成立.

无需处理BOOLivars或任何其他技巧来跟踪第一个电话.

  • @farzadshbfn,容器将在其viewDid/Will中显示正确的这些标志,这取决于它如何将这些标志传递给子.UINavigationController不会将这些标志传递给它的rootviewcontroler (5认同)
  • @LyndseyScott 可能。这个问题在那个细节上有点模糊。如果 OP 的愿望是在应用程序的生命周期中只调用一次该方法(或者在视图控制器实例的生命周期中至少只调用一次),而不管它显示多少次,那么这不是正确的解决方案。在这种情况下,最好像 Inder 的回答那样使用“dispatch_once”。 (2认同)
  • @rmaddy 我试过了,当将 viewController 添加为 childViewController 时,它似乎不起作用。:( (2认同)

Ban*_*tor 7

rmaddy的答案非常好,但是当视图控制器是导航控制器的根视图控制器以及所有其他未将这些标志传递给其子视图控制器的容器时,它无法解决问题.

所以这种情况我最好使用一个标志并在以后使用它.

@interface SomeViewController()
{
    BOOL isfirstAppeareanceExecutionDone;
}
@end

@implementation SomeViewController

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if(isfirstAppeareanceExecutionDone == NO) {
        // Do your stuff
        isfirstAppeareanceExecutionDone = YES;
    }
}

@end
Run Code Online (Sandbox Code Playgroud)


Lyn*_*ott 5

如果我正确理解你的问题,你可以简单地设置一个 BOOL 变量来识别 viewDidAppear 已经被调用,例如:

- (void)viewDidAppear {
    if (!self.viewHasBeenSet) { // <-- BOOL default value equals NO

        // Perform whatever code you'd like to perform
        // the first time viewDidAppear is called

        self.viewHasBeenSet = YES; 
    }
}
Run Code Online (Sandbox Code Playgroud)


Muh*_*ati -1

您可以在 ViewDidLoad 方法中使用此函数

执行选择器:withObject:延迟后:

它会在延迟后调用该函数。因此您不必使用任何自定义计时器对象。一次你可以使用

dispatch_once DCD 块。只需在dispatch_once 块中执行Selector,当调用ViewDidLoad 时,它只会调用一次performSelector

希望能帮助到你