ইউআইকোলিকেশনভিউ অ্যানিমেটেড ডেটা পরিবর্তন দেখুন


83

আমার প্রকল্পে আমি আইকনগুলির একটি গ্রিড প্রদর্শন করতে ইউআইকোলিকেশনভিউ ব্যবহার করি।

ব্যবহারকারী পৃথক এনএসএসর্টডেস্কিটারের সাহায্যে মূল ডেটা থেকে আনা কলকে সেগমেন্টেড কন্ট্রোল ক্লিক করে ক্রম পরিবর্তন করতে সক্ষম হয়।

কেবলমাত্র বিভিন্ন বিভাগ / সারিগুলিতে সমাপ্তির সাথে ডেটার পরিমাণ সর্বদা একই থাকে:

- (IBAction)sortSegmentedControlChanged:(id)sender {

   _fetchedResultsController = nil;
   _fetchedResultsController = [self newFetchResultsControllerForSort];

   NSError *error;
   if (![self.fetchedResultsController performFetch:&error]) {
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
   }

   [self.collectionView reloadData];
}

সমস্যাটি হ'ল রিলোডলোড ডেটা পরিবর্তনটি প্রাণবন্ত করে না, ইউআইকোলিকেশনভিউ নতুন ডেটার সাথে সবেমাত্র পপ করে।

পরিবর্তনের আগে এবং পরে কোন ঘরটি সূচীপথের মধ্যে ছিল তা আমি ট্র্যাক করে রেখেছি এবং পরিবর্তনের জন্য অ্যানিমেশনটি সম্পাদন করতে [সেলফ্ল্যাঙ্কলোপেশনভিউ মুভ আইটেমটাইটেক্সটপথ: টু ইন্ডেক্সপথ:] ব্যবহার করব বা আরও ভাল পদ্ধতি আছে?

সাবক্লাসিং কালেকশন ভিউগুলিতে আমি তেমন কিছু পাইনি যেহেতু কোনও সহায়তা দুর্দান্ত হবে ...

ধন্যবাদ, বিল


আপনি কি reloadDataঅ্যানিমেশন ব্লকে সেই কলটি মোড়ানোর চেষ্টা করেছেন ?
সাইমন

উত্তর:


72

রিলোডলোড ডেটা প্রাণবন্ত হয় না, বা কোনও ইউআইভিউ অ্যানিমেশন ব্লকে রাখার সময় এটি নির্ভরযোগ্যভাবে তা করে না। এটি কোনও ইউআইসি কলিকিটনভিউ পারফরম্যান্স ব্যাচআপডেটস ব্লকে থাকতে চায়, সুতরাং এর মতো আরও কিছু চেষ্টা করুন:

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
} completion:^(BOOL finished) {
    // do something on completion 
}];

4
হ্যাঁ, এটি কাজ করছে বলে মনে হচ্ছে, তবে কেবলমাত্র আপনি যদি বিভাগের নম্বরগুলি সংরক্ষণ করেন ... অন্যথায় আমি "অবৈধ সংখ্যক বিভাগগুলি গ্রহণ করছি the আপডেটের পরে সংগ্রহ ভিউতে থাকা বিভাগগুলির সংখ্যা (10) অবশ্যই সংখ্যার সমান হতে হবে আপডেটের আগে সংগ্রহ ভিউতে থাকা বিভাগগুলি (16) "। আমাকে ম্যানুয়ালি inোকাতে / বিভাগগুলি মুছতে হবে ... যাইহোক গৃহীত! ধন্যবাদ
নিমরোড 7

4
"ম্যানুয়ালি" দ্বারা, আপনি কি ইউআইকিলেকশনভিউয়ের ইনসার্টসেকশনস / মুভসেকশন: টোশন / ডিলেটসেকশন কলগুলির মাধ্যমে বলতে চান? অথবা অন্য কিছু? (দুঃখিত, এখনও অবধি আমার ইউআইকোলিকেশনভিউয়ের ব্যবহারের অবিচ্ছিন্ন বিভাগ রয়েছে)
স্ট্রাইপস

4
হ্যাঁ এই পদ্ধতিগুলির মাধ্যমে ... চিন্তাভাবনা বাস্তবায়নের জন্য এটি কিছুটা জটিল, আপনাকে আপডেটের আগে এবং পরে সূচিপথগুলি মনে রাখতে হবে, যা সন্নিবেশ করা হয়েছে বা সরানো হয়েছে সেই চিত্রটি ...
নিমরোড

12
এটি আমার এক-বিভাগের সংগ্রহ দর্শনের জন্য কাজ করে না। আমি ত্রুটিগুলি পাই নি, তবে এটিও প্রাণবন্ত হয়নি। বিকল্প -reloadSections:এটি কাজ করে তোলে।
পৌলমনিকো

9
এই উত্তরটি সঠিক নয়, কারণ আমার মামলাটি পুনরায়লোডডেটাকে পারফরম্যান্স ব্যাচআপটেজে রাখলে আমার অ্যাপ্লিকেশনটি ক্র্যাশ হয়ে যাবে এবং বলছে যে সেল গণনা আগে এবং পরে এক নয়। রিলোডসেকশনগুলি ব্যবহার করে আমার সমস্যা সমাধান হয়েছে। অ্যাপলের নথিতে এনিমেশন ব্লকে পুনরায়লোড ডেটা কল না করার ইঙ্গিতও দেওয়া হয়েছে
উইংজারো

145

মোড়ানো -reloadDataমধ্যে -performBatchUpdates:অ্যানিমেট করতে একটি এক অধ্যায় সংগ্রহ দেখুন কারণ মনে হচ্ছে না।

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadData];
} completion:nil];

তবে এই কোডটি কাজ করে:

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
} completion:nil];

9
ডকুমেন্টেশন থেকে নোট: আইটেম sertedোকানো বা মুছে ফেলা হচ্ছে যেখানে অ্যানিমেশন ব্লকগুলির মাঝখানে আপনাকে পুনরায় লোড ডেটা পদ্ধতিতে কল করা উচিত নয়। সন্নিবেশ এবং মুছে ফেলা স্বয়ংক্রিয়ভাবে টেবিলের ডেটা যথাযথভাবে আপডেট হতে পারে।
রাফেল অলিভিয়র

আমি মনে করি এটি সঠিক উত্তর হওয়া উচিত। কারণ এটি আমার পক্ষে কাজ করেছিল। আমার কেবল ১ টি বিভাগ আছে এবং এটি সঠিক উত্তরটির সাথে কাজ করছে না।
মহেশ অগ্রবাল

আপনি যদি সন্নিবেশ করান তবে কাজ করে না। বাছাই অ্যানিমেশন ওভাররাইড করবে।
আন্দ্রেস ক্যানেলা

4
অ্যানিমেশনটি পেতে আপনার self.collectionView performBatchUpdatesচারপাশে কলটি জড়ানো দরকার নেই তা লক্ষণীয় reloadSections। প্রকৃতপক্ষে performBatchUpdatesকলটি কিছু ক্ষেত্রে অযত্নে ঝলকানো / সেল-পুনরায় আকার দেওয়ার সমস্যার কারণ হতে পারে।
পল পপিয়েল

4
অথবা কেবল [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; reloadSectionsসংগ্রহ ভিউতে বা টেবিল ভিউ এ্যানিমেশন সহ এটি করবে।
বউয়ার মিউজিক

67

সমস্ত বিভাগের পুনরায় লোড অ্যানিমেট করতে আমি এটিই করেছি:

[self.collectionView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.collectionView.numberOfSections)]];

সুইফট 3

let range = Range(uncheckedBounds: (0, collectionView.numberOfSections))
let indexSet = IndexSet(integersIn: range)
collectionView.reloadSections(indexSet)

8

সুইফ্ট ব্যবহারকারীদের জন্য, যদি আপনার সংগ্রহেভিউতে কেবল একটি বিভাগ থাকে:

self.collectionView.performBatchUpdates({
                    let indexSet = IndexSet(integersIn: 0...0)
                    self.collectionView.reloadSections(indexSet)
                }, completion: nil)

যেমনটি https://stackoverflow.com/a/42001389/4455570 এ দেখা হয়েছে


3

কোনও performBatchUpdates:completion:ব্লকের ভিতরে পুরো সংগ্রহের দৃশ্যটি পুনরায় লোড করা আইওএস 9 সিমুলেটারে আমার জন্য একটি চটকদার অ্যানিমেশন করে। আপনার যদি সুনির্দিষ্ট থাকে UICollectionViewCellআপনি মুছতে চান বা আপনার যদি এটির সূচক পথ থাকে তবে আপনি deleteItemsAtIndexPaths:সেই ব্লকে কল করতে পারেন । ব্যবহার করে deleteItemsAtIndexPaths:, এটি একটি মসৃণ এবং দুর্দান্ত অ্যানিমেশন করে।

UICollectionViewCell* cellToDelete = /* ... */;
NSIndexPath* indexPathToDelete = /* ... */;

[self.collectionView performBatchUpdates:^{
    [self.collectionView deleteItemsAtIndexPaths:@[[self.collectionView indexPathForCell:cell]]];
    // or...
    [self.collectionView deleteItemsAtIndexPaths:@[indexPath]];
} completion:nil];

4
আমার ক্ষেত্রে ক্র্যাশের সমস্যার সমাধান করা এমন একটি বিষয় কেবল উল্লেখ করতে চাই, সংগ্রহের দৃশ্যে পারফরম্যান্সকে আপডেট করার আগে ডেটাসোর্স (যেমন বিভাগ / আইটেম গণনা) আপডেট করুন।
ভেরুম্যাক্স

অ্যানিমেশনটি অন্যান্য অপারেশন থেকে; আছে, এবং পুনরায়লোডের জন্য কোনও অ্যানিমেশনের আওতায় ছিল না। insertItems আরোহী ক্রমে সন্নিবেশ করানো হয়, এবং আপডেটের পরে সম্পাদিত হয়; মুছে ফেলা আইটেমগুলি বিপরীত।
জেমস বুশ

1

সহায়তার পাঠ্য বলে:

সংগ্রহের দৃশ্যে সমস্ত আইটেম পুনরায় লোড করার জন্য এই পদ্ধতিটি কল করুন। এটি সংগ্রহের দৃশ্যের কারণে বর্তমানে দৃশ্যমান কোনও আইটেম বাতিল করে এগুলিকে পুনরায় প্রদর্শন করতে বাধ্য করে। দক্ষতার জন্য, সংগ্রহের দৃশ্যটি কেবলমাত্র সেগুলি এবং দৃশ্যমান পরিপূরক দর্শনগুলি প্রদর্শন করে। যদি পুনরায় লোডের ফলাফল হিসাবে সংগ্রহের ডেটা সঙ্কুচিত হয় তবে সংগ্রহের ভিউ তার স্ক্রোলিং অফসেটগুলি সেই অনুযায়ী সামঞ্জস্য করে। অ্যানিমেশন ব্লকের মাঝখানে আপনি এই পদ্ধতিটি কল করবেন না যেখানে আইটেমগুলি সন্নিবেশ করা হচ্ছে বা মোছা হচ্ছে। সন্নিবেশ এবং মুছে ফেলা স্বয়ংক্রিয়ভাবে টেবিলের ডেটা যথাযথভাবে আপডেট হতে পারে।

আমি মনে করি মূল অংশটি "বর্তমানে দৃশ্যমান আইটেমগুলি বাতিল করার জন্য সংগ্রহের ভিউর কারণ"। কীভাবে এটি ফেলে দেওয়া আইটেমগুলির চলাচল সঞ্চারিত করতে চলেছে?


হুবহু, এটা না। রিলোডডাটা হ'ল অ্যানিমেশন-কম, ডুয়াল অপারেশন; এটি প্রথমে একটি মুছুন অপারেশন এবং তারপরে একটি সন্নিবেশ অপারেশন।
জেমস বুশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.