ios स्विफ्ट 5.0 संकलक के साथ Xcode 10.2-प्रोटोकॉल वंशानुक्रम समस्या




swift protocols (3)

हमारे पास वर्तमान Xcode संस्करण (10.2) के साथ एक बड़ा मुद्दा है।

निम्नलिखित हस्ताक्षर के साथ एक BasicViewController वर्ग है:

class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate

फिर हमारे पास एक और वर्ग है जैसे कि ExampleViewController: BasicViewController जिसमें कुछ अतिरिक्त तर्क हैं।

मुश्किल हिस्सा यहां से शुरू होता है...

हम विभिन्न सिमुलेटर और उपकरणों पर ऐप बनाते हैं और चलाते हैं और सब कुछ ठीक से काम करता है। फिर हम एप्लिकेशन को संग्रहित करते हैं और अचानक किया गया didSelectRow अब निकाल नहीं है। प्रोजेक्ट की गहरी और साफ सफाई ने हमें फिर से संग्रह करने की आवश्यकता के बिना समस्या को पुन: पेश करने की अनुमति दी।

मैं किसी भी मामले के बारे में नहीं सोच सकता जब ऐसा हो सकता है। और यह और भी बदतर हो जाता है, क्योंकि मुझे UITableViewDelegate तरीकों के साथ और अधिक समान मुद्दे मिले हैं, जो केवल संग्रहीत ऐप चलाते समय बाल वर्ग में नहीं बुलाए जाते हैं। क्या यह संग्रह और एप्लिकेशन सबमिट करने के दौरान कुछ अनुकूलन के साथ एक मुद्दा हो सकता है?

मैं सत्यापित करता हूं कि हम तालिका के dataSource और delegate को ठीक से सेट करते हैं, मेज पर कोई इशारा पहचानने वाले नहीं हैं। ऐप को दूसरी / तीसरी बार चलाने के बाद एक ही तर्क अच्छी तरह से काम करता है, लेकिन प्रोजेक्ट की गहरी सफाई के बाद पहली बार विफल होता है।

हमने एक परीक्षण किया और UITableViewDataSource और UITableViewDelegate को बाल वर्ग में सेट किया और फिर यह हर बार अपेक्षित रूप से काम करता है। ऐसा लगता है कि प्रोटोकॉल विरासत में मिला है, यह अच्छी तरह से काम नहीं करता है। अगर हम प्रोटोकॉल को माता-पिता में रखते हैं और उन्हें बच्चे की कक्षा में भी जोड़ते हैं, तो यह कहता है कि बच्चे की कक्षा में प्रोटोकॉल निरर्थक हैं।

क्या किसी ने भी कुछ ऐसा ही अनुभव किया है? किसी भी सुझाव का स्वागत है।


मैं उसी मुद्दे में भाग गया। मैंने इसे अपने मुख्य वर्ग में सीधे तरीकों को जोड़कर तय किया, और अन्य कक्षाओं में उन्हें ओवरराइड किया। अब सबकुछ सही हो जाता है।


आपको dataSource संलग्न करना चाहिए और Storyboard और क्लास का उपयोग करके दोनों पक्षों को dataSource चाहिए, क्योंकि एक बार मेरे पास dataSource लिए एक ही मुद्दा था और यह कक्षा में होने के कारण नहीं था

self.tableView.delegate = self
self.tableView.datasource = self

मुझे लगता है कि आप ऐसा नहीं कर रहे हैं।

मुझे पता है कि दोनों शैली का उपयोग करना आवश्यक नहीं है, लेकिन कुछ समय हमें इसकी आवश्यकता है। इस उत्तर https://.com/a/39443079/3485420 पर एक नज़र डालें


आप स्विफ्ट 5.0 कंपाइलर में https://bugs.swift.org/browse/SR-10257 चल सकते हैं। ऐसा होगा यदि आपके पास कम से कम तीन फाइलें हों:

  1. BasicViewController.swift
  2. SomeOtherFile.swift
  3. ExampleViewController.swift

यदि SomeOtherFile.swift किसी AnyObject -typed मान पर कोई भी कॉल करता है, तो आप wholemodule मोड में संकलित कर रहे हैं, और फ़ाइलों को कंपाइलर को उपरोक्त क्रम में ( SomeOtherFile.swift साथ SomeOtherFile.swift के बीच में) SomeOtherFile.swift जाता है, तो ऐसा लगता है। यह कंपाइलर @objc के कार्यान्वयन के लिए @objc को ठीक से @objc विफल रहता है func tableView(_:, didSelectRowAt:) । आप इसे स्पष्ट रूप से @objc के साथ टैग करके इसके चारों ओर काम कर सकते हैं।





protocols