কীভাবে কোনও বিভাগে ইউআইটিএবলভিউ সারিটি পুনঃক্রম করতে সীমাবদ্ধ করবেন


121

আমি এটির উপরে আমার মাথাটি আঘাত করছিলাম এবং গুগল কিছুই দেখছিল না। অবশেষে আমি এটিকে কাজে লাগিয়েছি এবং ভেবেছিলাম পরবর্তী ব্যক্তির জন্য এটি এখানে লিখতে চাই।

আপনার 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;
}

অনুমোদিত বিভাগের বাইরে টেবিলটিকে স্বয়ংক্রিয়-স্ক্রোলিং (কোনও সেল টেনে আনার সময়) থেকে রোধ করার কোনও উপায় আছে কি?
Palimondo

1
জামারিনে, মোড়কের পদ্ধতিটি UIKit.UITableViewController.CustomizeMoveTargetযে কেউ ভাবছেন anyone
বাংকারডাইভ

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! এটি ভুল বলছেন না, কেবল আমি ভাবছি যে এটি আসলে এর চেয়ে আরও জটিল complicated
বিলি গ্রে

আমি সারিটি অন্য বিভাগে টেনে আনতে পারি এমনকি সেই সারিটি সেট করা হচ্ছে না। কিন্তু এটি অন্যের কাছে যখন জোরালোভাবে প্রদর্শিত হয় তখন তা দৃশ্যমান। কোনও ধারণা
স্যান্ডি

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

সুইফট 3 বিভাগের মধ্যে অবস্থান পরিবর্তন না করার জন্য

override func collectionView(_ collectionView: UICollectionView, targetIndexPathForMoveFromItemAt originalIndexPath: IndexPath, toProposedIndexPath proposedIndexPath: IndexPath) -> IndexPath {
    if originalIndexPath.section != proposedIndexPath.section
    {
        return originalIndexPath
    }
    else
    {
        return proposedIndexPath
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.