ব্যাকগ্রাউন্ড থেকে অ্যাপ্লিকেশন খোলার সময় ভিউডিড অ্যাপকে কল করা হয় না


175

আমার কাছে একটি ভিউ কন্ট্রোলার রয়েছে যাতে আমার মান 0 (লেবেল) হয় এবং যখন আমি অন্য থেকে সেই ভিউ কন্ট্রোলারটি খুলি তখন আমি লেবেলে মান 20 ViewControllerসেট viewDidAppearকরে সেট করি । এটা কাজ করে জরিমানা কিন্তু যখন আমি আমার অ্যাপ্লিকেশানের বন্ধ করুন এবং তুলনায় আবার আমি আমার অ্যাপ্লিকেশানটি খুলুন কিন্তু মান কারণ পরিবর্তন করে না viewDidLoad, viewDidAppearএবং viewWillAppearকিছুই বলা যায়। আমি আমার অ্যাপটি খুললে কীভাবে কল করব call আমাকে কিছু করতে হবে applicationDidBecomeActive?


অ্যাপ্লিকেশন সক্রিয় হয়ে উঠলে আপনি একটি স্থানীয় বিজ্ঞপ্তি পোস্ট করতে এবং পর্যবেক্ষক এবং আপডেটের মান হিসাবে আপনার ভিউ কন্ট্রোলার যুক্ত করতে পারেন।
আদিল সোমো

উত্তর:


314

ইভেন্টের যথাযথ ক্রম সম্পর্কে কৌতূহলযুক্ত, আমি নিম্নলিখিত অনুসারে একটি অ্যাপটি চালিত করেছি: (@ জোহাইব, আপনার প্রশ্নের উত্তর দেওয়ার জন্য আপনি নীচের এনএসএনটিফিকেশন সেন্টার কোডটি ব্যবহার করতে পারেন)।

// 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

1
দানহ, আপনি ইউআইএপ্লিকেশন উইলএন্টারফোরগ্রাউন্ডঅনোটিকেশন অ্যাপ্লিকেশনডিড ইন্টারফোরগ্রাউন্ডে ম্যাপ করেছেন: এটি কি কিছুটা বিভ্রান্তিকর নয়? "উইল" এবং "কর" লক্ষ্য করুন। এটা কি ইচ্ছাকৃত ছিল?
লুবিলুক

@ লুবিলুক - উদ্দেশ্যমূলক নয় not আমি সম্পাদনা করব। ভালো বল ধরা.
ড্যানহ

4
এটি একটি খুব দরকারী উত্তর ছিল। আমি এটি একটি সুইফট সংস্করণ তৈরি এখানে
সুরগাচ

ব্যাকগ্রাউন্ড মোডের নিখুঁত প্রদর্শন!
মার্সেলো ডস সান্টোস

আপনি যখন হোম বোতামে ডাবল আলতো চাপুন এবং অ্যাপটি বন্ধ করেন তখন ইভেন্টগুলির ক্রম কী?
আমজাদ হাসিনী

134

অবজেক্টিভ-সি ব্যবহার করা

আপনি একটি রেজিস্টার করো উচিত UIApplicationWillEnterForegroundNotificationআপনার ViewController'র viewDidLoadপদ্ধতি এবং যখনই অ্যাপ্লিকেশন পটভূমি থেকে ফিরে আসে আপনি কি বিজ্ঞপ্তির জন্য নিবন্ধিত পদ্ধতিতে কাজ করতে চান করতে পারেন। অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ড থেকে ফোরগ্রাউন্ডে ফিরে এলেViewController এর ভিউউইল অ্যাপ্লিকেশন বা ভিউডিড অ্যাপ্ল কল হবে না।

-(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এই বিজ্ঞপ্তির জন্য নিবন্ধন করার পরামর্শ দেওয়া হয় না ।

সুইফট ব্যবহার করা

পর্যবেক্ষক যুক্ত করার জন্য আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন

 override func viewDidLoad() {
    super.viewDidLoad()

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

 func doYourStuff(){
     // your code
 }

পর্যবেক্ষক অপসারণ করতে আপনি সুইফটের ডিনিট ফাংশনটি ব্যবহার করতে পারেন।

deinit {
    NotificationCenter.default.removeObserver(self)
}

4
হ্যাঁ এটি :) কখনও কখনও উত্তরগুলি খুঁজে পাওয়া শক্ত হয় :)
এনএসগুলিভার

@nsgulliver আমাকে কী ম্যানুয়ালি নোটিফিকেশনটি নিবন্ধন করতে হবে - (শূন্য) dealloc {[[NSNotificationsCenter defaultCenter] অপসারণকারী: স্ব]; । অ্যাপ কি আমার জন্য এটি করবে?
ios

43

সুইফট 3.0 ++ সংস্করণ

আপনার মধ্যে viewDidLoad, ব্যাকগ্রাউন্ড ক্রিয়া থেকে এটি খোলার জন্য বিজ্ঞপ্তি কেন্দ্রে নিবন্ধন করুন

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

তারপরে এই ফাংশনটি যুক্ত করুন এবং প্রয়োজনীয় ক্রিয়াটি করুন

func doSomething(){
    //...
}

আপনার ভিউ কন্ট্রোলারটি ধ্বংস হয়ে গেলে অবশেষে বিজ্ঞপ্তি পর্যবেক্ষককে পরিষ্কার করতে এই ফাংশনটি যুক্ত করুন।

deinit {
    NotificationCenter.default.removeObserver(self)
}

ভিসি +1 এর মধ্যে বিজ্ঞপ্তিটি হ্যান্ডেল করার সহজ এবং সোজা ফরোয়ার্ড সমাধান
মো যাতাতর

বিশ্বাস করা যায় না যে এই সুন্দর উত্তরটি অনেক অন্যান্য অনুরূপ / সদৃশ এসও প্রশ্নগুলিতে মিস হয়েছে।
হুগো অ্যালেক্সিস কার্ডোনা

11

সুইফট 4.2। সংস্করণ

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ধ্বংস হয়ে গেলে আপনি পর্যবেক্ষককে সরাতে পারেন । এটি কেবল iOS9 এবং ম্যাকোস 10.11 এর নীচে প্রয়োজন

deinit {
    NotificationCenter.default.removeObserver(self)
}

1
এফওয়াইআই আমি নিশ্চিত যে এই দিনগুলিতে আপনাকে আর পর্যবেক্ষকদের অপসারণ করার দরকার নেই ...
ফ্যাটি

3

UIApplicationWillEnterForegroundNotificationবিজ্ঞপ্তির জন্য আপনার ভিউ কন্ট্রোলারকে কেবল রেজিস্টার করুন এবং সে অনুযায়ী প্রতিক্রিয়া জানান।


কীভাবে করব? আমি অ্যাপ্লিকেশনটিতে আমার ভিউকন্ট্রোলারকে ডিডবেকোম্যাকটিভ বলেছি কিন্তু। এটি ভিউ কন্ট্রোলারকে ওভারল্যাপ করে বা এটি করার জন্য জরিমানা?
জোহাইব

2
অ্যাপ্লিকেশনডিডকোম্যাকটিভটিতে আপনার ভিউকন্ট্রোলারকে কল করবেন না (এটি যাইহোক ভুল কারণ এটি একাধিকবার বলা হয়ে থাকে)। আপনার viewDidLoadমত @nsgulliver বিজ্ঞপ্তি জন্য নিবন্ধন করুন । আপনার পছন্দসই মান সহ আপনার লেবেল সেট করতে viewDidAppearকল করবে doYourStuff
andreagiavatto

3

আমি মনে করি ইউআইএ অ্যাপ্লিকেশন উইলএন্টারফোরগ্রাউন্ডনোটিকেশনের জন্য নিবন্ধন করা ঝুঁকিপূর্ণ কারণ আপনি সেই বিজ্ঞপ্তিতে প্রতিক্রিয়া জানাতে একাধিক নিয়ামক শেষ করতে পারেন। বিজ্ঞপ্তিটি পাওয়ার পরে এই নিয়ন্ত্রণকারীরা এখনও দৃশ্যমান এমন কোনও গ্যারান্টি নেই।

আমি যা করি তা এখানে: আমি সরাসরি অ্যাপের প্রতিনিধি ডাবকোম্যাক্টিভ পদ্ধতিতে সক্রিয় নিয়ামকটিতে ভিডিডআইপিয়ার কল করি force

নীচে কোড যুক্ত করুন - (void)applicationDidBecomeActive:(UIApplication *)application

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

7
কন্ট্রোলার যদি ইউআইএপ্লিকেশন উইলএন্টারফরগ্রাউন্ড নোটিকেশন জন্য ডিলোকের পরিবর্তে ভিউ উইলডিস্পায়ারের জন্য নিবন্ধন না করে (যেমন এটি করা উচিত) তবে এটি গ্যারান্টিযুক্ত। ভিউডিডএয়ারকে কল করা স্পষ্টভাবে আমার কাছে হ্যাকের মতো দেখায়, এটি শব্দার্থবিজ্ঞান (ব্যক্তিগত দৃষ্টিভঙ্গি) ভেঙে দেয় এবং মানুষকে (অভিজ্ঞতা থেকে) বিভ্রান্ত করতে পারে।
জোয়াকিম

3

এটিকে অ্যাপডেলিগেট অ্যাপ্লিকেশনউইলএন্টারফোরগ্রাউন্ডে যুক্ত করার চেষ্টা করুন।

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

2

অ্যাপলের ডকুমেন্টেশন অনুসারে:

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

বর্ণনা:
একটি শিশু নিয়ন্ত্রককে বলছে এর চেহারা পরিবর্তন হতে চলেছে। আপনি যদি কাস্টম ধারক নিয়ন্ত্রকটি প্রয়োগ করছেন, তবে এই পদ্ধতিটি শিশুকে জানানোর জন্য যে তার মতামতগুলি উপস্থিত হতে বা অদৃশ্য হতে চলেছে তা জানান । ডাকা না viewWillAppear:, viewWillDisappear:, viewDidAppear:, অথবা viewDidDisappear:সরাসরি

(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

}

প্রশ্ন: আমি কীভাবে স্থির করলাম?

উত্তর : আমি প্রয়োগে এই পংক্তির টুকরোটি পেয়েছি। এই রেখাগুলি আমার অ্যাপ্লিকেশনটিকে কোনও ভিউউইল অ্যাপ্লিকেশন বিজ্ঞপ্তি পুনরুদ্ধার করতে সক্ষম করেছে। যখন আমি এই লাইনগুলিতে মন্তব্য করেছি এটি ঠিকঠাক কাজ করছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.