UIViewController에서 applicationDidBecomeActive를 어떻게 사용할 수 있습니까?
응용 프로그램이 활성화되거나 포 그라운드가 될 때 UIViewController에서 데이터를 다시로드하고 싶습니다.
applicationDidBecomeActive가 AppDelegate 클래스에서 호출된다는 것을 알고 있습니다.
하지만이 코드와 같이 AppDelegate 클래스에서 데이터를 다시로드하려면 UIViewController에 대한 전역 변수가 있어야합니다.
in AppDelegate.m
// global variable
UIViewController *viewController1;
UIViewController *viewController2;
-(void)applicationDidBecomeActive:(UIApplication *)application
{
[viewController1 reloadData];
[viewController2 reloadData];
}
그러나 특히 UIViewController가 많을 때 불편합니다.
AppDelegate 클래스 대신 UIViewController에서 applicationDidBecomeActive를 사용할 수 있습니까?
아니면 UIViewController에 대한 전역 변수를 갖는 것보다 더 좋은 방법이 있습니까?
또한 UIViewControllers에서 다음 메서드를 사용해야합니다.
-(void)applicationWillResignActive:(UIApplication *)application
-(void)applicationDidEnterBackground:(UIApplication *)application
-(void)applicationWillEnterForeground:(UIApplication *)application
다시 활성화 할 때 뷰 컨트롤러에 대한 특정 물건을 가지고 다니려면 해당 viewDidLoad
메서드에 알림을 등록해야합니다 .
UIApplicationDidBecomeActiveNotification
응용 프로그램과 주어진 컨트롤러가 등록 된 경우 자동으로 알립니다.
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(yourMethod)
name:UIApplicationDidBecomeActiveNotification
object:nil];
다음은 Swift에서 알림 핸들러를 등록하는 예입니다 (위의 Apurv의 답변에서 수정 됨).
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(
self,
selector: #selector(applicationDidBecomeActive(notification:)),
name: NSNotification.Name.UIApplicationDidBecomeActive,
object: nil)
}
@objc func applicationDidBecomeActive(notification: NSNotification) {
// do something
}
에 대한 업데이트 Swift 4.2
:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)
}
@objc func applicationDidBecomeActive(notification: NSNotification) {
// Application is back in the foreground
print("active")
}
스위프트 3 :
NotificationCenter.default.addObserver(
self,
selector: #selector(applicationDidBecomeActive(_:)),
name: NSNotification.Name.UIApplicationDidBecomeActive,
object: nil)
func applicationDidBecomeActive(_ notification: NSNotification) {
// do something
}
참고 : 관찰자를 제거하는 것을 잊지 마십시오.
applicationDidBecomeActive
viewController에서 사용할 수 없습니다 . 해당 클래스의 메서드가 아닙니다.
그러나 applicationDidBecomeActive
AppDelegate의 메서드를 사용 하여 시작시 중요하다고 생각하는 뷰 컨트롤러의 모든 메서드를 호출 할 수 있습니다 . 컨트롤러에 대한 포인터를 유지하면 App Delegate가 연결할 수 있습니다.
뷰 컨트롤러에 이러한 메서드가있을 수있는 것은 전적으로 사용자와 프로그램의 세부 사항에 달려 있습니다. 뷰 컨트롤러에서 사용자 지정 업데이트 메서드를 호출하거나 기타 필요하다고 생각하는 것을 의미 할 수 있습니다.
You could also use NSNotificationCenter as outlined here, with many system notifications available for application launch: http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html
However, relying heavily on NSNotificationCenter is in my opinion a good way for an app to be come disorganized. If you call everything from your main methods in the AppDelegate only, you can always refer to that method to know exactly what your app is doing upon launch. If instead you use NSNotificationCenter, you could have actions spread across many classes/objects and it can be harder to track down what is going on. Since you mentioned multiple controller objects, I think it is more streamlined and organized to call everything from applicationDidBecomeActive
rather than register each viewcontroller for the same notification.
Thank you all for answering my question.
But I found easier way to use applicationDidBecomeActive in UIViewController.
@implementation AppDelegate
-(void)applicationDidBecomeActive:(UIApplication *)application
{
UIViewController<MyAppDelegate> *topViewController = (UIViewController<MyAppDelegate> *)navigationController.topViewController;
if ([topViewController respondsToSelector:@selector(MyApplicationDidBecomeActive)]) {
[topViewController MyApplicationDidBecomeActive];
}
}
@end
@protocol MyAppDelegate
@optional
-(void)MyApplicationDidBecomeActive;
@end
'Program Tip' 카테고리의 다른 글
JavaScript에서 객체 배열을 인쇄하는 방법은 무엇입니까? (0) | 2020.12.03 |
---|---|
치명적인 오류 : 권한 테이블을 열고 잠글 수 없음 : 테이블 'mysql.host'가 존재하지 않습니다. (0) | 2020.12.02 |
Laravel은 요청 배열에 값을 추가하는 방법이 있습니다. (0) | 2020.12.02 |
ConfigParser.items ( '')를 사전으로 변환 (0) | 2020.12.02 |
.NET의 String.Format에 해당하는 Java (0) | 2020.12.02 |