ইউআইটিএবলভিউয়ের লোডিংয়ের শেষ কীভাবে সনাক্ত করা যায়


141

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

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

কেবলমাত্র দৃশ্যমান কক্ষগুলি লোড হওয়ার কারণে আমি ডেটা উত্সগুলির গণনাটি ব্যবহার করতে পারি না।


ডেটাসোর্স গণনা এবং 'ইন্ডেক্সপ্যাথসফরভিজিবলরো'-এর সংমিশ্রণটি চেষ্টা করুন
স্বপ্নিল লুকটুক

1
পতাকাটিতে আরও তথ্যের ভিত্তিতে পুনরায় খোলার: "এটি সদৃশ নয় visible এটি দৃশ্যমান কক্ষগুলি লোড করার বিষয়ে জিজ্ঞাসা করে, ডেটা জিজ্ঞাসা শেষ করার বিষয়ে নয় accepted গৃহীত উত্তরের জন্য আপডেট দেখুন"
কেভ

এই সমাধানটি আমার পক্ষে ভাল কাজ করে। আপনি এটা চেক stackoverflow.com/questions/1483581/...
খালেদ Annajar

উত্তর:


224

@ রিচএক্স উত্তরে উন্নতি করুন: lastRowউভয় [tableView numberOfRowsInSection: 0] - 1বা হতে পারে ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row। সুতরাং কোডটি হবে:

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([indexPath row] == ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row){
        //end of loading
        //for example [activityIndicator stopAnimating];
    }
}

আপডেট: ঠিক আছে, @ এইচটিফোয়েয়ার মন্তব্য ঠিক আছে। আপনি যদি এই কোডটি উত্স থেকে সমস্ত ডেটা লোড করার শেষ সনাক্ত করতে চান তবে এটি হবে না, তবে এটি আসল প্রশ্ন নয়। এই কোডটি সনাক্ত করার জন্য যখন দৃশ্যমান হ'ল বোঝার উদ্দেশ্যেযুক্ত সমস্ত ঘর প্রদর্শিত হয়। willDisplayCell:মসৃণ ইউআইয়ের জন্য এখানে ব্যবহৃত (একক সেল সাধারণত willDisplay:কলের পরে দ্রুত প্রদর্শিত হয় )। আপনি এটি দিয়ে চেষ্টা করতে পারে tableView:didEndDisplayingCell:


সমস্ত কক্ষ দৃশ্যমান যে লোড হয় তা জানার জন্য আরও অনেক ভাল।
এরিক

14
তবে যখনই আরও বেশি কক্ষ দেখার জন্য ব্যবহারকারী স্ক্রোল করবে তখনই এটি ডাকা হবে।
htafoya

এটির সাথে সমস্যাটি হ'ল এটি ফুটার ভিউয়ের জন্য অ্যাকাউন্ট করে না। বেশিরভাগের জন্য সমস্যা হতে পারে না তবে এটি যদি হয় তবে আপনি একই ধারণাটি প্রয়োগ করতে পারেন তবে viewForFooterInSectionপদ্ধতিতে।
কাইল Clegg

1
@ কাইলকিলেগ প্যাট্রিক.শেনেক আপনার উত্তরের মন্তব্যে একটি কারণ উল্লেখ করেছেন। এছাড়াও, যদি ঘরটির লোডিংয়ের শেষে ফুটার দৃশ্যমান না হয় তবে কী হবে?
কলস

27
টেবিলভিউ: didEndDisplayingCelll: ভিউ থেকে কোনও সেল অপসারণ করার সময় আসলে বলা হয়, যখন ভিউতে এর রেন্ডারিং সম্পূর্ণ হয় না যাতে এটি কাজ করে না। কোনও ভাল পদ্ধতির নাম নয়। দস্তাবেজগুলি পড়তে হবে।
অ্যান্ড্রু রাফেল

34

সুইফট 3 এবং 4 এবং 5 সংস্করণ:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if let lastVisibleIndexPath = tableView.indexPathsForVisibleRows?.last {
        if indexPath == lastVisibleIndexPath {
            // do here...
        }
    }
}

1
যখন আমরা প্রথমবার ডেটা লোড করি তখন এই পদ্ধতিটি বলা হয়। আমার ক্ষেত্রে কেবলমাত্র 4 টি দৃশ্যমান ঘর রয়েছে। আমি 8 টি সারি লোড করেছি তবে এখনও এই ফাংশনটি কল হচ্ছে was আমি যা চাই তা হল ব্যবহারকারী যখন শেষ সারিতে নেমে যায় তখন আরও ডেটা লোড করা যায়
মুহাম্মদ নায়ব

হাই মুহাম্মদ নায়ব, সম্ভবত আপনি "যদি সূচীপথ == সর্বশেষে উইন্ডোজপথ" প্রতিস্থাপন করতে পারেন "যদি সূচীপথ.রো == আপনারডাটা সোর্সকাউন্ট"
ড্যানিয়েল

1
@ ড্যানিয়েলেগেলিয়া এই বিষয়টি উল্লেখ করার জন্য ধন্যবাদ। যদি সূচিপথ == সর্বশেষে উইজিবলআইনডেক্সপথ অ্যান্ড অ্যান্ডেক্সপ্যাথ.রো == আপনার ডেটা সোর্স কোড - 1 এটি আমার পক্ষে কাজ করে। চিয়ার্স !!!
যোগেশ প্যাটেল

28

আমি সবসময় এই খুব সহজ সমাধান ব্যবহার:

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([indexPath row] == lastRow){
        //end of loading
        //for example [activityIndicator stopAnimating];
    }
}

কিভাবে শেষ সারি সনাক্ত? আমার জন্য সমস্যাটি .. আপনি কীভাবে শর্তে যদি সেই শেষটিকে পেতে পারেন তা আপনি ব্যাখ্যা করতে পারেন।
সামিরা চথুরঙ্গ

6
শেষ সারি হয় [tableView numberOfRowsInSection: 0] - 1। আপনাকে অবশ্যই 0প্রয়োজনীয় মান দ্বারা প্রতিস্থাপন করতে হবে । তবে সমস্যা নেই। সমস্যা হ'ল ইউআইটিএবলভিউ লোডগুলি কেবল দৃশ্যমান। তবে ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).rowসমস্যা সমাধান করে।
folx

1
যদি আমরা নিখুঁত সমাপ্তির সন্ধান করি তবে এটি ব্যবহার করা ভাল না - (শূন্য) টেবিল ভিউ: (ইউআইটিবেল ভিউ *) টেবিল ভিউডইন্ডডিসপ্লেইনিং সেল: (ইউআইটিএবলভিউসেল *) সেল অফআউট ইন্ডেক্সপথ: (এনএসআইন্ডেক্সপথ *) ইনডেক্সপথ?
মরকুট

10

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

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section 
{
  // Perform some final layout updates
  if (section == ([tableView numberOfSections] - 1)) {
    [self tableViewWillFinishLoading:tableView];
  }

  // Return nil, or whatever view you were going to return for the footer
  return nil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
  // Return 0, or the height for your footer view
  return 0.0;
}

- (void)tableViewWillFinishLoading:(UITableView *)tableView
{
  NSLog(@"finished loading");
}

আপনি যদি সম্পূর্ণরূপে শেষের জন্য লোডিংয়ের সন্ধান করেন UITableViewএবং কেবল দৃশ্যমান কক্ষগুলি নয় তবে এই পদ্ধতিরটি সর্বোত্তম কাজ করে find আপনার প্রয়োজনের উপর নির্ভর করে আপনি কেবল দৃশ্যমান ঘরগুলিই চাইতে পারেন, সেক্ষেত্রে ফোলিক্সের উত্তরটি একটি ভাল রুট।


অটো লেআউটটি ব্যবহার করে আইওএস 7-এ আমার লেআউটটি nilনিয়ে tableView:viewForFooterInSection:গোলমেলে থেকে ফিরে ।
ma11hew28

মজাদার. আপনি যদি উচ্চতা এবং প্রস্থ 0 এর সাথে কোনও ফ্রেমে সেট করেন তবে? return CGRectMake(0,0,0,0);
কাইল Clegg

আমি এটি চেষ্টা করেছিলাম এবং সেটও করেছি self.tableView.sectionFooterHeight = 0। যেভাবেই হোক, এটি প্রায় 10 এর উচ্চতা সহ একটি বিভাগের পাদচরণ দৃশ্য সন্নিবেশ করানো বলে মনে হচ্ছে আমি ফিরে আসার দৃশ্যে 0-উচ্চতার সীমাবদ্ধতা যুক্ত করে আমি এটি ঠিক করতে পারি I যাইহোক, আমি ভাল কারণ আমি প্রকৃতপক্ষে শেষ কক্ষে ইউআইটিএবলভিউটি কীভাবে শুরু করব তা নির্ধারণ করতে চেয়েছিলাম তবে এটি প্রথম দেখলাম।
ma11hew28

1
@ ম্যাটডিপিপাস্কোলে যদি আপনি ভিউফুটারআইনসেকশনটি বাস্তবায়ন করেন তবে আপনাকে উচ্চতাফুফুটারআইনসেকশনও প্রয়োগ করতে হবে। শূন্য ফুটার সহ বিভাগগুলির জন্য এটি 0 ফিরতে হবে। এটি এখন অবধি অফিসিয়াল ডক্সেও রয়েছে।
patric.schenke

যদি আপনি উচ্চতাটি ফোটারআইনসেকশন 0 তে সেট করেন তবে ভিউফুটারআইনসেকশন কল হবে না
ওদেড

10

সুইফট 2 সমাধান:

// willDisplay function
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    let lastRowIndex = tableView.numberOfRowsInSection(0)
    if indexPath.row == lastRowIndex - 1 {
        fetchNewDataFromServer()
    }
}

// data fetcher function
func fetchNewDataFromServer() {
    if(!loading && !allDataFetched) {
        // call beginUpdates before multiple rows insert operation
        tableView.beginUpdates()
        // for loop
        // insertRowsAtIndexPaths
        tableView.endUpdates()
    }
}

9

ব্যক্তিগত এপিআই ব্যবহার করে:

@objc func tableViewDidFinishReload(_ tableView: UITableView) {
    print(#function)
    cellsAreLoaded = true
}

সর্বজনীন এপিআই ব্যবহার করে:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // cancel the perform request if there is another section
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(tableViewDidLoadRows:) object:tableView];

    // create a perform request to call the didLoadRows method on the next event loop.
    [self performSelector:@selector(tableViewDidLoadRows:) withObject:tableView afterDelay:0];

    return [self.myDataSource numberOfRowsInSection:section];
}

// called after the rows in the last section is loaded
-(void)tableViewDidLoadRows:(UITableView*)tableView{
    self.cellsAreLoaded = YES;
}

একটি সম্ভাব্য আরও ভাল নকশা হ'ল দৃশ্যতে কোষগুলিকে একটি সেটে যুক্ত করা, তারপরে আপনাকে যখন টেবিলটি লোড করা হয়েছে কিনা তা পরীক্ষা করতে হবে তবে পরিবর্তে আপনি এই সেটটির চারপাশে লুপের জন্য একটি করতে পারেন, উদাহরণস্বরূপ

var visibleCells = Set<UITableViewCell>()

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    visibleCells.insert(cell)
}

override func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    visibleCells.remove(cell)
}

// example property you want to show on a cell that you only want to update the cell after the table is loaded. cellForRow also calls configure too for the initial state.
var count = 5 {
    didSet {
        for cell in visibleCells {
            configureCell(cell)
        }
    }
}

অন্যদের তুলনায় অনেক ভাল সমাধান। এটির জন্য কোনও টেবিলভিউ পুনরায় লোডের প্রয়োজন নেই। এটি খুব সহজ এবং ভিউডিডল্লাউড: শেষ সেলটি লোড হওয়ার পরে প্রতিবার কল করা হবে না।
ম্যাট হাডসন

এটি এখন অবধি সেরা সমাধান, যেহেতু অন্যান্য সমাধানগুলি একাধিক বিভাগকে বিবেচনায় নেয় না
জাস্টিসপেনি

স্পর্শকাতর মন্তব্যের জন্য আমি দুঃখিত, তবে ঠিক এই 'ম্যাজিক' কেমন? ডেলিগেটের কাছ থেকে অন্য পদ্ধতিতে কল করা। আমি পাই না।
লুকাশ পেটর

@ লুকাসপেটর বাতিল এবং তারপরে ডিলির পরে দেখুন। এগুলি মেথাল কলটি সম্পূর্ণরূপে লোড করা শেষ হওয়ার পরে শেষ ব্যতীত প্রতিটি বিভাগের জন্য বাতিল করতে সক্ষম করে call
ম্যালহাল

ওহ, ঠিক আছে আমি প্রথম নজরে যা ভাবিছিলাম তার চেয়ে একটু বেশি চালাক।
লুকাশ পেট্রার

8

সুইফট 3-তে নির্বাচিত উত্তর সংস্করণের জন্য:

var isLoadingTableView = true

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if tableData.count > 0 && isLoadingTableView {
        if let indexPathsForVisibleRows = tableView.indexPathsForVisibleRows, let lastIndexPath = indexPathsForVisibleRows.last, lastIndexPath.row == indexPath.row {
            isLoadingTableView = false
            //do something after table is done loading
        }
    }
}

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


6

আমি জানি যে সেরা পদ্ধতির বিষয়টি এরিকের উত্তর এখানে : ইউআইটিএবলভিউ ডেটা জিজ্ঞাসা শেষ করার পরে বিজ্ঞপ্তি পান?

আপডেট: এটি কাজ করতে আমাকে এই কলগুলি প্রবেশ করতে হবে -tableView:cellForRowAtIndexPath:

[tableView beginUpdates];
[tableView endUpdates];

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

3

যখন কোনও সারণী দর্শন তার সামগ্রীটি লোড করা শেষ করে, তখন আমাদের প্রথমে ভিউগুলি কীভাবে স্ক্রিনে রাখা হয় তার একটি প্রাথমিক ধারণা থাকা দরকার।

একটি অ্যাপ্লিকেশনটির জীবন চক্রের মধ্যে 4 টি মূল মুহুর্ত রয়েছে:

  1. অ্যাপ্লিকেশনটি একটি ইভেন্ট পায় (টাচ, টাইমার, ব্লক প্রেরণ ইত্যাদি)
  2. অ্যাপ্লিকেশনটি ইভেন্টটি পরিচালনা করে (এটি একটি সীমাবদ্ধতা পরিবর্তন করে, একটি অ্যানিমেশন শুরু করে, পটভূমি পরিবর্তন করে)
  3. অ্যাপ্লিকেশনটি নতুন দর্শনক্রমক্রমকে গণনা করে
  4. অ্যাপ্লিকেশনটি ভিউ হায়ারার্কি সরবরাহ করে এবং এটি প্রদর্শন করে

2 এবং 3 বার সম্পূর্ণ পৃথক করা হয়। কেন? পারফরম্যান্সের কারণে, প্রতিবার কোনও সংশোধন করার পরে আমরা 3 মুহুর্তের সমস্ত গণনা সম্পাদন করতে চাই না।

সুতরাং, আমি মনে করি আপনি এইরকম একটি মামলার মুখোমুখি হয়েছেন:

tableView.reloadData()
tableView.visibleCells.count // wrong count oO

এখানে কি সমস্যা?

যে কোনও দৃশ্যের মতো, একটি টেবিল ভিউ তার সামগ্রীটি অলসভাবে পুনরায় লোড করে। আসলে, আপনি কল যদিreloadData একাধিকবার এটি কার্য সম্পাদনের সমস্যা তৈরি করবে না। সারণী দর্শনটি তার প্রতিনিধি বাস্তবায়নের ভিত্তিতে কেবলমাত্র তার সামগ্রীর আকারের সংশোধন করে এবং এর ঘরগুলি লোড করার জন্য 3 মুহুর্তের জন্য অপেক্ষা করে। এই সময়টিকে একটি লেআউট পাস বলা হয়।

ঠিক আছে, কীভাবে লেআউট পাসে উঠবেন?

লেআউট পাসের সময়, অ্যাপ্লিকেশনটি ভিউ হায়ারার্কির সমস্ত ফ্রেম গণনা করে। জড়িত হওয়ার জন্য, আপনি উত্সর্গীকৃত পদ্ধতিগুলি ওভাররাইড করতে পারেন layoutSubviews,updateLayoutConstraints ইত্যাদি একটিUIView এবং একটি দৃশ্য নিয়ামক উপশ্রেণী মধ্যে সমতুল্য পদ্ধতি।

এটি একটি টেবিল ভিউ ঠিক তাই করে। এটি ওভাররাইড করে layoutSubviewsএবং আপনার প্রতিনিধি প্রয়োগের উপর ভিত্তি করে ঘরগুলি যুক্ত করে বা সরায়। এটি ঠিক পরে cellForRowনতুন কক্ষ যুক্ত করার আগে রেখে দেয় willDisplay। যদি ফোন করেনreloadData শ্রেণিবদ্ধের সাথে টেবিল ভিউ কল করেন বা স্রেফ যোগ করেছেন, সারণী দর্শনটি এই মূল মুহুর্তে এর ফ্রেমটি পূরণ করার জন্য প্রয়োজনীয় যতগুলি সেল যুক্ত করে।

ঠিক আছে, তবে এখন, কীভাবে জানবেন যে কোনও টেবিল দর্শন যখন এর সামগ্রীটি পুনরায় লোড করা শেষ করে?

আমরা এখন এই প্রশ্নটির পুনঃব্যবস্থা করতে পারি: কখন কীভাবে জানবেন যে কোনও টেবিলের ভিউটি তার সংক্ষিপ্তসারগুলি শেষ করে দিয়েছে?

সবচেয়ে সহজ উপায় হ'ল টেবিল ভিউয়ের বিন্যাসে প্রবেশ করা:

class MyTableView: UITableView {
    func layoutSubviews() {
        super.layoutSubviews()
        // the displayed cells are loaded
    }
}

নোট করুন যে এই পদ্ধতিটি টেবিল দৃশ্যের জীবনচক্রটিতে বহুবার বলা হয়। টেবিল দৃশ্যের স্ক্রোল এবং প্রবীণ আচরণের কারণে, ঘরগুলি প্রায়শই সংশোধন করা, অপসারণ এবং যুক্ত করা হয়। super.layoutSubviews()কোষগুলি লোড হওয়ার ঠিক পরে, এটি কাজ করে। এই সমাধানটি willDisplayসর্বশেষ সূচক পাথের ইভেন্টটির অপেক্ষা করার সমতুল্য । এই ইভেন্টটি layoutSubviewsযুক্ত প্রতিটি কক্ষের জন্য টেবিল ভিউ কার্যকর করার সময় বলা হয় ।

অ্যাপ্লিকেশন কোনও বিন্যাস পাস শেষ করার পরে কল করা অন্য উপায়।

ডকুমেন্টেশনে বর্ণিত হিসাবে , আপনি এর একটি বিকল্প ব্যবহার করতে পারেন UIView.animate(withDuration:completion):

tableView.reloadData()
UIView.animate(withDuration: 0) {
    // layout done
}

এই সমাধানটি কাজ করে তবে লেআউটটি করার সময় এবং ব্লকটি ডাকার সময়ের মধ্যে পর্দা একবার রিফ্রেশ হবে। এটি DispatchMain.asyncসমাধানের সমতুল্য তবে নির্দিষ্ট করা আছে।

Ternative বিকল্পভাবে, আমি টেবিল দৃশ্যের লেআউটটি জোর করে পছন্দ করতে চাই

যে কোনও ভিউকে তত্ক্ষণাত্ এর সাবভিউ ফ্রেমগুলি গণনা করতে বাধ্য করার জন্য একটি উত্সর্গীকৃত পদ্ধতি রয়েছে layoutIfNeeded:

tableView.reloadData()
table.layoutIfNeeded()
// layout done

তবে সাবধান থাকুন, এটি করার ফলে সিস্টেমের দ্বারা ব্যবহৃত অলস লোডিং দূর হবে। এই পদ্ধতিগুলিকে বারবার কল করা পারফরম্যান্সের সমস্যা তৈরি করতে পারে। সারণী দর্শনটির ফ্রেম গণনা করার আগে তাদের ডাকা হবে না তা নিশ্চিত করুন, অন্যথায় সারণী দর্শনটি আবার লোড হবে এবং আপনাকে অবহিত করা হবে না।


আমি মনে করি এর কোনও নিখুঁত সমাধান নেই। সাবক্লাসিং ক্লাসগুলি অসুবিধা হতে পারে। একটি লেআউট পাস উপরে থেকে শুরু হয় এবং নীচে যায় যাতে সমস্ত লেআউট সম্পন্ন হওয়ার পরে এটি অবহিত হওয়া সহজ নয়। এবং layoutIfNeeded()পারফরম্যান্স সম্পর্কিত সমস্যাগুলি তৈরি করতে পারে ইত্যাদি But কিন্তু এই বিকল্পগুলি জেনে আপনি আপনার প্রয়োজনের সাথে খাপ খায় এমন কোনও বিকল্পে ভাবতে সক্ষম হবেন।



1

এখানে আমি সুইফট 3-এ কীভাবে করব

let threshold: CGFloat = 76.0 // threshold from bottom of tableView

internal func scrollViewDidScroll(_ scrollView: UIScrollView) {

    let contentOffset = scrollView.contentOffset.y
    let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;

    if  (!isLoadingMore) &&  (maximumOffset - contentOffset <= threshold) {
        self.loadVideosList()
    }
}

1

এখানে আমি কি করব।

  1. আপনার বেস ক্লাসে (রুটভিসি বেসভিসি ইত্যাদি হতে পারে),

    উ: "ডিডফিনিশরেলোডিং" কলব্যাক প্রেরণের জন্য একটি প্রোটোকল লিখুন।

    @protocol ReloadComplition <NSObject>
    @required
    - (void)didEndReloading:(UITableView *)tableView;
    @end

    বি। সারণী দর্শনটি পুনরায় লোড করার জন্য একটি জেনেরিক পদ্ধতি লিখুন।

    -(void)reloadTableView:(UITableView *)tableView withOwner:(UIViewController *)aViewController;
  2. বেস ক্লাস পদ্ধতি প্রয়োগের ক্ষেত্রে, বিলম্বের সাথে ডেলিগেটথোডের পরে পুনরায় লোডডাটা কল করুন।

    -(void)reloadTableView:(UITableView *)tableView withOwner:(UIViewController *)aViewController{
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            [tableView reloadData];
            if(aViewController && [aViewController respondsToSelector:@selector(didEndReloading:)]){
                [aViewController performSelector:@selector(didEndReloading:) withObject:tableView afterDelay:0];
            }
        }];
    }
  3. আপনার যে সমস্ত কলব্যাকের প্রয়োজন সেখানে সমস্ত ভিউ কন্ট্রোলারে পুনরায় লোড সমাপ্তি প্রোটোকলের বিষয়ে নিশ্চিত করুন।

    -(void)didEndReloading:(UITableView *)tableView{
        //do your stuff.
    }

তথ্যসূত্র: https://discussion.apple.com/thread/2598339?start=0&tstart=0


0

@ ফোলেক্স উত্তরটি সঠিক।

তবে এটি ব্যর্থ হবে যদি টেবিলভিউতে একবারে একাধিক বিভাগ প্রদর্শিত হয়।

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
   if([indexPath isEqual:((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject])]){
    //end of loading

 }
}

0

সুইফটে আপনি এরকম কিছু করতে পারেন। প্রতিবার টেবিল ভিউয়ের শেষে পৌঁছানোর পরে নিম্নলিখিত শর্তটি সত্য হবে

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        if indexPath.row+1 == postArray.count {
            println("came to last row")
        }
}

0

আমি জানি যে এটির উত্তর দেওয়া হয়েছে, আমি কেবল একটি সুপারিশ যুক্ত করছি।

নিম্নলিখিত ডকুমেন্টেশন অনুযায়ী

https://www.objc.io/issues/2-concurrency/thread-safe-class-design/

প্রেরণ_অ্যাসেন্সের সাথে সময় নির্ধারণের বিষয়গুলি ঠিক করা একটি খারাপ ধারণা। আমি পরামর্শ দিচ্ছি যে এফএলএজি বা কিছু যুক্ত করে আমাদের এটি পরিচালনা করা উচিত।


0

আপনার যদি একাধিক বিভাগ থাকে তবে শেষ বিভাগে শেষ সারিটি কীভাবে পাবেন তা এখানে রয়েছে (সুইফট 3):

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if let visibleRows = tableView.indexPathsForVisibleRows, let lastRow = visibleRows.last?.row, let lastSection = visibleRows.map({$0.section}).last {
        if indexPath.row == lastRow && indexPath.section == lastSection {
            // Finished loading visible rows

        }
    }
}

0

বেশিরভাগ দুর্ঘটনাক্রমে আমি এই সমাধানটিতে ঝাঁপিয়েছি:

tableView.tableFooterView = UIView()
tableViewHeight.constant = tableView.contentSize.height

কন্টেন্টসাইজ পাওয়ার আগে আপনাকে ফুটারভিউ সেট করতে হবে যেমন ভিউডিডলডে। BTW। পদ্ম দৃশ্যটি সেট করা আপনাকে "অব্যবহৃত" বিভাজক মুছতে দেয়


-1

আপনি বর্তমানে সারণীতে প্রদর্শিত হবে এমন আইটেমের মোট সংখ্যা বা বর্তমানে দৃশ্যমান আইটেমগুলির সন্ধান করছেন? যেভাবেই হোক .. আমি বিশ্বাস করি যে সমস্ত ডেটাসোর্স পদ্ধতি कॉल হওয়ার পরে 'ভিউডিডডলড' পদ্ধতিটি কার্যকর করে। তবে এটি কেবলমাত্র ডেটার প্রথম লোডে কাজ করবে (আপনি যদি একক বরাদ্দ ভিউকন্ট্রোলার ব্যবহার করেন)।


-1

আমি অ্যান্ড্রুয়ের কোডটি অনুলিপি করছি এবং টেবিলে আপনার সারি মাত্র 1 সারি রয়েছে সেই ক্ষেত্রে অ্যাকাউন্টের জন্য এটি প্রসারিত করছি। এটা আমার জন্য এখন পর্যন্ত কাজ করে!

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
// detect when all visible cells have been loaded and displayed
// NOTE: iOS7 workaround used - see: http://stackoverflow.com/questions/4163579/how-to-detect-the-end-of-loading-of-uitableview?lq=1
NSArray *visibleRows = [tableView indexPathsForVisibleRows];
NSIndexPath *lastVisibleCellIndexPath = [visibleRows lastObject];
BOOL isPreviousCallForPreviousCell = self.previousDisplayedIndexPath.row + 1 == lastVisibleCellIndexPath.row;
BOOL isLastCell = [indexPath isEqual:lastVisibleCellIndexPath];
BOOL isFinishedLoadingTableView = isLastCell && ([tableView numberOfRowsInSection:0] == 1 || isPreviousCallForPreviousCell);

self.previousDisplayedIndexPath = indexPath;

if (isFinishedLoadingTableView) {
    [self hideSpinner];
}
}

দ্রষ্টব্য: আমি কেবল অ্যান্ড্রু কোড থেকে 1 বিভাগ ব্যবহার করছি, তাই এটি মনে রাখবেন ..


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

-3

IOS7.0x এ সমাধানটি কিছুটা আলাদা। এখানে আমি যা নিয়ে এসেছি তা এখানে।

    - (void)tableView:(UITableView *)tableView 
      willDisplayCell:(UITableViewCell *)cell 
    forRowAtIndexPath:(NSIndexPath *)indexPath
{
    BOOL isFinishedLoadingTableView = [self isFinishedLoadingTableView:tableView  
                                                             indexPath:indexPath];
    if (isFinishedLoadingTableView) {
        NSLog(@"end loading");
    }
}

- (BOOL)isFinishedLoadingTableView:(UITableView *)tableView 
                         indexPath:(NSIndexPath *)indexPath
{
    // The reason we cannot just look for the last row is because 
    // in iOS7.0x the last row is updated before
    // looping through all the visible rows in ascending order 
    // including the last row again. Strange but true.
    NSArray * visibleRows = [tableView indexPathsForVisibleRows];   // did verify sorted ascending via logging
    NSIndexPath *lastVisibleCellIndexPath = [visibleRows lastObject];
    // For tableviews with multiple sections this will be more complicated.
    BOOL isPreviousCallForPreviousCell = 
             self.previousDisplayedIndexPath.row + 1 == lastVisibleCellIndexPath.row;
    BOOL isLastCell = [indexPath isEqual:lastVisibleCellIndexPath];
    BOOL isFinishedLoadingTableView = isLastCell && isPreviousCallForPreviousCell;
    self.previousDisplayedIndexPath = indexPath;
    return isFinishedLoadingTableView;
}

-3

উদ্দেশ্য গ

[self.tableView reloadData];
[self.tableView performBatchUpdates:^{}
                              completion:^(BOOL finished) {
                                  /// table-view finished reload
                              }];

দ্রুতগতি

self.tableView?.reloadData()
self.tableView?.performBatchUpdates({ () -> Void in

                            }, completion: { (Bool finished) -> Void in
                                /// table-view finished reload
                            })

1
এই পদ্ধতিটি কেবল UICollectionViewযতদূর আমি উপলব্ধ হিসাবে উপলব্ধ ।
o

হ্যাঁ তুমিই ঠিক. ইউআইটিএবলভিউয়ের স্টার্ট আপ আপডেটগুলি ইউআইসিএল্লেশনভিউয়ের পারফরম্যান্স ব্যাচআপডেটসের সমান: সমাপ্তি। stackoverflow.com/a/25128583/988169
pkc456

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