किसी अनुभाग के लिए UITableView पंक्ति को कैसे सीमित करें


121

मैं इस पर अपना सिर मार रहा था, और Google कुछ भी नहीं बदल रहा था। मैंने अंततः इसे काम किया और सोचा कि मैं इसे अगले व्यक्ति के लिए यहाँ लिखूंगा।

आपके पास UITableViewकई सेक्शन हैं। प्रत्येक खंड सजातीय है, लेकिन कुल मिलाकर तालिका विषम है। यदि आप एक अनुभाग के भीतर पंक्तियों के फिर से आदेश है, लेकिन नहीं की अनुमति देना चाहेंगे तो भर वर्गों। हो सकता है कि आप भी यही चाहते हों कि एक खंड फिर से चलाया जा सके (यही मेरा मामला था)। यदि आप देख रहे हैं, जैसा कि मैं था, तो UITableViewDataSourceDelegateआपको तब सूचना नहीं मिलेगी जब यह आपको अनुभागों के बीच एक पंक्ति को स्थानांतरित करने के बारे में हो। आपको एक मिलता है जब यह एक पंक्ति (जो ठीक है) हिलना शुरू कर देता है और एक जब यह पहले से ही स्थानांतरित हो जाता है और आपको अपने आंतरिक सामान के साथ सिंक करने का मौका मिलता है। अनुपयोगी।

तो आप वर्गों के बीच पुन: आदेशों को कैसे रोक सकते हैं?

मैं एक अलग उत्तर के रूप में जो मैंने किया था, उसे पोस्ट करूँगा और इसे किसी और के लिए खुला छोड़ दूंगा ताकि बेहतर उत्तर मिल सके!


1
जब आप कहते हैं कि "आप एक पंक्ति शुरू करते समय एक प्राप्त करते हैं" तो आप किस अधिसूचना का उल्लेख कर रहे हैं? मैं एक नहीं देख रहा हूं, लेकिन सेल-रीऑर्डरिंग शुरू होने पर विचार करने की उम्मीद कर रहा हूं।
टॉमस्विफ्ट

जवाबों:


181

यह कार्यान्वयन फिल के उत्तर की तरह मूल अनुभाग के बाहर फिर से आदेश देने से रोकेगा, लेकिन यह अनुभाग की पहली या अंतिम पंक्ति के रिकॉर्ड को भी स्नैप करेगा, जहां यह शुरू होने के बजाय, जहां पर चला गया था, उसके आधार पर।

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
  if (sourceIndexPath.section != proposedDestinationIndexPath.section) {
    NSInteger row = 0;
    if (sourceIndexPath.section < proposedDestinationIndexPath.section) {
      row = [tableView numberOfRowsInSection:sourceIndexPath.section] - 1;
    }
    return [NSIndexPath indexPathForRow:row inSection:sourceIndexPath.section];     
  }

  return proposedDestinationIndexPath;
}

क्या अनुमत अनुभाग के बाहर तालिका को ऑटो-स्क्रॉलिंग (सेल को खींचते समय) से रोकने का कोई तरीका है?
पालिमोंडो

1
Xamarin में, आवरण विधि UIKit.UITableViewController.CustomizeMoveTargetकिसी को भी आश्चर्यचकित करने के लिए है।
बंकरदार

74

वास्तव में काफी सरल है।

UITableViewDelegate की विधि है:


tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:

यह तब हो जाता है जब उपयोगकर्ता संभावित ड्रॉप पॉइंट पर मँडरा रहा है। आपको कहने का मौका मिलता है, "नहीं! इसे वहां मत छोड़ो! इसे यहाँ पर छोड़ दो"। आप प्रस्तावित एक को एक अलग सूचकांक पथ वापस कर सकते हैं।

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


- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
    if( sourceIndexPath.section != proposedDestinationIndexPath.section )
    {
        return sourceIndexPath;
    }
    else
    {
        return proposedDestinationIndexPath;
    }
}

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

मैं दूसरे खंड में पंक्ति को खींच सकता हूं यहां तक ​​कि पंक्ति वहां सेट नहीं हो रही है। लेकिन यह तब दिखाई देता है जब अन्य बलपूर्वक। किसी भी विचार
सैंडी

27

आप आलसी लोगों के लिए जेसन के जवाब का स्विफ्ट स्विफ्ट संस्करण:

स्विफ्ट 3, 4 और 5

override func tableView(_ tableView: UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath {
    if sourceIndexPath.section != proposedDestinationIndexPath.section {
        var row = 0
        if sourceIndexPath.section < proposedDestinationIndexPath.section {
            row = self.tableView(tableView, numberOfRowsInSection: sourceIndexPath.section) - 1
        }
        return IndexPath(row: row, section: sourceIndexPath.section)
    }
    return proposedDestinationIndexPath
}

स्विफ्ट 1 & 2

override func tableView(tableView: UITableView, targetIndexPathForMoveFromRowAtIndexPath sourceIndexPath: NSIndexPath, toProposedIndexPath proposedDestinationIndexPath: NSIndexPath) -> NSIndexPath {
    if sourceIndexPath.section != proposedDestinationIndexPath.section {
        var row = 0
        if sourceIndexPath.section < proposedDestinationIndexPath.section {
            row = self.tableView(tableView, numberOfRowsInSection: sourceIndexPath.section) - 1
        }
        return NSIndexPath(forRow: row, inSection: sourceIndexPath.section)
    }
    return proposedDestinationIndexPath
}

7

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

यहाँ उदाहरण है:

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath {

    // Do not allow any movement between section
    if ( sourceIndexPath.section != proposedDestinationIndexPath.section) {
        return sourceIndexPath;
    }
    // You can even control the movement of specific row within a section. e.g last row in a     Section

    // Check if we have selected the last row in section
    if (sourceIndexPath.row < sourceIndexPath.length) {
        return proposedDestinationIndexPath;
    } 
    else {
        return sourceIndexPath;
    }
}

7

स्विफ्ट 3:

override func tableView(_ tableView: UITableView, targetIndexPathForMoveFromRowAt sourceIndexPath: IndexPath, toProposedIndexPath proposedDestinationIndexPath: IndexPath) -> IndexPath {
    if sourceIndexPath.section != proposedDestinationIndexPath.section {
        var row = 0
        if sourceIndexPath.section < proposedDestinationIndexPath.section {
            row = self.tableView(tableView, numberOfRowsInSection: sourceIndexPath.section) - 1
        }
        return IndexPath(row: row, section: sourceIndexPath.section)
    }
    return proposedDestinationIndexPath
}

3

@ जैसन हारविग की तुलना में, नीचे दिया गया कोड सही ढंग से काम करता है।

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
    {
      if (sourceIndexPath.section != proposedDestinationIndexPath.section) {
        NSInteger row = 0;
        if (sourceIndexPath.section < proposedDestinationIndexPath.section) {
          row = [tableView numberOfRowsInSection:sourceIndexPath.section] - 1;
        }
        return [NSIndexPath indexPathForRow:row inSection:sourceIndexPath.section];     
      }

      return proposedDestinationIndexPath;
    }

1

Swift3 वर्गों के बीच स्थिति नहीं बदलने के लिए

override func collectionView(_ collectionView: UICollectionView, targetIndexPathForMoveFromItemAt originalIndexPath: IndexPath, toProposedIndexPath proposedIndexPath: IndexPath) -> IndexPath {
    if originalIndexPath.section != proposedIndexPath.section
    {
        return originalIndexPath
    }
    else
    {
        return proposedIndexPath
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.