दिलचस्प पोस्ट
didSelectRowAtIndexPath: नहीं बुलाया जा रहा है एक्स 86 पर कोई 128-बिट इंटेजर्स की कुशल गुणा / विभाजित (कोई 64-बिट नहीं) विभाजन में सरणी विभाजित करें एंड्रॉइड: किसी गतिविधि में अस्थायी रूप से अभिविन्यास परिवर्तन अक्षम करें Std :: नक्शा के साथ रेंज-आधारित () लूप का उपयोग कैसे करें? कैसे bsp स्क्रिप्ट से पासवर्ड के साथ sftp कमांड चलाने के लिए? ASP.NET MVC में विफलता मान्यकरण के बाद इनपुट टाइप = फाइल फ़ील्ड मान कैसे रखना है? गतिशील रूप से जावास्क्रिप्ट में स्थानीय फ़ंक्शन को कॉल करें srand फ़ंक्शन समान मूल्यों को वापस कर रहा है मैक एक्सेल 2011 VBA में Dir () फ़ंक्शन काम नहीं कर रहा है किसी क्षेत्र को पूरी तरह से एक MongoDB दस्तावेज़ से कैसे निकालें? Typedef और नए के साथ typename कीवर्ड का उपयोग सी #: डेटाग्रिड दृश्य नियंत्रण में बहुभाषी पाठ उपलब्ध स्थान को भरने के लिए WPF में नियंत्रण कैसे प्राप्त करें? स्पष्ट रूप से उदाहरणों को आयात करें

UITcrollView के अंदर UIScrollView स्क्रोलिंग के बाद पहले नल प्राप्त नहीं है

संक्षिप्त करें

मुझे UIScrollView अंदर एक UITableView साथ एक समस्या हो रही है जब मैं बाहरी स्क्रॉल स्क्रॉल को स्क्रॉल करता हूं, तो table को पहले स्पर्श पर willSelect/didSelect इवेंट को प्राप्त नहीं होता है, लेकिन यह दूसरा एक पर करता है। इससे भी अधिक अजीब क्या है, सेल खुद छूता है और हाइलाइट किया गया राज्य है, तब भी जब delegate नहीं करता है।

विस्तृत विवरण

मेरा दृश्य पदानुक्रम:

 UIView - UIScrollView (outerscroll) - Some other views and buttons - UITableView (tableView) 

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

टेबल व्यू एक अनुवाद प्रभाव से तब्दील हो जाता है जब आउटर्सकोल इस तरह चलता रहता है:

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView == self.outerScrollView) { CGFloat tableOffset = scrollView.contentOffset.y - self.fixedHeaderFrame.origin.y; if (tableOffset > 0) { self.tableView.contentOffset = CGPointMake(0, tableOffset); self.tableView.transform = CGAffineTransformMakeTranslation(0, tableOffset); } else { self.tableView.contentOffset = CGPointMake(0, 0); self.tableView.transform = CGAffineTransformIdentity; } // Other similar transformations are done here, but not involving the table } 

मेरे सेल में, यदि मैं इन विधियों को कार्यान्वित करता हूं:

 - (void)setSelected:(BOOL)selected { [super setSelected:selected]; if (selected) { NSLog(@"selected"); } } - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { [super setHighlighted:highlighted animated:animated]; if (highlighted) { NSLog(@"highlighted"); } } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; NSLog(@"touchesBegan"); } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesEnded:touches withEvent:event]; NSLog(@"touchesEnded"); } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesCancelled:touches withEvent:event]; NSLog(@"touchesCancelled"); } 

जब यह विफल हो जाता है तो Y आउटपुट देख सकते हैं (पहले टैप करें):

 2014-02-10 13:04:40.940 MyOrderApp[5588:70b] highlighted 2014-02-10 13:04:40.940 MyOrderApp[5588:70b] touchesBegan 2014-02-10 13:04:40.978 MyOrderApp[5588:70b] touchesEnded 

और यह एक काम करता है (दूसरा नल):

 2014-02-10 13:05:30.359 MyOrderApp[5588:70b] highlighted 2014-02-10 13:05:30.360 MyOrderApp[5588:70b] touchesBegan 2014-02-10 13:05:30.487 MyOrderApp[5588:70b] touchesEnded 2014-02-10 13:05:30.498 MyOrderApp[5588:70b] expanded 

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

मैंने कुछ गुणों को भी बदलने का प्रयोग किया, लेकिन कोई भाग्य के साथ नहीं। मैंने जो कुछ किया:

  • स्क्रॉल और तालिका के अलावा अन्य दृश्यों से उपयोगकर्ता userInteractionEnabled करें
  • टेबल पर setNeedsLayout करें setNeedsLayout को कॉल करें, स्क्रॉल करें और setNeedsLayout पर मुख्य दृश्य हो।
  • तालिका से परिवर्तनों को निकालें (अभी भी होता है)

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

ऐप IOS7 + केवल है

प्रशन

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

अपडेट

  • मैंने एक टिप्पणी में सुझाए अनुसार सेल पुन: उपयोग को अक्षम करने की कोशिश की लेकिन यह अभी भी उसी तरह से होता है।

Solutions Collecting From Web of "UITcrollView के अंदर UIScrollView स्क्रोलिंग के बाद पहले नल प्राप्त नहीं है"

एप्पल प्रलेखन से , आपको UIScrollView अंदर UITableView को एम्बेड नहीं करना चाहिए।

महत्वपूर्ण: आपको UIWebView या UITableView ऑब्जेक्ट्स UIScrollView ऑब्जेक्ट में एम्बेड नहीं करना चाहिए। यदि आप ऐसा करते हैं, तो अप्रत्याशित व्यवहार का नतीजा हो सकता है क्योंकि दो ऑब्जेक्ट के लिए टच ईवेंट को मिश्रित किया जा सकता है और गलत रूप से संभाला जा सकता है।

आपकी समस्या वास्तव में आपके UIScrollView से संबंधित है।

लेकिन अगर यह आवश्यक है कि तालिका UITableView को छिपाने के लिए (यह मेरा मामला था), तो आप यूआईटीबल वीव को अपने पर्यवेक्षण में स्थानांतरित कर सकते हैं।

मैंने यहां एक छोटा उदाहरण लिखा है: https://github.com/rvirin/SoundCloud/

अंदरूनी UITableView की scrollEnabled छोड़ scrollEnabled प्रॉपर्टी सेट को YES रूप में सेट करें यह अंदर की UITableView को UIScrollView पर स्क्रॉल से संबंधित छू को सही ढंग से संभालने के लिए UIScrollView है।

मैं एक ही समस्या में भाग गया और एक समाधान लगा!

आपको अपने स्क्रॉल delaysTouchesBegan में सही करने के लिए delaysTouchesBegan को सेट करना होगा delaysTouchesBegan इसके असफल delaysTouchesBegan (यानी टैप) अपने बच्चों को भेज सके।

var delaysTouchesBegan: Bool बूलियन मान यह निर्धारित करता है कि क्या रिसीवर शुरुआत के चरण में छूने से विलंब करता है।

जब संपत्ति का मान हां है, तो खिड़की यूआईटीचफ़ेसबेजन चरण में टच ऑब्जेक्ट्स को डिलीवरी को निलंबित करता है। यदि इशारा पहचानकर्ता बाद में अपने इशारे को पहचानता है, तो इन स्पर्श ऑब्जेक्ट को त्याग दिया जाता है। यदि इशारे पहचानकर्ता, हालांकि, अपने इशारे को स्वीकार नहीं करता है, तो खिड़की इन वस्तुओं को एक स्पर्श में देखने में बचाता है: बैंगन: साथ-साथ: संदेश (और संभवतया एक अनुवर्ती छूता हुआ हैः साथ में: संदेश: संदेश को वर्तमान स्थान के बारे में सूचित करने के लिए) ।

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizer_Class/index.html#//apple_ref/occ/instp/UIGestureRecognizer/delaysTouchesBegan

लेकिन वहाँ एक पकड़ है … अगर आप इसे सीधे स्क्रॉलव्यू पर करते हैं तो यह काम नहीं करता है!

 // Does NOT work self.myScrollview.delaysTouchesBegan = true 

जाहिरा तौर पर यह एक आईओएस बग है, जहां यह गुण स्थापित करने में काम नहीं करता है (आपको सेब धन्यवाद)। हालांकि, एक सरल समाधान है: सीधे स्क्रॉलएव्यू के पैन इशारे पर संपत्ति सेट करें ज़रुरत है, यह मेरे लिए पूरी तरह से काम करता है:

 // This works!! self.myScrollview.panGestureRecognizer.delaysTouchesBegan = true 

ऐसा लगता है कि आपका UiTableView आपके नल को नहीं पहचानता है क्या आप इसका उपयोग करने की कोशिश करते थे:

 - (BOOL)gestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer *)otherGestureRecognizer { if ([otherGestureRecognizer.view isKindOfClass:[UITableView class]]) { return YES; } return NO; } 

सेब से नोट:

कहा जाता है कि जब एक इशारे के पहचानकर्ता या अन्य गेटर्सरेक्जरीकर्ता को मान्यता दी जाती है तो दूसरे द्वारा अवरुद्ध किया जाएगा। दोनों को एक साथ पहचानने की इजाजत देने के लिए हां वापस लौटें डिफ़ॉल्ट क्रियान्वयन रिटर्न (डिफ़ॉल्ट रूप से कोई दो इशारों को एक साथ पहचाना जा सकता है)

ध्यान दें: एक साथ मान्यता की अनुमति देने के लिए YES की वापसी की गारंटी है। लौटने के लिए एक साथ मान्यता को रोकने के लिए गारंटी नहीं है, क्योंकि अन्य इशारे के प्रतिनिधि के पास हां हो सकता है

उम्मीद है कि मदद मिलेगी

इशारे के पहचानकर्ता दो एम्बेडेड स्क्रॉल दृश्यों या उप-क्लासेस के लिए ठीक से काम नहीं करेंगे।

एक वैकल्पिक हल की कोशिश करो:

  1. सेल टैग, या UIButton साथ सेल UIButton में सब कुछ पारदर्शी, कस्टम और UIButton और एक इंडेक्स पथ की संपत्ति जोड़ें और पुन: उपयोग किए गए सेल में हर बार ओवरराइट करें

  2. अपने कस्टम सेल को एक संपत्ति के रूप में इस बटन को जोड़ें

  3. वांछित UIControlEvent (एक या अधिक) के लिए लक्ष्य जोड़ें जो कि आपके UITableViewDelegate प्रोटोकॉल को कक्षा को अपनाने के लिए इंगित करता है।

  4. आईबी में चयन को अक्षम करें, और कोड से चयन को मैन्युअल रूप से प्रबंधित करें।

इस समाधान के लिए एकल / बहु चयन के मामलों के लिए ध्यान देने की आवश्यकता है

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

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 

स्क्रॉलव्यू यह पता लगाने की कोशिश कर रहा है कि प्रयोक्ता का इरादा स्क्रॉल करना है या नहीं, इसलिए उद्देश्य पर प्रारंभिक स्पर्श में देरी हो रही है या नहीं। आप delaysContentTouches सेट करके delaysContentTouches बंद कर सकते हैं।

नेस्टेड UITableView के साथ मेरे पास एक ही समस्या है और इस के लिए एक काम मिल गया है:

 innerTableView.scrollEnabled = YES; innerTableView.alwaysBounceVertical = NO; 

आपको अपने कक्ष की कुल ऊंचाई से मिलान करने के लिए आंतरिक तालिका दृश्य की ऊंचाई निर्धारित करने की आवश्यकता होगी ताकि उपयोगकर्ता स्क्रॉल न करे जब उपयोगकर्ता बाहरी दृश्य स्क्रॉल करेगा।

उम्मीद है की यह मदद करेगा।

मेरी गलती प्रतिनिधि विधि को लागू कर रही थी:

 - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath 

एक के बजाय मैं लागू करने के लिए मतलब:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

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

जैसा कि अन्य उत्तर कहते हैं कि आपको एक स्क्रॉलव्यू में एक टेबलव्यूव नहीं डालनी चाहिए। एक UITableView IIScrollView से संभालता है वैसे भी इसलिए मुझे लगता है कि जहां चीजें भ्रमित हो मैं हमेशा इस स्थिति में क्या करता हूं:

1) उपवर्ग UITableViewController और एक संपत्ति UIView * headView शामिल हैं।

2) माता-पिता UIViewController में एक कंटेनर UIView में सभी शीर्ष सामग्री बनाते हैं

3) अपना कस्टम UITableView आरंभ करें और दृश्य नियंत्रक पूर्ण आकार के लिए तालिका दृश्य देखें

 [self.view addSubview: self.myTableView.view]; 

4) अपने UIView gubbins होने के लिए headView सेट करें

 self.tableView.headView = myHeadViewGubbins. 

5) तालिका दृश्य नियंत्रक विधि में

 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger *)section; 

कर:

 if ( section == 0 ) { return self.headView; } 

अब आपके पास शीर्ष पर एक अन्य शेलज़ के एक समूह के साथ टेबल दृश्य है।

का आनंद लें!

मुझे कुछ विरासत कोड में UIScrollView के भीतर स्क्रॉल सक्षम होने के साथ UITableView का सामना करना पड़ रहा है। मैं मौजूदा पदानुक्रम को आसानी से बदलने और स्क्रॉलिंग को सक्षम नहीं कर पा रहा हूं, लेकिन पहली टैप समस्या के लिए निम्नलिखित समाधान के साथ आया हूं:

 @interface YourOwnTableView : UITableView @end @implementation YourOwnTableView - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesCancelled:touches withEvent:event]; // Note that this is a hack and it can stop working at some point. // Looks like a table view with scrollEnabled being NO does not handle cancellation cleanly, // so let's repeat begin/end touch sequence here hoping it'll reset its own internal state properly // but won't trigger cell selection (the touch passed is in its cancelled phase, perhaps there is a part // of code inside which actually checks it) [super touchesBegan:touches withEvent:event]; [super touchesEnded:touches withEvent:event]; } @end 

फिर, यह मेरे विशिष्ट मामले में केवल एक वैकल्पिक काम है। एक स्क्रॉल व्यू के भीतर एक तालिका देखने के बाद भी अभी भी एक गलत बात है

कि, अगर स्पर्श तालिका देखें तो यह ठीक से काम करेगी। उसी दृश्य नियंत्रक में स्क्रॉल व्यू के साथ भी।

 tableview.scrollEnabled = true; 

मेरे पास एक ही मुद्दा है, फिर "नेस्टिंग स्क्रॉल दृश्य" का संदर्भ लें, जैसा कि एलएक्स ने कहा।

https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/UIScrollView_pg/NestedScrollViews/NestedScrollViews.html

क्रॉस दिशात्मक स्क्रॉलिंग का एक उदाहरण स्टॉक एप्लीकेशन में पाया जा सकता है। शीर्ष दृश्य एक तालिका दृश्य है, लेकिन नीचे दृश्य एक क्षैतिज स्क्रॉल दृश्य है जो पेजिंग मोड के जरिये कॉन्फ़िगर किया गया है । जबकि इसके तीन में से दो उप-कस्टम कस्टम दृश्य हैं, तीसरे दृश्य (जिसमें समाचार लेख शामिल हैं) एक UITableView (UIScrollView का उपवर्ग) है जो कि क्षैतिज स्क्रॉल दृश्य का एक सबव्यूज़ है। आप समाचार दृश्य में क्षैतिज रूप से स्क्रॉल करने के बाद, आप उसके सामग्री को लंबवत स्क्रॉल कर सकते हैं।

यह कार्य है

  1. अपने UITableViewCell पर UIButton ड्रॉप करें और "btnRowSelect" के रूप में आउटलेट बनाएं
  2. आपके दृश्य नियंत्रक में यह कोड cellForRowAtIndexPath में डाल दिया

     cell.btnRowSelect.tag = indexPath.row cell.btnRowSelect.addTarget(self, action: Selector("rowSelect:"), forControlEvents: .TouchUpInside) 
  3. इस फ़ंक्शन को अपने viewController में भी जोड़ें-

     func rowSelect (sender:UIButton) { // "sendet.tag" give you the selected row // do whatever you want to do in didSelectRowAtIndexPath } 

इस फ़ंक्शन "rowSelect" के रूप में काम करेंगे, SelectionRowAtIndexPath जहां आप पंक्ति "indexPath.row" को "sender.tag" के रूप में प्राप्त करते हैं