पसंदीदास्टैटबर्सेल्टी को नहीं कहा जाता है


257

मैंने इस थ्रेड को ओवरराइड करने के लिए पीछा किया -preferredStatusBarStyle, लेकिन इसे कॉल नहीं किया गया। क्या कोई विकल्प है कि मैं इसे सक्षम करने के लिए बदल सकता हूं? (मैं अपने प्रोजेक्ट में XIB का उपयोग कर रहा हूं।)


यह किस संदर्भ में नहीं कहा जाता है: सिम्युलेटर? एक डिवाइस पर
bnely

@ दोनों की जमकर तारीफ हुई।
ट्रोगोफी

आप iOS 7 सिम्युलेटर, iOS 7 डिवाइस का उपयोग कर रहे हैं, और आपका आधार एसडीके 7.0 है?
bnely

@ बिलकुल iOS SDK 7.0 मेरे प्रोजेक्ट के नाम से नीचे है, इसका मतलब है कि मेरा आधार SDK 7.0 है?
ट्रोगोफी

बिल्ड सेटिंग्स में, "बेस एसडीके" वह जगह है जहां मान सेट किया गया है। ऐसा लगता है कि आपका प्रोजेक्ट 7.0 पर सेट है।
bnely

जवाबों:


117

संभावित मूल कारण

मेरे पास एक ही समस्या थी, और मुझे लगा कि यह हो रहा है क्योंकि मैं अपने एप्लिकेशन विंडो में रूट व्यू कंट्रोलर सेट नहीं कर रहा था।

UIViewControllerजिसमें मैं लागू किया preferredStatusBarStyleएक में इस्तेमाल किया गया था UITabBarControllerजो स्क्रीन पर देखा गया की उपस्थिति नियंत्रित,।

जब मैंने इसे देखने के लिए रूट व्यू कंट्रोलर सेट किया UITabBarController, तो स्थिति पट्टी परिवर्तन सही तरीके से काम करना शुरू कर दिया, जैसा कि अपेक्षित था (और preferredStatusBarStyleविधि कहा जा रहा था)।

(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ... // other view controller loading/setup code

    self.window.rootViewController = rootTabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

वैकल्पिक विधि (iOS 9 में पदावनत)

वैकल्पिक रूप से, आप निम्न में से किसी एक विधि को, अपने प्रत्येक दृश्य नियंत्रकों में, इसके पृष्ठभूमि रंग के आधार पर, उपयोग करने के बजाय, कह सकते हैं setNeedsStatusBarAppearanceUpdate:

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

या

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];

ध्यान दें कि यदि आप इस पद्धति का उपयोग करते हैं, तो आपको प्लास्ट फाइल में भी सेट UIViewControllerBasedStatusBarAppearanceकरना होगा NO


2
मुझे आपके जैसी ही समस्या है, रूट व्यू कंट्रोलर सेट करने की नहीं। आपको यह कैसा लगा?
ट्रोगोफी

1
मुझे संदेह था कि फ्रेमवर्क में कुछ से सूचना नहीं मिल रही थी setNeedsStatusBarAppearanceUpdate- जब मैंने यह बदलाव किया तो मेरे संदेह की पुष्टि हुई।
अब्दुल्ला

2
एक संबंधित मुद्दा जो मुझे एक ऐप में मिला, वह एक पूर्ण स्क्रीन चाइल्ड व्यू कंट्रोलर के साथ एक व्यू कंट्रोलर था जिसने चाइल्ड व्यू कॉन्ट्रोलरफॉरस्टैटसबर्टल और चाइल्ड व्यू कॉन्ट्रोलरफॉरस्टैटबार्सबर्ड को उस बच्चे को देखने के कंट्रोलर को वापस करने की अनुमति नहीं दी। यदि आपके पास अपना स्वयं का व्यू कंट्रोलर पदानुक्रम है, तो आपको सिस्टम को सूचित करने के लिए इन तरीकों को प्रदान करने की आवश्यकता है, जिससे स्थिति बार शैली को निर्धारित करने के लिए व्यू कंट्रोलर का उपयोग किया जाना चाहिए।
जॉन स्टीनमेट

rootviewcontroller सेट करने से कुछ भी नहीं बदलता है। आपको जॉन की टिप्पणी के साथ काम करना चाहिए। और सेटनैड्सटसटसबयरपैरेंसयूपडेट कहते समय सावधान रहें। आपको इसे माता-पिता से काम पर बुलाना चाहिए।
doozMen

1
@ हिप्पो तुम जीनियस हो !! आपने यह कैसे पाया कि यह rootviewcontroller स्थापित नहीं करने के कारण था?
वीरूमाक्स

1019

UINavigationController का उपयोग करने वाले किसी के लिए:

UINavigationControllerपर आगे नहीं है preferredStatusBarStyleअपने बच्चे को देखने के नियंत्रकों के लिए कॉल। इसके बजाय यह अपनी स्थिति का प्रबंधन करता है - जैसा कि यह होना चाहिए, यह स्क्रीन के शीर्ष पर आ रहा है जहां स्थिति पट्टी रहती है और इसलिए इसके लिए जिम्मेदार होना चाहिए। preferredStatusBarStyleएक नौसेना नियंत्रक के भीतर अपने कुलपतियों में लागू करने से कुछ नहीं होगा - उन्हें कभी नहीं बुलाया जाएगा।

चाल क्या है UINavigationControllerक्या के लिए वापस जाने के लिए तय करने के लिए उपयोग करता है UIStatusBarStyleDefaultया UIStatusBarStyleLightContent। यह इस पर आधारित है UINavigationBar.barStyle। डिफ़ॉल्ट ( UIBarStyleDefault) अंधेरे अग्रभूमि UIStatusBarStyleDefaultस्थिति बार में परिणाम देता है। और UIBarStyleBlackएक UIStatusBarStyleLightContentस्टेटस बार देगा।

टी एल; डॉ:

यदि आप चाहते हैं UIStatusBarStyleLightContentएक पर UINavigationControllerउपयोग करें:

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

59
अच्छा! ध्यान दें कि preferredStatusBarStyleवास्तव में चाइल्ड व्यू कंट्रोलर पर कॉल किया जाएगा यदि आप नेविगेशन बार (सेट ) navigationBarHiddenको छिपाते हैं YES, तो बिल्कुल उपयुक्त।
पैट्रिक पिजनपेल

25
इस उत्तर के लिए धन्यवाद। यदि आप अपने सभी नेविगेशन बार के लिए बारसिटी सेट करना चाहते हैं, तो कॉल करें[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack]
थॉमस डेजर्ट

15
एकदम सही जवाब। SO पर अन्य किसी भी उत्तर ने UINavigationController को ध्यान में नहीं रखा। कीबोर्ड के खिलाफ मेरे सिर को पीटने के 2 घंटे।
रायन अल्फोर्ड

10
Kudos @Patrick को उस navigationBarHiddenसेट को इंगित करने के लिए YESवास्तव में preferredStatusBarStyleबुलाया जाएगा, और उन लोगों के लिए एक चेतावनी जो इस पर ठोकर खा सकते हैं: यह साथ काम करता है navigationBarHidden, लेकिन साथ नहीं navigationBar.hidden!
जकार्न

4
स्पष्ट होना चाहिए, लेकिन आपको काम करने के लिए Info.plist में YES के लिए "कंट्रोलर-आधारित स्थिति बार उपस्थिति" सेट करना होगा।
कोड बॉलर

99

इसलिए मैंने वास्तव में UINavigationController के लिए एक श्रेणी जोड़ी लेकिन विधियों का उपयोग किया:

-(UIViewController *)childViewControllerForStatusBarStyle;
-(UIViewController *)childViewControllerForStatusBarHidden;

और उन लोगों को वर्तमान दृश्यमान UIViewController वापस कर दिया था। यह वर्तमान दृश्य दृश्य नियंत्रक को अपनी पसंदीदा शैली / दृश्यता सेट करता है।

यहां इसके लिए एक पूर्ण कोड स्निपेट दिया गया है:

स्विफ्ट में:

extension UINavigationController {

    public override func childViewControllerForStatusBarHidden() -> UIViewController? {
        return self.topViewController
    }

    public override func childViewControllerForStatusBarStyle() -> UIViewController? {
        return self.topViewController
    }
}

उद्देश्य-सी में:

@interface UINavigationController (StatusBarStyle)

@end

@implementation UINavigationController (StatusBarStyle)

-(UIViewController *)childViewControllerForStatusBarStyle {
    return self.topViewController;
}

-(UIViewController *)childViewControllerForStatusBarHidden {
    return self.topViewController;
}

@end

और अच्छे उपाय के लिए, यहां एक UIViewController में इसे कैसे लागू किया गया है:

स्विफ्ट में

override public func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .LightContent
}

override func prefersStatusBarHidden() -> Bool {
    return false
}

ऑब्जेक्टिव-सी में

-(UIStatusBarStyle)preferredStatusBarStyle {
    return UIStatusBarStyleLightContent; // your own style
}

- (BOOL)prefersStatusBarHidden {
    return NO; // your own visibility code
}

यकीन है कि अंत में, बनाने के अपने अनुप्रयोग plist करता नहीं "नियंत्रक आधारित स्थिति पट्टी उपस्थिति देखें" नहीं करने के लिए सेट है। या तो उस लाइन को हटा दें या इसे YES पर सेट करें (जो मेरा मानना ​​है कि iOS 7 के लिए अब डिफ़ॉल्ट है।)


लगता है return self.topViewController;मेरे लिए काम करता है, लेकिन return self.visibleViewController;- नहीं
k06a

जब आप इसे खारिज करते हैं तो दृश्यमान दृश्य नियंत्रक वर्तमान में प्रस्तुत किए गए मोडल नियंत्रक को लौटा सकता है। जो बमर है। TopViewController का उपयोग करें।
बेन सिनक्लेयर

1
@ d.lebedev ठीक है, लेकिन मुझे नहीं लगता कि उन समस्याओं में से कोई भी यहां लागू होती है। आपको superइस पद्धति में कॉल करने की आवश्यकता नहीं है और आप वास्तव में इस प्रकार के सभी नियंत्रकों के व्यवहार को बदलना चाहते हैं
ed '

1
यह मेरे लिए iOS 9.3 पर काम नहीं कर रहा है। मुझे लगता है, यह समस्या है: इस मुद्दे का विशेष महत्व है क्योंकि कई कोको वर्गों को श्रेणियों का उपयोग करके लागू किया जाता है। आपके द्वारा ओवरराइड करने का प्रयास किया गया एक फ्रेमवर्क-डिफाइन्ड तरीका शायद एक श्रेणी में लागू किया गया है, और इसलिए कार्यान्वयन को पूर्ववर्तीता के रूप में परिभाषित किया गया है।
vikingosegundo

2
यह गलत है और यह iOS 13.4 में टूट जाता है। क्योंकि स्विफ्ट में वस्तुनिष्ठ C वर्गों को उद्देश्य C श्रेणियों के माध्यम से लागू किया गया है। उद्देश्य सी श्रेणियों के माध्यम से अधिभावी तरीकों की सिफारिश नहीं की जाती है और टूटने की संभावना है। देखें stackoverflow.com/a/38274660/2438634
मार्क Etcheverry

79

अभी भी इससे जूझ रहे किसी व्यक्ति के लिए, स्विफ्ट में यह सरल विस्तार आपके लिए समस्या को ठीक कर सकता है।

extension UINavigationController {
    override open var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }
}

10
आप सर मेडल के लायक हैं।
निकन्स

2
बहुत बहुत शुक्रिया यार। मैं बिना किसी सफलता के दृश्यमान दृश्य नियंत्रक को वापस कर रहा था।
फैबियो सलाता

1
यह सोना है। मेरे पास एक टैब बार में एक नेविगेशन नियंत्रक एम्बेडेड है और मैंने इसे केवल एक फ़ाइल में फेंक दिया है और अब मैं अपनी इच्छानुसार कहीं भी स्थिति बार उपस्थिति बदल सकता हूं।
वाहिद अमीरी

2
यह गलत है और यह iOS 13.4 में टूट जाता है। क्योंकि स्विफ्ट में वस्तुनिष्ठ C वर्गों को उद्देश्य C श्रेणियों के माध्यम से लागू किया गया है। उद्देश्य सी श्रेणियों के माध्यम से अधिभावी तरीकों की सिफारिश नहीं की जाती है और टूटने की संभावना है। देखें stackoverflow.com/a/38274660/2438634
मार्क Etcheverry

1
@MarcEtcheverry यह विशेष उदाहरण गलत नहीं था। इस तथ्य का तथ्य यह है कि अन्य वस्तुओं / प्रोटोकॉलों के उपवर्गों जैसे कि UINavigationController में गतिशील प्रेषण में संघर्ष के लिए इनका कोई पूर्व कार्यान्वयन नहीं था। वास्तविक उपवर्गों के भीतर कोई चूक या कार्यान्वयन नहीं था, यही कारण है कि एक अनावश्यक निर्भरता (अवधि) बनाए बिना किसी ऐप पर इसे लागू करने का सबसे साफ तरीका था। दुर्भाग्य से, 13.4 ने इस व्यवहार को बदल दिया है। मैं उन दृश्यों के पीछे अनुमान लगा रहा हूं जिनके पास एक चेक या कार्यान्वयन है जो वर्षों से अस्तित्वहीन है .........
TheCodingArt

20

मेरा ऐप तीनों प्रयोग किया है: UINavigationController, UISplitViewController, UITabBarController, इस प्रकार इन सभी स्थिति पट्टी पर नियंत्रण लेने के लिए लग रहे हैं और कारण होगा preferedStatusBarStyleअपने बच्चों के लिए नहीं कहा जा करने के लिए। इस व्यवहार को ओवरराइड करने के लिए आप एक एक्सटेंशन बना सकते हैं जैसे कि बाकी के जवाबों का उल्लेख किया गया है। यहाँ स्विफ्ट 4 में तीनों का विस्तार है। काश Apple इस तरह के सामान के बारे में अधिक स्पष्ट होता।

extension UINavigationController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return self.topViewController
    }

    open override var childViewControllerForStatusBarHidden: UIViewController? {
        return self.topViewController
    }
}

extension UITabBarController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return self.childViewControllers.first
    }

    open override var childViewControllerForStatusBarHidden: UIViewController? {
        return self.childViewControllers.first
    }
}

extension UISplitViewController {
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return self.childViewControllers.first
    }

    open override var childViewControllerForStatusBarHidden: UIViewController? {
        return self.childViewControllers.first
    }
}

संपादित करें: स्विफ्ट 4.2 एपीआई परिवर्तन के लिए अद्यतन

extension UINavigationController {
    open override var childForStatusBarStyle: UIViewController? {
        return self.topViewController
    }

    open override var childForStatusBarHidden: UIViewController? {
        return self.topViewController
    }
}

extension UITabBarController {
    open override var childForStatusBarStyle: UIViewController? {
        return self.children.first
    }

    open override var childForStatusBarHidden: UIViewController? {
        return self.children.first
    }
}

extension UISplitViewController {
    open override var childForStatusBarStyle: UIViewController? {
        return self.children.first
    }

    open override var childForStatusBarHidden: UIViewController? {
        return self.children.first
    }
}

1
यह एकमात्र उपाय है जो काम करता है। SO पर सभी उत्तर मानक समाधान की ओर इशारा करते हैं जो किसी भी ऐप के लिए नेविगेशनकंट्रोलर के साथ काम नहीं करेगा। धन्यवाद!!!
होउमन

ओवरराइडिंग के लिए एक्सटेंशन का उपयोग करना गलत है। यह सुरक्षित नहीं है। कई सरल उपाय हैं। इसके बजाय एक उपवर्ग का उपयोग करें।
सुल्तान

2
यह गलत है और यह iOS 13.4 में टूट जाता है। क्योंकि स्विफ्ट में वस्तुनिष्ठ C वर्गों को उद्देश्य C श्रेणियों के माध्यम से लागू किया गया है। उद्देश्य सी श्रेणियों के माध्यम से अधिभावी तरीकों की सिफारिश नहीं की जाती है और टूटने की संभावना है। देखें stackoverflow.com/a/38274660/2438634
मार्क एटचेरी

1
@MarcEtcheverry यह विशेष उदाहरण गलत नहीं था। इस तथ्य का तथ्य यह है कि अन्य वस्तुओं / प्रोटोकॉलों के उपवर्गों जैसे कि UINavigationController में गतिशील प्रेषण में संघर्ष के लिए इनका कोई पूर्व कार्यान्वयन नहीं था। वास्तविक उपवर्गों के भीतर कोई चूक या कार्यान्वयन नहीं था, यही कारण है कि एक अनावश्यक निर्भरता (अवधि) बनाए बिना किसी ऐप पर इसे लागू करने का सबसे साफ तरीका था। दुर्भाग्य से, 13.4 ने इस व्यवहार को बदल दिया है। मैं उन दृश्यों के पीछे अनुमान लगा रहा हूं जिनके पास एक चेक या कार्यान्वयन है जो वर्षों से अस्तित्वहीन है .........
TheCodingArt

15

टायसन का उत्तर स्थिति बार के रंग को सफेद में बदलने के लिए सही हैUINavigationController

अगर किसी को कोड लिखने के बाद उसी परिणाम को पूरा करना है AppDelegateतो नीचे दिए गए कोड का उपयोग करें और इसे अंदर लिखेंAppDelegate's didFinishLaunchingWithOptions विधि के ।

और भूल नहीं है स्थापित करने के लिए UIViewControllerBasedStatusBarAppearanceकरने के लिएYES .plist फ़ाइल में, और परिवर्तन को प्रतिबिंबित नहीं होंगे।

कोड

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     // status bar appearance code
     [[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

     return YES;
}

14

UINavigationController पर, preferredStatusBarStyleको नहीं बुलाया जाता है क्योंकि इसके topViewControllerलिए प्राथमिकता दी जाती है self। इसलिए, preferredStatusBarStyleUINavigationController पर कॉल करने के लिए , आपको इसे बदलने की आवश्यकता हैchildViewControllerForStatusBarStyle

सिफ़ारिश करना

अपनी कक्षा में अपने UINavigationController को ओवरराइड करें:

class MyRootNavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    override var childViewControllerForStatusBarStyle: UIViewController? {
        return nil
    }
}

गैर अनुशंसित विकल्प

सभी UINavigationController के लिए ऐसा करने के लिए, आप एक एक्सटेंशन में ओवरराइड कर सकते हैं (चेतावनी: यह UIDocumentPickerViewController, UIImagePickerController, आदि) को प्रभावित करता है, लेकिन आपको शायद स्विफ्ट प्रलेखन के अनुसार ऐसा नहीं करना चाहिए :

extension UINavigationController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
    open override var childViewControllerForStatusBarStyle: UIViewController? {
        return nil
    }
}

11

सेरेन के जवाब के अलावा, यदि आप modalPresentationStyle(उदाहरण के लिए .overCurrentContext) के साथ एक व्यू कंट्रोलर प्रस्तुत कर रहे हैं, तो आपको इसे नए प्रस्तुत व्यू कंट्रोलर पर भी कॉल करना चाहिए:

presentedViewController.modalPresentationCapturesStatusBarAppearance = true

preferredStatusBarStyleप्रस्तुत व्यू कंट्रोलर में ओवरराइड करना भी न भूलें ।


9

हिप्पो के जवाब के अलावा: यदि आप एक UINavigationController का उपयोग कर रहे हैं, तो संभवतः श्रेणी जोड़ना बेहतर होगा:

//  UINavigationController+StatusBarStyle.h:

@interface UINavigationController (StatusBarStyle)

@end



//  UINavigationController+StatusBarStyle.m:

@implementation UINavigationController (StatusBarStyle)

- (UIStatusBarStyle)preferredStatusBarStyle
{
    //also you may add any fancy condition-based code here
    return UIStatusBarStyleLightContent;
}

@end

यह समाधान शायद जल्द ही होने वाले व्यवहार पर स्विच करने से बेहतर है।


ऐसा मत करो, यह अभी के लिए काम करता है लेकिन भविष्य के व्यवहार को तोड़ सकता है। बस नावबार शैली बदलें - मेरा उत्तर देखें stackoverflow.com/a/19513714/505457
टायसन

2
आपको उपवर्ग का उपयोग करना चाहिए, श्रेणी का नहीं।
शुईयूरेन

2Tyson: यह भविष्य के व्यवहार को क्यों तोड़ेगा? पसंदीदास्टैटबर्सेल्टी: स्टेटस बार शैली को स्थापित करने के लिए एप्पल का पसंदीदा तरीका है।
आर्टेम अब्रामोव

2shuiyouren: अगर मैं सिर्फ एक श्रेणी का उपयोग कर सकता हूं और इसे हर उस स्थान पर शामिल कर सकता हूं, जहां मैं करूंगा? वैसे भी, यह वास्तुकला का सवाल है, कार्यान्वयन का नहीं।
आर्टेम अब्रामोव

2
@ArtemAbramov क्योंकि UINavigationController पहले से ही लागू है preferredStatusBarStyleऔर UINavigationController विशिष्ट तर्क करता है। अभी यह तर्क पर आधारित है, navigationBar.barStyleलेकिन मैं अतिरिक्त जाँच को जोड़ा जा सकता है (उदाहरण UISearchDisplayControllerके लिए नेवबार मोड को छिपाने के लिए)। डिफ़ॉल्ट तर्क को ओवरराइड करके आप इस सभी कार्यक्षमता को ढीला कर देते हैं और भविष्य में 'wtf' क्षणों के लिए खुद को खुला छोड़ देते हैं। इन-बिल्ट नेवी कंट्रोलर व्यवहार का समर्थन करते हुए ऐसा करने के सही तरीके के लिए ऊपर दिए गए मेरे उत्तर को देखें।
टायसन

9

स्विफ्ट 4.2 और उसके बाद के संस्करण

जैसा कि चयनित उत्तर में बताया गया है , मूल कारण आपके विंडो रूट व्यू कंट्रोलर ऑब्जेक्ट की जांच करना है।

आपके प्रवाह संरचना के संभावित मामले

  • कस्टम UIViewController ऑब्जेक्ट विंडो रूट व्यू कंट्रोलर है

    आपकी विंडो रूट व्यू कंट्रोलर एक UIViewController ऑब्जेक्ट है और यह आपके एप्लिकेशन फ्लो के आधार पर नेविगेशन कंट्रोलर या tabController को आगे जोड़ता या हटाता है।

    इस तरह का प्रवाह आमतौर पर उपयोग किया जाता है यदि आपके ऐप में टैब के बिना नेविगेशन स्टैक पर पूर्व लॉगिन प्रवाह है और टैब के साथ लॉगिन प्रवाह और संभवतः हर टैब आगे नेविगेशन नियंत्रक रखता है।

  • TabBarController ऑब्जेक्ट विंडो रूट व्यू कंट्रोलर है

    यह वह फ्लो है जहां विंडो रूट व्यू कंट्रोलर tabBarController है, संभवतः हर टैब आगे नेविगेशन कंट्रोलर रखता है।

  • नेविगेशनकंट्रोलर ऑब्जेक्ट विंडो रूट व्यू कंट्रोलर है

    यह फ्लो है जहां विंडो रूट व्यू कंट्रोलर नेविगेशनकंट्रोलर है।

    मुझे यकीन नहीं है कि मौजूदा नेविगेशन नियंत्रक में टैब बार नियंत्रक या नए नेविगेशन नियंत्रक को जोड़ने की कोई संभावना है। लेकिन अगर ऐसा कोई मामला है, तो हमें अगले कंटेनर में स्टेटस बार स्टाइल कंट्रोल पास करना होगा। इसलिए, मैंने UINavigationController एक्सटेंशन में समान चेक को खोजने के लिए जोड़ाchildForStatusBarStyle

निम्नलिखित एक्सटेंशन का उपयोग करें, यह उपरोक्त सभी परिदृश्यों को संभालता है -

extension UITabBarController {
    open override var childForStatusBarStyle: UIViewController? {
        return selectedViewController?.childForStatusBarStyle ?? selectedViewController
    }
}

extension UINavigationController {
    open override var childForStatusBarStyle: UIViewController? {
        return topViewController?.childForStatusBarStyle ?? topViewController
    }
}

extension AppRootViewController {
    open override var preferredStatusBarStyle: UIStatusBarStyle {
        return children.first { $0.childForStatusBarStyle != nil }?.childForStatusBarStyle?.preferredStatusBarStyle ?? .default
    }
}
  • डिफ़ॉल्ट रूप से इसे सही मानने के लिए आपको UIViewControllerBasedStatusBarAppearanceकुंजी की आवश्यकता नहीं हैinfo.plist

अधिक जटिल प्रवाह के लिए विचार करने के लिए अंक

  • यदि आप नए प्रवाह को सामान्य रूप से प्रस्तुत करते हैं, तो यह मौजूदा स्थिति बार शैली के प्रवाह से अलग हो जाता है। तो, मान लीजिए कि आप एक प्रस्तुत कर रहे हैं NewFlowUIViewControllerऔर फिर नया नेविगेशन या टैबबार नियंत्रक NewFlowUIViewControllerजोड़ सकते हैं, फिर NewFlowUIViewControllerआगे के नियंत्रक की स्थिति पट्टी शैली को प्रबंधित करने के लिए विस्तार भी जोड़ सकते हैं।

  • यदि आप modalPresentationStyle सेट fullScreenकरते हैं, तो सामान्य रूप से प्रस्तुत करते समय, आपको modalPresentationCapturesStatusBarAppearanceसही पर सेट करना होगा ताकि प्रस्तुत दृश्य नियंत्रक को स्टेटस बार उपस्थिति नियंत्रण प्राप्त हो।


बहुत बढ़िया जवाब!
अमीन बनारिब

3
यह गलत है और यह iOS 13.4 में टूट जाता है। क्योंकि स्विफ्ट में वस्तुनिष्ठ C वर्गों को उद्देश्य C श्रेणियों के माध्यम से लागू किया गया है। उद्देश्य सी श्रेणियों के माध्यम से अधिभावी तरीकों की सिफारिश नहीं की जाती है और टूटने की संभावना है। देखें stackoverflow.com/a/38274660/2438634
मार्क Etcheverry

@MarcEtcheverry यह विशेष उदाहरण गलत नहीं था। इस तथ्य का तथ्य यह है कि अन्य वस्तुओं / प्रोटोकॉलों के उपवर्गों जैसे कि UINavigationController में गतिशील प्रेषण में संघर्ष के लिए इनका कोई पूर्व कार्यान्वयन नहीं था। वास्तविक उपवर्गों के भीतर कोई चूक या कार्यान्वयन नहीं था, यही कारण है कि एक अनावश्यक निर्भरता (अवधि) बनाए बिना किसी ऐप पर इसे लागू करने का सबसे साफ तरीका था। दुर्भाग्य से, 13.4 ने इस व्यवहार को बदल दिया है। मैं उन दृश्यों के पीछे अनुमान लगा रहा हूं जिनके पास अब एक चेक या कार्यान्वयन है जो वर्षों से गैर-मौजूद है .........
TheCodingArt

8

iOS 13 सॉल्यूशन

UINavigationControllerका उपवर्ग UIViewController(जो 🙃 जानता था)!

इसलिए, जब नेविगेशन नियंत्रकों में एम्बेडेड दृश्य नियंत्रक प्रस्तुत करते हैं, तो आप वास्तव में एम्बेडेड दृश्य नियंत्रक प्रस्तुत नहीं कर रहे हैं; आप नेविगेशन नियंत्रकों को प्रस्तुत कर रहे हैं! UINavigationController, के एक उपवर्ग के रूप में UIViewController, विरासत preferredStatusBarStyleऔरchildForStatusBarStyle , जिसे आप इच्छानुसार सेट कर सकते हैं।

निम्न विधियों में से कोई भी कार्य करना चाहिए:

  1. पूरी तरह से डार्क मोड से बाहर निकलें
    • अपने में info.plist , निम्नलिखित संपत्ति जोड़ें:
      • चाभी - UIUserInterfaceStyle (उर्फ। "यूजर इंटरफेस स्टाइल")
      • मूल्य - प्रकाश
  2. preferredStatusBarStyleभीतर ओवरराइड करेंUINavigationController

    • preferredStatusBarStyle( doc ) - व्यू कंट्रोलर के लिए पसंदीदा स्टेटस बार स्टाइल
    • उपवर्ग या विस्तार UINavigationController

      class MyNavigationController: UINavigationController {
          override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }

      या

      extension UINavigationController {
          open override var preferredStatusBarStyle: UIStatusBarStyle {
              .lightContent
          }
      }
  3. childForStatusBarStyleभीतर ओवरराइड करेंUINavigationController

    • childForStatusBarStyle( डॉक्टर ) - स्थिति बार शैली का निर्धारण करने के लिए सिस्टम को देखने के लिए नियंत्रक की आवश्यकता होने पर कॉल किया जाता है
    • Apple के प्रलेखन के अनुसार,

      "यदि आपका कंटेनर व्यू कंट्रोलर अपने चाइल्ड व्यू कंट्रोलर में से किसी एक से अपनी स्टेटस बार शैली प्राप्त करता है, तो [इस प्रॉपर्टी को ओवरराइड करें] और उस चाइल्ड व्यू कंट्रोलर को लौटा दें। यदि आप शून्य पर लौटते हैं या इस विधि को ओवरराइड नहीं करते हैं, तो सेल्फ के लिए स्टेटस बार स्टाइल का उपयोग किया जाता है। । यदि इस विधि से वापसी मान बदलता है, तो setNeedsStatusBarAppearanceUpdate () विधि को कॉल करें। "

    • दूसरे शब्दों में, यदि आप यहां समाधान 3 को लागू नहीं करते हैं, तो सिस्टम वापस समाधान 2 से ऊपर आएगा।
    • उपवर्ग या विस्तार UINavigationController

      class MyNavigationController: UINavigationController {
          override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }

      या

      extension UINavigationController {    
          open override var childForStatusBarStyle: UIViewController? {
              topViewController
          }
      }
    • आप ऊपर जैसा भी दृश्य नियंत्रक लौटा सकते हैं। मैं निम्नलिखित में से एक की सलाह देता हूं:

      • topViewController(of UINavigationController) ( doc ) - नेविगेशन स्टैक के शीर्ष पर दृश्य नियंत्रक
      • visibleViewController(of UINavigationController) ( doc ) - नेविगेशन इंटरफ़ेस में वर्तमान में दृश्यमान दृश्य से जुड़ा व्यू कंट्रोलर (संकेत: इसमें "एक व्यू कंट्रोलर शामिल किया जा सकता है जिसे नेविगेशन कंट्रोलर के ऊपर मामूली रूप से प्रस्तुत किया गया था")

नोट: यदि आप उपवर्ग का निर्णय लेते हैं UINavigationController, तो उस वर्ग को आईबी में पहचान निरीक्षक के माध्यम से अपने नौसेना नियंत्रकों के लिए लागू करना याद रखें।

PS मेरा कोड स्विफ्ट 5.1 सिंटैक्स ift का उपयोग करता है


स्क्रीन रोटेशन के बाद मेरा स्टेटस बार काला हो रहा है। कोई विचार क्यों? यह केवल iPad प्रो सिम्युलेटर पर होता है।
पेड्रो पाउलो अमोरिम

@PedroPauloAmorim, क्या आप अधिक जानकारी प्रदान कर सकते हैं? शीर्ष दृश्य नियंत्रक कैसे प्रस्तुत किया जाता है (मोडल, पूर्ण स्क्रीन, शो)? यह एक नेविगेशन नियंत्रक के अंदर नेस्टेड है? क्या पाठ काला हो रहा है, या पृष्ठभूमि भी? आप क्या खत्म करने की कोशिश कर रहे हैं?
एंड्रयू किर्ना

मैंने अपने पूरे ऐप में लाइट स्टेटस बार सेट किया। यह दो घुमावों में प्रकाश प्राप्त करता है, तीसरे में यह अंधेरा हो जाता है और कभी भी प्रकाश में वापस नहीं आता है, यहां तक ​​कि इसे फिर से लाल करने के लिए मजबूर करता है। यह iPad Pro सिम्युलेटर पर हो रहा है। दृश्य फुलस्क्रीन में प्रस्तुत किए जा रहे हैं और वे एक नेविगेशन नियंत्रक के अंदर नेस्टेड नहीं हैं। केवल पाठ अंधेरा हो जाता है।
पेड्रो पाउलो अमोरिम

आप पहली स्थिति में प्रकाश स्थिति पट्टी कैसे सेट कर रहे हैं?
एंड्रयू किर्ना

3
एक्सटेंशन के माध्यम से आपका ओवरराइडिंग एक वास्तविक ओवरराइड नहीं है। यह भाषा का असुरक्षित दुरुपयोग है। जो बहुत आसानी से टूट सकता है।
सुल्तान

7

@ उपर्युक्त का उत्तर UINavigationControllers के मामले के लिए अभी भी एक महान है। हालाँकि, स्विफ्ट 3 के लिए childViewController कार्यों को बदल दिया गया है vars। तो UINavigationControllerएक्सटेंशन कोड होना चाहिए:

override open var childViewControllerForStatusBarStyle: UIViewController? {
  return topViewController
}

override open var childViewControllerForStatusBarHidden: UIViewController? {
  return topViewController
}

और फिर व्यू कंट्रोलर में स्टेटस बार स्टाइल को डिक्टेट करना चाहिए:

override var preferredStatusBarStyle: UIStatusBarStyle {
   return .lightContent
}

2
यह गलत है और यह iOS 13.4 में टूट जाता है। क्योंकि स्विफ्ट में वस्तुनिष्ठ C वर्गों को उद्देश्य C श्रेणियों के माध्यम से लागू किया गया है। उद्देश्य सी श्रेणियों के माध्यम से अधिभावी तरीकों की सिफारिश नहीं की जाती है और टूटने की संभावना है। देखें stackoverflow.com/a/38274660/2438634
मार्क एटचेरी

@MarcEtcheverry यह विशेष उदाहरण गलत नहीं था। इस तथ्य का तथ्य यह है कि अन्य वस्तुओं / प्रोटोकॉलों के उपवर्गों जैसे कि UINavigationController में गतिशील प्रेषण में संघर्ष के लिए इनका कोई पूर्व कार्यान्वयन नहीं था। वास्तविक उपवर्गों के भीतर कोई चूक या कार्यान्वयन नहीं था, यही कारण है कि एक अनावश्यक निर्भरता (अवधि) बनाए बिना किसी ऐप पर इसे लागू करने का सबसे साफ तरीका था। दुर्भाग्य से, 13.4 ने इस व्यवहार को बदल दिया है। मैं उन दृश्यों के पीछे अनुमान लगा रहा हूं जिनके पास अब एक चेक या कार्यान्वयन है जो वर्षों से गैर-मौजूद है .........
TheCodingArt

6

यदि आपका व्यूकंट्रोलर UINavigationController के अधीन है।

उपवर्ग UINavigationController और जोड़ें

override var preferredStatusBarStyle: UIStatusBarStyle {
    return topViewController?.preferredStatusBarStyle ?? .default
}

ViewController preferredStatusBarStyleकहा जाएगा।



4

IOS 7 में UIStatusBarStyle

IOS 7 में स्टेटस बार पारदर्शी है, इसके पीछे का दृश्य दिखाता है।

स्टेटस बार की शैली इसकी सामग्री के दिखावे को संदर्भित करती है। IOS 7 में, स्टेटस बार कंटेंट या तो डार्क ( UIStatusBarStyleDefault) या लाइट ( UIStatusBarStyleLightContent) है। दोनों UIStatusBarStyleBlackTranslucentऔर UIStatusBarStyleBlackOpaqueआईओएस 7.0 में पदावनत कर रहे हैं। UIStatusBarStyleLightContentइसके बजाय उपयोग करें ।

कैसे बदलें UIStatusBarStyle

यदि स्थिति पट्टी के नीचे एक नेविगेशन बार है, तो स्थिति बार शैली को नेविगेशन बार शैली ( UINavigationBar.barStyle) से मिलान करने के लिए समायोजित किया जाएगा :

विशेष रूप से, यदि नेविगेशन बार शैली UIBarStyleDefault है, तो स्टेटस बार शैली होगी UIStatusBarStyleDefault; यदि नेविगेशन बार शैली है UIBarStyleBlack, तो स्थिति बार शैली होगीUIStatusBarStyleLightContent

यदि स्टेटस बार के नीचे कोई नेविगेशन बार नहीं है, तो स्थिति बार शैली को नियंत्रित किया जा सकता है और एक व्यक्तिगत दृश्य नियंत्रक द्वारा बदला जा सकता है, जबकि ऐप चलता है।

- [UIViewController preferredStatusBarStyle]iOS 7 में एक नया तरीका जोड़ा गया है। इसे पसंदीदा स्टेटस बार स्टाइल को वापस करने के लिए ओवरराइड किया जा सकता है:

- (UIStatusBarStyle)preferredStatusBarStyle
  {
      return UIStatusBarStyleLightContent;
  }

यदि स्टेटस बार स्टाइल को स्वयं, ओवरराइड के बजाय चाइल्ड व्यू कंट्रोलर द्वारा नियंत्रित किया जाना चाहिए -[UIViewController childViewControllerForStatusBarStyle] उस चाइल्ड व्यू कंट्रोलर को वापस करने के लिए करें।

यदि आप इस व्यवहार से बाहर निकलना पसंद करते हैं और -[UIApplication statusBarStyle]विधि का उपयोग करके स्थिति पट्टी शैली सेट करते हैं , तो UIViewControllerBasedStatusBarAppearanceएक ऐप की Info.plistफ़ाइल में कुंजी जोड़ें और इसे मान न दें।


3

अगर कोई किसी नेविगेशन कंट्रोलर का उपयोग कर रहा है और चाहता है कि उसके सभी नेविगेशन कंट्रोलर के पास काली शैली हो, तो आप स्विफ्ट 3 में इस तरह UINavigationController के लिए एक एक्सटेंशन लिख सकते हैं और यह सभी नेविगेशन कंट्रोलर्स (इसे एक कंट्रोलर में असाइन करने के बजाय) पर लागू होगा समय)।

extension UINavigationController {

    override open func viewDidLoad() {
        super.viewDidLoad()

        self.navigationBar.barStyle = UIBarStyle.black
    }

}

1
लेकिन क्या होगा अगर मुझे नेविगेशनबार छिपा हुआ है?
स्लावचो

1
क्योंकि मुझे नेविगेशन छुपाने और स्टेटस बार दिखाई देने की आवश्यकता है।
स्लावचो

1

किसी भी तरह के UIViewController के लिए स्विफ्ट में:

आपके AppDelegateसेट में:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    window!.rootViewController = myRootController
    return true
}

myRootControllerकिसी भी तरह का हो सकता है UIViewController, जैसे UITabBarControllerया UINavigationController

फिर, इस रूट नियंत्रक को इस तरह से ओवरराइड करें:

class RootController: UIViewController {
    override func preferredStatusBarStyle() -> UIStatusBarStyle {
        return .LightContent
    }
}

यह आपके पूरे ऐप में स्टेटस बार की उपस्थिति को बदल देगा, क्योंकि रूट कंट्रोलर बार उपस्थिति के लिए पूरी तरह से जिम्मेदार है।

इस कार्य को करने के लिए View controller-based status bar appearanceअपने Info.plist(जो कि डिफ़ॉल्ट है) में YES को संपत्ति सेट करने के लिए याद रखें ।


@ यह स्विफ्ट 3 में कैसे करता है?
विमान

1

स्विफ्ट 3 iOS 10 सॉल्यूशन:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
 }

1

अधिकांश उत्तरों में childViewControllerForStatusBarStyleविधि का अच्छा कार्यान्वयन शामिल नहीं है UINavigationController। मेरे अनुभव के अनुसार आपको ऐसे मामलों को संभालना चाहिए, जब नेविगेशन नियंत्रक पर पारदर्शी दृश्य नियंत्रक प्रस्तुत किया जाता है। इन मामलों में आपको अपने मोडल कंट्रोलर ( visibleViewController) पर नियंत्रण रखना चाहिए , लेकिन गायब होने पर नहीं।

override var childViewControllerForStatusBarStyle: UIViewController? {
  var childViewController = visibleViewController
  if let controller = childViewController, controller.isBeingDismissed {
    childViewController = topViewController
  }
  return childViewController?.childViewControllerForStatusBarStyle ?? childViewController
}

1

मेरे मामले में, मैंने गलती से दृश्य / नेविगेशन नियंत्रक के रूप में प्रस्तुत किया है UIModalPresentationStyle.overFullScreen, जिसके कारण preferredStatusBarStyleकॉल नहीं किया जा रहा है। इसे वापस स्विच करने के बाद UIModalPresentationStyle.fullScreen, सब कुछ काम करता है।


1

IOS 13.4 के लिए श्रेणी preferredStatusBarStyleमें विधि UINavigationControllerको नहीं कहा जाएगा, उप-वर्ग का उपयोग करने की आवश्यकता के बिना स्विज़लिंग एकमात्र विकल्प लगता है।

उदाहरण:

श्रेणी हेडर:

@interface UINavigationController (StatusBarStyle)
+ (void)setUseLightStatusBarStyle;
@end

कार्यान्वयन:

#import "UINavigationController+StatusBarStyle.h"
#import <objc/runtime.h>

@implementation UINavigationController (StatusBarStyle)

void (^swizzle)(Class, SEL, SEL) = ^(Class c, SEL orig, SEL new){
    Method origMethod = class_getInstanceMethod(c, orig);
    Method newMethod = class_getInstanceMethod(c, new);
    if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
        class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
    else
        method_exchangeImplementations(origMethod, newMethod);
};

+ (void)setUseLightStatusBarStyle {
    swizzle(self.class, @selector(preferredStatusBarStyle), @selector(_light_preferredStatusBarStyle));
}

- (UIStatusBarStyle)_light_preferredStatusBarStyle {
    return UIStatusBarStyleLightContent;
}    
@end

AppDelegate.h में उपयोग:

#import "UINavigationController+StatusBarStyle.h"

[UINavigationController setUseLightStatusBarStyle];

0

इसे हल करने के लिए यहां मेरा तरीका है।

AGViewControllerAppearance नामक एक प्रोटोकॉल को परिभाषित करें ।

AGViewControllerAppearance.h

#import <Foundation/Foundation.h>

@protocol AGViewControllerAppearance <NSObject>

@optional

- (BOOL)showsStatusBar;
- (BOOL)animatesStatusBarVisibility;
- (UIStatusBarStyle)preferredStatusBarStyle;
- (UIStatusBarAnimation)prefferedStatusBarAnimation;

@end

UIViewController पर एक श्रेणी को परिभाषित करें जिसे अपग्रेड कहा जाता है ।

UIViewController + Upgrade.h

#import <UIKit/UIKit.h>

@interface UIViewController (Upgrade)

//
//  Replacements
//

- (void)upgradedViewWillAppear:(BOOL)animated;

@end

UIViewController + Upgrade.m

#import "UIViewController+Upgrade.h"

#import <objc/runtime.h>

#import "AGViewControllerAppearance.h" // This is the appearance protocol

@implementation UIViewController (Upgrade)

+ (void)load
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wselector"
    Method viewWillAppear = class_getInstanceMethod(self, @selector(viewWillAppear:));
#pragma clang diagnostic pop
    Method upgradedViewWillAppear = class_getInstanceMethod(self, @selector(upgradedViewWillAppear:));
    method_exchangeImplementations(viewWillAppear, upgradedViewWillAppear);
}

#pragma mark - Implementation

- (void)upgradedViewWillAppear:(BOOL)animated
{
    //
    //  Call the original message (it may be a little confusing that we're
    //  calling the 'same' method, but we're actually calling the original one :) )
    //

    [self upgradedViewWillAppear:animated];

    //
    //  Implementation
    //

    if ([self conformsToProtocol:@protocol(AGViewControllerAppearance)])
    {
        UIViewController <AGViewControllerAppearance> *viewControllerConformingToAppearance =
        (UIViewController <AGViewControllerAppearance> *)self;

        //
        //  Status bar
        //

        if ([viewControllerConformingToAppearance respondsToSelector:@selector(preferredStatusBarStyle)])
        {
            BOOL shouldAnimate = YES;

            if ([viewControllerConformingToAppearance respondsToSelector:@selector(animatesStatusBarVisibility)])
            {
                shouldAnimate = [viewControllerConformingToAppearance animatesStatusBarVisibility];
            }

            [[UIApplication sharedApplication] setStatusBarStyle:[viewControllerConformingToAppearance preferredStatusBarStyle]
                                                        animated:shouldAnimate];
        }

        if ([viewControllerConformingToAppearance respondsToSelector:@selector(showsStatusBar)])
        {
            UIStatusBarAnimation animation = UIStatusBarAnimationSlide;

            if ([viewControllerConformingToAppearance respondsToSelector:@selector(prefferedStatusBarAnimation)])
            {
                animation = [viewControllerConformingToAppearance prefferedStatusBarAnimation];
            }

            [[UIApplication sharedApplication] setStatusBarHidden:(! [viewControllerConformingToAppearance showsStatusBar])
                                                    withAnimation:animation];
        }
    }
}

@end

अब, यह कहने का समय है कि आप देख रहे हैं कि नियंत्रक AGViewControllerAppearance प्रोटोकॉल लागू कर रहा है।

उदाहरण:

@interface XYSampleViewController () <AGViewControllerAppearance>

... the rest of the interface

@end

बेशक, आप तरीकों (के बाकी को लागू कर सकते showsStatusBar , animatesStatusBarVisibility , prefferedStatusBarAnimation प्रोटोकॉल और से) UIViewController + अपग्रेड उचित उन्हें द्वारा प्रदान की मूल्यों पर आधारित अनुकूलन कर सकते हैं।


0

यदि कोई व्यक्ति UISearchController के साथ इस समस्या में चलता है। बस UISearchController का एक नया उपवर्ग बनाएँ, और फिर उस वर्ग में नीचे कोड जोड़ें:

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .LightContent
}

0

ध्यान दें कि जब का उपयोग कर self.navigationController.navigationBar.barStyle = UIBarStyleBlack; समाधान

अपनी मुट्ठी में जाना सुनिश्चित करें और हाँ के लिए "नियंत्रक-आधारित स्थिति बार उपस्थिति" सेट करें। अगर इसका NO नहीं है तो यह काम नहीं करेगा।


परियोजना plist में YES को UIViewControllerBasedStatusBarAppearance सेट करना मेरे लिए सभी अंतर बनाता है। मैं इसके बारे में भूल गया था।
filo

0

Xcode 11.4 के बाद से, ओवरराइडिंग preferredStatusBarStyle UINavigationController एक्सटेंशन में संपत्ति को अब काम नहीं करता है क्योंकि यह नहीं कहा जाएगा।

स्थापना barStyleके navigationBarलिए .blackकाम करता है वास्तव में, लेकिन यह अवांछित साइड इफेक्ट जोड़ना होगा यदि आप navigationBar जो प्रकाश और अंधेरे मोड के लिए अलग-अलग रूप से सामने आए हो सकता है के लिए subviews जोड़ें। क्योंकि barStyleकाले रंग में सेट करके , userInterfaceStyleनेविगेशन बार में एम्बेड किए गए एक दृश्य thats की हमेशा एप्लिकेशन की userInterfaceStyle.darkपरवाह किए बिना होगा userInterfaceStyle

मैं जिस उचित समाधान के साथ आता हूं, वह वहां का उपवर्ग जोड़कर UINavigationControllerओवरराइड करता preferredStatusBarStyleहै। यदि आप अपने पसंदीदा सभी बचत के लिए इस कस्टम UINavigationController का उपयोग करते हैं।


-1

नेवीगेशनकंट्रोलर या TabBarController वे हैं जिन्हें स्टाइल प्रदान करने की आवश्यकता है। यहां बताया गया है कि मैंने कैसे हल किया: https://stackoverflow.com/a/39072526/242769


अगर आपको लगता है कि यह किसी अन्य प्रश्न का डुप्लिकेट है, तो कृपया इसे डुप्लिकेट के रूप में बंद करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.