सवाल स्विफ्ट में वापस जेस्चर स्वाइप अक्षम करें


थोड़ी देर के लिए यहां पर देख रहे थे लेकिन एक कामकाजी समाधान नहीं लग रहा है।

मैं स्विफ्ट में पिछले दृश्य इशारा पर वापस जाने के लिए स्वाइप अक्षम करने की कोशिश कर रहा हूं।

मैंने विभिन्न समाधानों की कोशिश की है जिनमें शामिल हैं:

self.navigationController?.interactivePopGestureRecognizer.enabled = false

तथा

self.navigationController.interactivePopGestureRecognizer.delegate = self

func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer!) -> Bool {
    return false;
}

क्या ऐसा करने की कोई नई विधि है या कुछ अन्य विधि जो काम करती हैं?


44
2017-07-30 18:48


मूल


कृपया इसे अक्षम न करें। जब ऐप्स ने इसे अक्षम कर दिया है तो मुझे नफरत है। - Aaron Brager
यह कोई समस्या पैदा कर रहा है जब कोई उपयोगकर्ता पूरी तरह से स्वाइप नहीं करता है, और यूआई की प्रकृति में हस्तक्षेप करता है जिसे हम उपयोग कर रहे हैं (ऑडियो ट्रैक में समय मांगना) - Phil Hudson
खैर, मैं आपका प्रश्न नहीं हटाना चाहता, लेकिन मेरा सुझाव है कि आप (1) पूरी तरह से स्वाइप समस्या को हल नहीं करते हैं और (2) यूआई की तलाश में अपने ऑडियो ट्रैक को इंडेंट करें ताकि यह किनारे के नजदीक न हो। यह यूएक्स की उम्मीद है, और आईफोन 6 प्लस और आईपैड उपयोगकर्ताओं के लिए विशेष रूप से महत्वपूर्ण है जहां नेविगेशन बार में जाने की परेशानी है। - Aaron Brager
वैसे भी, आपके कोड को इशारा पहचानकर्ता को अक्षम करना चाहिए। क्या यह आईओएस के पुराने संस्करणों पर काम करता है? - Aaron Brager
आईफोन 6 के बारे में आह अच्छा बिंदु - शायद मैं डेलोक विधि को संशोधित करने के लिए देखता हूं - लेकिन फिर भी मैं इस सवाल को तब भी खोलूंगा जब तक मुझे दिलचस्पी है - Phil Hudson


जवाब:


आप इसे अक्षम कर सकते हैं लेकिन इसकी अनुशंसा नहीं की जाएगी क्योंकि अधिकांश आईओएस उपयोगकर्ता वापस बटन दबाकर स्वाइप करके और कम करके वापस जाते हैं। यदि आप इसे अक्षम करना चाहते हैं तो इसका उपयोग करना अधिक उचित होगा modal segue एक पुश सेगू के बजाय जो हस्तांतरण का बड़ा नहीं है। यदि आप वास्तव में वापस फ़ंक्शन पर जाने के लिए स्वाइप से छुटकारा पाना चाहते हैं तो मैं बैक बटन को अक्षम कर दूंगा और स्क्रीन के ऊपरी दाएं भाग पर एक बटन दबाऊंगा।

self.navigationController?.navigationItem.backBarButtonItem?.isEnabled = false;

8
2017-07-30 19:07





स्वाइप वापस अक्षम करने और पुनः सक्षम करने के लिए निम्नलिखित एक आसान तरीका है।

स्विफ्ट 3.x और ऊपर

एक दृश्य में DidLoad / willAppear / didAppear विधि जोड़ें:

navigationController?.interactivePopGestureRecognizer?.isEnabled = false

बस ध्यान रखें कि यदि आप इसे करते हैं viewDidLoad, अगली बार जब आप दृश्य खोलेंगे, तो यह आपके स्टैक में बनी रहती है या नहीं, इस पर सेट नहीं किया जा सकता है।

जब तक आप इसे बंद नहीं करना चाहते हैं, तब तक जब आप दृश्य को बंद कर देते हैं तो आपको उसे वापस चालू करने की आवश्यकता होगी willMove(toParentViewController:) या willDisappear। तुंहारे navigationController पर शून्य होगा viewDidDisappear, तो बहुत देर हो चुकी है।

navigationController?.interactivePopGestureRecognizer?.isEnabled = true

पर एक विशेष नोट SplitViewControllers:

जैसा टिप्पणियों में कॉम्पसी द्वारा इंगित किया गया है, आपको इसे विस्तार से देखने के लिए दूसरे नेविगेशन नियंत्रक को कॉल करने की आवश्यकता होगी:

navigationController?.navigationController?.interactivePopGe‌​stureRecognizer?.isE‌​nabled = false

स्विफ्ट 2.2 और उद्देश्य-सी

स्विफ्ट संस्करण 2.x और नीचे:

navigationController?.interactivePopGestureRecognizer?.enabled

उद्देश्य सी:

self.navigationController.interactivePopGestureRecognizer.enabled

85
2017-08-05 16:28



मुझे यह काम करने में थोड़ी परेशानी हो रही थी, जब तक मुझे एहसास नहीं हुआ कि चूंकि व्यू कंट्रोलर मैं इसे अक्षम करने की कोशिश कर रहा था, स्प्लिट व्यू कंट्रोलर के विस्तार पक्ष पर था, यह तकनीकी रूप से एक अलग नेविगेशन नियंत्रक में है (भले ही, कब ध्वस्त हो गया, ऐसा लगता है कि यह एक ही नियंत्रक में है)। इस के आसपास पाने के लिए मुझे करना था: navigationController?.navigationController?.interactivePopGestureRecognizer?.isEnabled = false - CompC
@CompC अद्यतन के लिए धन्यवाद, उस परिदृश्य को कभी नहीं मिला, इतना जानना अच्छा है। - CodeBender
यह एपियर में इसे अक्षम करने के लिए पर्याप्त है, और इसे फिर से सक्षम कर देगा। विशेष रूप से इसे फिर से सक्षम करने के लिए डिस्प्लेर बेकार है, क्योंकि नेविगेशन नियंत्रक संपत्ति पहले से ही शून्य है। - Vilém Kurz
धन्यवाद यह सही जवाब होना चाहिए - Hernan Arber
@ iajmeri43 हां, UINavigationController का उप-वर्ग बनाएं, और उसके बाद संपत्ति को इसके दृश्य में सेट करें। जब तक एवी नियंत्रक का उपयोग उन सभी विचारों द्वारा किया जाता है जिन्हें आप ऐप के भीतर चाहते हैं, यह काम करेगा। - CodeBender


मैं इशारा रिकॉर्डर ShouldBegin में झूठी लौटकर ऐसा करने में सक्षम था

class ViewController2: UIViewController, UIGestureRecognizerDelegate {
...
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    self.navigationController?.interactivePopGestureRecognizer.delegate = self
}

func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
    return false
}

17
2017-07-30 19:08



ध्यान दें UIGestureRecognizer! ओपी के कोड बनाम में। UIGestureRecognizer यहाँ। - Aaron Brager


हरि या स्टीफन से किसी भी जवाब के साथ कुछ भी गलत नहीं है लेकिन यह अधिक संक्षिप्त है। बस इसे डीडलोड में देखें और आप कर चुके हैं।

if navigationController!.respondsToSelector(Selector("interactivePopGestureRecognizer")) {
    navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer)
}

संपादित करें:

एक छोटी चेतावनी यह है कि अगर नेविगेशन कंट्रोलर को किसी अन्य दृश्य द्वारा खोला गया था और नेविगेशन कंट्रोलर बंद है तो आपको एक EXC_BAD_ACCESS त्रुटि मिल जाएगी। इसे ठीक करने के लिए आपको मूल UIGestureRecognizer को सहेजना होगा और दृश्य से बाहर निकलने पर इसे वापस रखना होगा।

घोषित:

private var popGesture: UIGestureRecognizer?

इशारा हटाने से तुरंत तुरंत:

popGesture = navigationController!.interactivePopGestureRecognizer

फिर दृश्य को बंद करते समय:

If popGesture != nil {
    navigationController!.view.addGestureRecognizer(popGesture!)
}

5
2017-08-29 06:18



यह एक आकर्षक की तरह काम किया - David Seek


उद्देश्य के लिए - सी

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

  self.navigationController.interactivePopGestureRecognizer.enabled = NO;

}

3
2018-02-17 11:12





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

इस परिदृश्य के लिए मैं उपयोग कर रहा हूं:

navigationController?.interactivePopGestureRecognizer?.isEnabled = false
navigationItem.hidesBackButton = true

में viewWillAppear() अंतिम स्क्रीन पर। आप इन्हें पूर्ववत कर सकते हैं viewWillDisappear() यदि आप एक और दृश्य दबा रहे हैं और उन्हें वहां चाहिए।


2
2017-10-06 19:09





रोवन पीडी के लिए तर्क स्विफ्ट 4

private var popGesture: UIGestureRecognizer?

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

    if navigationController!.responds(to: #selector(getter: UINavigationController.interactivePopGestureRecognizer)) {
        self.popGesture = navigationController!.interactivePopGestureRecognizer
        self.navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer!)
    }

}

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

    if let gesture = self.popGesture {
        self.navigationController!.view.addGestureRecognizer(gesture)
    }

}

1
2017-09-29 05:41