programing

백그라운드에서 앱을 열 때 ViewDidEar가 호출되지 않음

i4 2023. 4. 21. 20:12
반응형

백그라운드에서 앱을 열 때 ViewDidEar가 호출되지 않음

이 0(라벨 View컨트롤러에서 View컨트롤러에서 View컨트롤러가 열립니다.ViewController팅세세 i i i i i를 했습니다.viewDidAppear20달러하지만 앱을 viewDidLoad,viewDidAppear ★★★★★★★★★★★★★★★★★」viewWillAppear이치노앱열열 열? ?? ???제가 해야 할 일이 있나요?applicationDidBecomeActive무슨 일입니까?

정확한 이벤트 순서가 궁금해서 다음과 같이 앱을 설치했습니다(@Zohaib, 아래의 NSNotification Center 코드를 사용하여 질문에 답변할 수 있습니다).

// AppDelegate.m

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    NSLog(@"app will enter foreground");
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    NSLog(@"app did become active");
}

// ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"view did load");

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
}

- (void)appDidBecomeActive:(NSNotification *)notification {
    NSLog(@"did become active notification");
}

- (void)appWillEnterForeground:(NSNotification *)notification {
    NSLog(@"will enter foreground notification");
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"view will appear");
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"view did appear");
}

기동시의 출력은 다음과 같습니다.

2013-04-07 09:31:06.505 myapp[15459:11303] view did load
2013-04-07 09:31:06.507 myapp[15459:11303] view will appear
2013-04-07 09:31:06.511 myapp[15459:11303] app did become active
2013-04-07 09:31:06.512 myapp[15459:11303] did become active notification
2013-04-07 09:31:06.517 myapp[15459:11303] view did appear

배경을 입력한 후 포그라운드를 다시 입력합니다.

2013-04-07 09:32:05.923 myapp[15459:11303] app will enter foreground
2013-04-07 09:32:05.924 myapp[15459:11303] will enter foreground notification
2013-04-07 09:32:05.925 myapp[15459:11303] app did become active
2013-04-07 09:32:05.926 myapp[15459:11303] did become active notification

Objective-C 사용

해 주세요.UIApplicationWillEnterForegroundNotification 안에서ViewController의 »viewDidLoad앱이 백그라운드에서 돌아오면 알림용으로 등록된 방법으로 원하는 작업을 수행할 수 있습니다. ViewController앱이 백그라운드에서 포그라운드로 돌아오면의 viewApear 또는 viewDidApear가 호출되지 않습니다.

-(void)viewDidLoad{

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doYourStuff)

  name:UIApplicationWillEnterForegroundNotification object:nil];
}

-(void)doYourStuff{

   // do whatever you want to do when app comes back from background.
}

등록한 알림의 등록을 취소하는 것을 잊지 마십시오.

-(void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

등록하는 경우 주의해 주세요.viewController★★★★★★에UIApplicationDidBecomeActiveNotification될 .viewController해 주세요.

Swift 사용

옵서버를 추가하기 위해 다음 코드를 사용할 수 있습니다.

 override func viewDidLoad() {
    super.viewDidLoad()

     NotificationCenter.default.addObserver(self, selector: "doYourStuff", name: UIApplication.willEnterForegroundNotification, object: nil)
 }

 func doYourStuff(){
     // your code
 }

옵서버를 삭제하려면 swift의 deinit 함수를 사용합니다.

deinit {
    NotificationCenter.default.removeObserver(self)
}

Swift 3.0 + + 버전

고객님의 고객명viewDidLoad된 이

NotificationCenter.default.addObserver(self, selector:#selector(doSomething), name: NSNotification.Name.UIApplicationWillEnterForeground, object: nil)
        

그런 다음 이 기능을 추가하고 필요한 작업을 수행합니다.

func doSomething(){
    //...
}

마지막으로 뷰 컨트롤러가 파괴되었을 때 알림 옵서버를 청소하기 위해 이 기능을 추가합니다.

deinit {
    NotificationCenter.default.removeObserver(self)
}

Swift 4.2 버전

Notification Center에서 합니다.viewDidLoad이 때 이 오다

NotificationCenter.default.addObserver(self, selector: #selector(doSomething), name: UIApplication.willEnterForegroundNotification, object: nil)

호출해야 할 메서드를 구현합니다.

@objc private func doSomething() {
    // Do whatever you want, for example update your view.
}

할 수 .ViewController파괴되었습니다. 및 10.11 합니다.

deinit {
    NotificationCenter.default.removeObserver(self)
}

만 하면 .UIApplicationWillEnterForegroundNotification을 사용하다

UIApplicationWillEnterForgroundNotification에 등록하는 것은 여러 컨트롤러가 해당 알림에 반응할 수 있으므로 위험하다고 생각합니다.통지가 수신되었을 때 이러한 컨트롤러가 아직 표시되는 것을 보증하는 것은 없습니다.

다음 작업을 수행합니다. 앱의 위임 didBecomeActive 메서드에서 액티브 컨트롤러에 직접 viewDidApp을 호출합니다.

다음 코드를 에 추가합니다.- (void)applicationDidBecomeActive:(UIApplication *)application

UIViewController *activeController = window.rootViewController;
if ([activeController isKindOfClass:[UINavigationController class]]) {
    activeController = [(UINavigationController*)window.rootViewController topViewController];
}
[activeController viewDidAppear:NO];

AppDelegate 어플리케이션 WillEnterForeground에서 이 기능을 추가해 보십시오.

func applicationWillEnterForeground(_ application: UIApplication) {        
    // makes viewWillAppear run
    self.window?.rootViewController?.beginAppearanceTransition(true, animated: false)
    self.window?.rootViewController?.endAppearanceTransition()
}

Apple의 설명서에 따르면:

(void)beginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animated;

설명:
하위 컨트롤러에 외관이 변경되려고 함을 알립니다.사용자 지정 컨테이너 컨트롤러를 구현하는 경우 이 방법을 사용하여 하위 컨테이너의 보기가 나타나거나 사라지려고 함을 알립니다., , , 또는 를 직접 호출하지 마십시오.

(void)endAppearanceTransition;

설명:

하위 컨트롤러에 모양이 변경되었음을 알립니다.사용자 정의 컨테이너 컨트롤러를 구현하는 경우 이 방법을 사용하여 아이에게 보기 전환이 완료되었음을 알립니다.

샘플 코드:

(void)applicationDidEnterBackground:(UIApplication *)application
{

    [self.window.rootViewController beginAppearanceTransition: NO animated: NO];  // I commented this line

    [self.window.rootViewController endAppearanceTransition]; // I commented this line

}

질문:.내가 어떻게 고쳤지?

ANS: 나는 이 선 조각을 응용 프로그램에서 찾았습니다.이 행으로 인해 앱은 ViewWillAple 알림을 수신하지 못했습니다.가 이 대사들을 언급했더니 잘 되고 있어.

언급URL : https://stackoverflow.com/questions/15864364/viewdidappear-is-not-called-when-opening-app-from-background

반응형