2012-03-31 9 views
12

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

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

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return UITableViewCellEditingStyleNone; 
} 

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row == [self.itemArray count]) { 
     return NO; 
    } 
    return YES; 
} 

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row == [self.itemArray count]) { 
     return NO; 
    } 
    return YES; 
} 

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
    Item *item = [self.itemArray objectAtIndex:fromIndexPath.row]; 
    [self.itemArray removeObjectAtIndex:fromIndexPath.row]; 
    [self.itemArray insertObject:item atIndex:toIndexPath.row]; 
} 

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath { 
    if ([proposedDestinationIndexPath row] < [self.itemArray count]) { 
     return proposedDestinationIndexPath; 
    } 
    NSIndexPath *betterIndexPath = [NSIndexPath indexPathForRow:[self.itemArray count]-1 inSection:0]; 
    return betterIndexPath; 
} 

डिबग करने की कोशिश कर पर, ऐसा लगता है कि tableView: moveRowAtIndexPath: लगभग तुरंत रूप में भी मैं वह पंजे को पकड़ने में कर रहा हूँ (यानी मैं अभी तक अपने उंगली उठा लिया नहीं किया है कहा जाता हो जाता है)। इसके अलावा, मेरी तालिका दृश्य: targetIndexPathForMoveFromRowAtIndexPath: प्रस्तावित डिस्टिनेशन इंडेक्सपैथ: बिल्कुल भी शामिल नहीं होता है।

मैं क्या गलत कर रहा हूं पर कोई विचार? इस मुद्दे को ठीक करने के लिए मुझे क्या सुझाव देना चाहिए इस पर कोई सुझाव?

+0

संभावित डुप्लिकेट [रीडायर्ड होने पर UITableViewCell को अपनी वर्तमान स्थिति से खींच नहीं सकता] (http://stackoverflow.com/questions/9251735/cant-drag-uitableviewcell-from-its-current-position-when-reorder) – Daniel

उत्तर

22

मैं भी इस समस्या थी वापस आ जाएगी। जांचें कि क्या आपके पास UIGestureRecognizer है (मेरे लिए यह एक UIPanGestureRecognizer था) जो UITableView के पर्यवेक्षकों से जुड़ा हुआ है। मैंने इसे हटा दिया और पुनर्मूल्यांकन काम किया।

+0

हां, यह वास्तव में समस्या थी जैसा कि मैंने अंततः पता लगाया था। – Umair

1

विधि है tableView:moveRowAtIndexPath:toIndexPath: नियंत्रण को छू पर तुरंत बुलाया मिलता है। UITableViewDataSource Protocol Reference से: उपयोगकर्ता fromRow में पुन: व्यवस्थित करें नियंत्रण प्रेस जब

UITableView वस्तु डेटा स्रोत को यह संदेश भेजता है।

तो इस व्यवहार की उम्मीद है।

मेरा मानना ​​है कि समस्या अपने tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath: में है। क्या आपके पास इस विधि को शामिल करने का एक विशिष्ट कारण है? क्या आपने इसे छोड़ने और प्रस्तावित स्थिति के साथ जाने की कोशिश की है?

उदाहरण के लिए, ऐसा लगता है कि ([proposedDestinationIndexPath row] < [self.itemArray count]) हमेशा true ...

+0

यहां तक ​​कि तालिका से छुटकारा पाएं दृश्य: targetIndexPathForMoveFromRowAtIndexPath: toProposedIndexPath: विधि समस्या का समाधान नहीं करती है। इस विधि के पीछे का उद्देश्य यह है कि अंतिम पंक्ति ("नई जोड़ें" पंक्ति को स्थानांतरित नहीं किया जाना चाहिए, और इसके नीचे कोई अन्य पंक्तियां नहीं ले जा सकती हैं। – Umair

2

मैं हाल ही में एक ही समस्या थी और इस थ्रेड मुझे सही दिशा में इशारा किया, लेकिन बेहतर दृष्टिकोण इशारा पहचानकर्ता के प्रतिनिधि विधि gestureRecognizerShouldBegin उपयोग करने के लिए है: निर्धारित करने के लिए यदि आप एक स्थिति में हैं, जहां आप इसे या नहीं पर कार्रवाई करना चाहते हैं ।

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

28

मैं एक ही समस्या थी, और @wilsontgh & @Andy प्रतिक्रियाएं मुझे सही दिशा में ले लिया। हालांकि मैं पर्यवेक्षक से आवश्यक PanRecognizer को हटाने का जोखिम नहीं उठा सकता था, न ही इसे कुछ विचारों में अक्षम कर सकता था। मेरे लिए क्या काम किया गया था इसे मुख्य दृश्य पहचानकर्ता पर सेट करना था, जो अन्य विचारों/पहचानकर्ताओं को संभालने वाले स्पर्शों को रद्द करने से बचाता है।

panRecognizer.cancelsTouchesInView = NO; 
+1

यह * बहुत * कष्टप्रद स्थिति क्या है इसका एक अच्छा समाधान है। मैं व्यूडेक का उपयोग कर रहा था जो एक फेसबुक स्टाइल ओवरफ्लो/नेविगेशन मेनू का प्रबंधन करता है और इसलिए पैरेंट व्यू में पैन इशारा पहचानकर्ता टेबलव्यू के इशारे पहचानकर्ता के साथ कहर बरबाद कर रहा था। चीयर्स। – NSTJ

+3

व्यूडेक को ठीक करने के लिए मैं अपने 'IIViewDeckController' –

+0

विजेता विजेता चिकन डिनर में झूठी करने के लिए' पैनिंग कैंसल्स टच्स इनव्यू 'सेट करने में सक्षम था !! – xximjasonxx

0

मेरे मामले में, यह "स्वाइप पर छिपाने वाली नौसेना बार" सुविधा है जो पुन: आदेश विफल होने का कारण बनती है।इसलिए सुनिश्चित करें कि अगर आपको UITableView पुन: ऑर्डर सुविधा की आवश्यकता है तो इसे बंद कर दिया गया है।

navigationController?.hidesBarsOnSwipe = false

ध्यान दें कि नेविगेशन नियंत्रक एक ही नेविगेशन ढेर के सभी दृश्य नियंत्रकों के पार साझा है, इसलिए एक स्क्रीन धक्का/पॉप-इंग आपरेशन के बाद भी सभी अन्य लोगों को प्रभावित कर सकते हैं।

0

मेरे मामले में, समस्या keyboardDismissMode संपत्ति में था।

संबंधित मुद्दे