ইউআইটিবেল ভিউ: ভিউফোর্ডহাইডারইনসেকশন: পুনঃলোডের সময় ডাকা হয় না:


127

আমি সঠিক প্রতিনিধি এবং ডেটাসোর্স সংযোগগুলি সহ টেবিলভিউ সেট আপ করেছি .. পুনরায়লোডডাটা পদ্ধতিটি বাদে ডেটাসোর্স এবং প্রতিনিধি পদ্ধতিগুলিকে কল করে viewForHeaderInSection:

কেন যে এত?


30
হয় heightForHeaderInSection:বাস্তবায়িত?
7usam

আপনি কি টেবিলভিউয়ের জন্য কোনও মান সেট করেছেন sectionHeaderHeight?
কার্টার মেডলিন

উত্তর:


256

ব্যবহারের জন্য tableView:viewForHeaderInSection:আপনিও বাস্তবায়ন করা দরকার tableView:heightForHeaderInSection:। এটি শিরোনামের জন্য উপযুক্ত নন-শূন্য উচ্চতা ফিরিয়ে আনবে। এছাড়াও আপনি এটি বাস্তবায়ন করেন না তা নিশ্চিত করুন tableView:titleForHeaderInSection:। আপনার কেবলমাত্র একটি বা অন্যটি ( viewForHeaderবা titleForHeader) ব্যবহার করা উচিত ।


3
পদ্ধতির স্বাক্ষরে কোনও টাইপো নেই তা নিশ্চিত করুন। একটি ভুল চিঠি মানে এটি বলা হবে না। কেসটিও পরীক্ষা করে দেখুন। এছাড়াও নিশ্চিত হন যে আপনি 0 থেকে ফিরে আসছেন numberOfSections
rmaddy

সবকিছু সঠিক এবং সঠিকভাবে সংকলন করা হয়েছে .. আমি যে বিষয়টিটি বুঝতে চেয়েছিলাম সেটি যখন পদ্ধতিটি বলা হয় তার সময়কালের মধ্যেই হয় ... টেবিল ভিউ: ভিউফোর্ডহাইডারইনসেকশনটি যখন টেবিলটি প্রদর্শিত হতে চলেছে এবং সিঙ্ক প্রয়োগের অংশ হিসাবে নয় [ tableview reloadData]
inforeqd

@ এমডি ওএমজি আপনাকে ধন্যবাদ, এটি আমার সম্পর্কে খুব বোকা আমি আমার উদাহরণগুলি তৈরি করেছিলাম তবে আমি আমার অ্যারেতে
সংযুক্ত হইনি

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

@ রোমমের মন্তব্যে যুক্ত করা: আপনি যদি উভয়ই প্রয়োগ করে থাকেন titleForHeaderInSection:এবং viewForHeaderInSection:এবং পরবর্তীটি দেখানো একটি সাবক্লাস হয় UITableViewHeaderFooterViewতবে textLabel.textএটি স্বয়ংক্রিয়ভাবে titleForHeaderInSection:স্ট্রিংয়ের সমস্ত ক্যাপ সংস্করণে সেট হয়ে গেছে । এই আচরণটি প্রতিরোধ করতে হয় হয় titleForHeaderInSection:উত্তরাধিকার সূত্রে পরিবর্তে কাস্টম লেবেল প্রয়োগ বা ব্যবহার করবেন না textLabel
অর্টউইন জেন্টজ

40

কৌতুক ঐ দুটি পদ্ধতি বিভিন্ন অন্তর্গত হয় UITableViewপ্রোটোকল: tableView:titleForHeaderInSection:একটি হল UITableViewDataSourceপ্রোটোকল পদ্ধতি, যেখানে tableView:viewForHeaderInSectionজন্যে UITableViewDelegate

এর মানে:

  • আপনি যদি পদ্ধতিগুলি বাস্তবায়ন করেন তবে কেবলমাত্র হিসাবে হিসাবে নিজেকে নির্ধারণ dataSourceকরেন UITableView, আপনার tableView:viewForHeaderInSectionবাস্তবায়ন অগ্রাহ্য করা হবে।

  • tableView:viewForHeaderInSectionএকটি উচ্চ অগ্রাধিকার আছে। আপনি পদ্ধতির উভয় বাস্তবায়ন এবং উভয় নিজেকে ধার্য যদি dataSourceএবং delegateজন্য UITableView, আপনার জন্য অধ্যায় হেডার মতামত ফিরে আসবে কিন্তু আপনার tableView:titleForHeaderInSection:উপেক্ষা করা হবে।

আমি অপসারণের চেষ্টাও করেছি tableView:heightForHeaderInSection:; এটি ভাল কাজ করেছে এবং উপরের পদ্ধতিগুলিকে প্রভাবিত করবে বলে মনে হচ্ছে না। তবে ডকুমেন্টেশন বলছে যে এটি tableView:viewForHeaderInSectionসঠিকভাবে কাজ করা প্রয়োজন; সুতরাং নিরাপদে থাকার জন্য এটি কার্যকর করাও বুদ্ধিমানের কাজ।


6
তুমি আমার দিন বানিয়েছ !!! বরাদ্দ UITableViewDelegateকরতে ভুলে গেছি self, কারণ আমি ভেবেছিলাম, এটি tableView:viewForHeaderInSectionএকটি UITableViewDataSourceপদ্ধতি। ধন্যবাদ!
অস্বীকার 63

1
"টেবিলভিউ: ভিউফোর্ডহাইডারআইনসেকশন" অতীব গুরুত্বপূর্ণ নয়। কী গুরুত্বপূর্ণ আপনি কোনওভাবে একটি উচ্চতা ফিরে আসেন return আপনি এটি ১ টি অনুমানের মাধ্যমে বা 2. একটি হার্ডকোডযুক্ত মান বা 3. একটি titleForHeaderযার অভ্যন্তরীণ আকারের মাধ্যমে অর্জন করতে পারেন । অভ্যন্তরীণ আকার হরফ পরিবার এবং আকারের উপর ভিত্তি করে গণনা করা হয়।
মধু

28

@rmaddy নিয়ম, দুইবার misstated করেছেন: বাস্তবে, tableView:viewForHeaderInSection:নেই না প্রয়োজন যে আপনার কাছে বাস্তবায়ন tableView:heightForHeaderInSection:, এবং এছাড়াও এটি উভয় কল পুরোপুরি জরিমানা titleForHeaderএবং viewForHeader। আমি ঠিক রেকর্ডের জন্য নিয়মটি সঠিকভাবে বর্ণনা করব:

নিয়মটি কেবল viewForHeaderএটিকে বলা হয় না যদি আপনি কোনওভাবে শিরোনামকে উচ্চতা না দিয়ে থাকেন। আপনি তিনটি উপায়ে যেকোন সংমিশ্রণে এটি করতে পারেন:

  • বাস্তবায়ন tableView:heightForHeaderInSection:

  • টেবিল সেট করুন sectionHeaderHeight

  • কল করুন titleForHeader(এটি অন্যথায় যদি না থাকে তবে এটি শিরোনামকে একটি ডিফল্ট উচ্চতা দেয়)।

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


দস্তাবেজগুলি থেকে tableView:viewForHeaderInSection:: "এই পদ্ধতিটি তখনই tableView:heightForHeaderInSection:কার্যকর হয় যখন প্রয়োগ করা হয়।"
rmaddy

1
ফাইন। ডক্স কী বলে, তারা বলে। এখন এক্সপেরিমেন্ট করুন। আমি যেমন বলেছি ঘটনাগুলি হ'ল।
ম্যাট

এবং আপনি উভয় থাকতে পারে titleForHeaderInSectionএবং viewForHeaderInSection? টেবিল ভিউ কেবল দুজনের একজনকে কল করবে (আমি ভুলে যাই যা এই মুহুর্তে প্রাধান্য পায়)।
rmaddy

1
আসলে ধাঁধার আরও একটি টুকরো রয়েছে যা কখনও কখনও উচ্চতা নির্ধারণের এই তিনটি উপায় ছাড়াওviewForHeader ডাকা হয় । আমার এটি ঘটেছে, যেখানে আমাকে ডাকা হয়েছিল এবং শিরোনামগুলি ঠিক একদিন পর্যন্ত প্রদর্শন করেছিল, আমার পক্ষে কোনও পরিবর্তন ছাড়াই তারা তা করেনি । আমি যখন ডাকা হ'ল ন্যূনতম প্রয়োজনীয়তাগুলি কী তা আবিষ্কার করতে পরীক্ষা-নিরীক্ষা শুরু করি That's এবং এখন আমি জানি। এবং এখন আপনি কি। viewForHeaderviewForHeader
ম্যাট

2
@ টেক্সাস না, আমি জামারিন করি না। কোকো ফ্রেমওয়ার্কগুলির উপরে অন্য স্তরের ইন্ডিয়ারেশন যুক্ত করা আমার মাথাটি বিস্ফোরিত করবে। :)
ম্যাট

20

দেওয়া estimatedSectionHeaderHeightএবং sectionHeaderHeightমানগুলি আমার সমস্যাটিকে স্থির করে। যেমন, self.tableView.estimatedSectionHeaderHeight = 100 self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension


আমার সমস্যাটি সুইফট ৩.১ এ আপগ্রেড করার পরে শুরু হয়েছিল। এই সমাধান এটি স্থির করে।
zevij

@pbuchheit অ্যাপল ডক্স বলছে এটি আইওএস 7.0+ থেকে উপলব্ধ, দয়া করে এখানে একবার দেখুন, বিকাশকারী.এপলল
শরুখ মাস্তান

@ শরুখ মাস্তান দেখে মনে হচ্ছে আপনি ঠিক আছেন। কোনও কারণে আমি এই সম্পত্তিটি ব্যবহার করার চেষ্টা করার সময় আমি একটি সতর্কতা পেয়েছিলাম, তবে এটি একটি পরিষ্কার বিল্ড করার পরে চলে যায়।
pbuchheit

7

রম্যাডির জবাবটি বন্ধ করে দিয়ে, আমি শিরোনাম দর্শনটি আড়াল করার চেষ্টা করছিলাম এবং "টেবিল ভিউ: উচ্চতাফোড়হিনডারসেকশন" এবং এর থেকে একটি 0 উচ্চতার ভিউয়ের জন্য 0.0f ফিরে আসছিলাম tableView:viewForHeaderInSection

থেকে পরিবর্তন করার পরে return 1.0fকরতে return 0.0ftableView:heightForHeaderInSection, প্রতিনিধি পদ্ধতি tableView:viewForHeaderInSectionপ্রকৃতপক্ষে ডাকা হয়।

আমার পছন্দসই প্রভাবটি "টেবিল ভিউ: উচ্চতাফোড়হিন্ডইনসেকশন" ব্যবহার না করেই কাজ করে; তবে এটি অন্যদের জন্য দরকারী হতে পারে যারা "টেবিলভিউ: উচ্চতাফোড়হিন্ডিশন" প্রতিনিধি পদ্ধতি কল করার ক্ষেত্রে সমস্যা নিয়ে আসছেন।


5

tableView:heightForHeaderInSection:আপনার শিরোনাম> 0 এর জন্য প্রয়োগ এবং উচ্চতা নির্ধারণ করা উচিত ।

এই প্রতিনিধি পদ্ধতি পদ্ধতির পাশাপাশি চলে viewForHeaderInSection:

আশা করি এটা কাজে লাগবে.

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
         return 40;
}

আপনি কি পরীক্ষা করেছেন যে আপনার উত্তরটি আসলে কাজ করে? বেকোস ইফ আপনি মনোযোগ দিয়ে পড়েন তবে বলা হয়েছে যে প্রাথমিকভাবে ভিউহাইডারআইএনএসেকশন বলা হয়। টেবিলটি পুনরায় লোড করা হলেই এটি বলা হয় না!
কার্লিস

5

সংক্ষিপ্তভাবে লক্ষণীয় যে আপনার যদি tableView:heightForHeaderInSection:রিটার্ন বাস্তবায়ন করে UITableViewAutomaticDimensionতবে tableView:viewForHeaderInSection:ডাকা হবে না।

UITableViewAutomaticDimensionধরে নেওয়া হয় যে একটি স্ট্যান্ডার্ড UITableViewHeaderFooterViewব্যবহার করা হবে যা প্রতিনিধি পদ্ধতিতে জনবহুল tableView:titleForHeaderInSection:

এর মন্তব্যগুলি থেকে UITableView.h:

থেকে এই মান রিটার্নিং tableView:heightForHeaderInSection:বা tableView:heightForFooterInSection:যে ফিট মান থেকে ফিরে উচ্চতা ফলাফল tableView:titleForHeaderInSection:বা tableView:titleForFooterInSection:যদি শিরোনাম শূন্য নয়।


1
যদি আপনি estimatedSectionHeaderHeightকোনও মান সেট করে থাকেন tableView:viewForHeaderInSectionতবে ডাকা হবে (সারিগুলির জন্য স্বয়ংক্রিয় মাত্রাগুলি একইভাবে কীভাবে কাজ করবে)
গ্রেটউইজ

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

3

আমি মাত্র একটি শিরোনাম আইওএস 7.1 এর জন্য না দেখানো নিয়ে একটি সমস্যা পেয়েছি , তবে পরবর্তী পরীক্ষাগুলি 8.1 এবং 8.4 দিয়ে স্পষ্ট করে পরীক্ষা করেছি with

ঠিক একই কোডের জন্য, 7.1 কোনও বিভাগে শিরোনাম প্রতিনিধি পদ্ধতিগুলিতে মোটেই কল করছিল না , সহ: tableView:heightForHeaderInSection:এবং tableView:viewForHeaderInSection:

পরীক্ষার পরে, আমি দেখতে পেলাম যে আমার তৈরি শিরোনামগুলি থেকে এই লাইনটি সরিয়ে ফেলাviewDidLoad 7.1-এ পুনরায় প্রদর্শিত হবে এবং আমি পরীক্ষিত অন্যান্য সংস্করণগুলিকে প্রভাবিত করে না:

// _Removing_ this line _fixed_ headers on 7.1
self.tableView.estimatedSectionHeaderHeight = 80;

… সুতরাং, সেখানে অন্তত 7.1 এর জন্য কোনও ধরণের বিরোধ আছে বলে মনে হচ্ছে।


3

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

-(CGFloat)tableView:(UITableView *)tableView 
         estimatedHeightForHeaderInSection:(NSInteger)section
{
      return 44.0f;
}

যদিও আমি উভয় বিকল্প পরীক্ষা করে দেখেছি

  1. স্বয়ংক্রিয় উচ্চতা গণনা
  2. স্বয়ংক্রিয়ভাবে আনুমানিক উচ্চতা গণনা

অ্যাপল যেমন বলে স্টোরিবোর্ড থেকে , তবুও আমি এই অদ্ভুত ত্রুটি পেয়েছি।

দয়া করে দ্রষ্টব্য : এই ত্রুটিটি কেবল আইওএস -10 সংস্করণে দেখানো হয়েছিল আইওএস -11 সংস্করণে নয়। হতে পারে এটি এক্সকোড থেকে একটি বাগ। ধন্যবাদ


0

আমি যা পেয়েছি তা এখানে ( সুইফ্ট 4 ) (ধন্যবাদ to অন্য প্রশ্নের এই মন্তব্যের )

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

ফিক্সটি হবে ডিসপ্লেহাইডারভিউ:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let header = view as? UITableViewHeaderFooterView {
        header.textLabel?.font = UIFont(name: yourFont, size: 42)
    }
}

0

আমার ক্ষেত্রে আমি UITableviewCellসেলটি viewForHeaderInSectionএভাবে ব্যবহার করে এবং ফিরে আসার শিরোনাম দৃশ্য তৈরি করেছি

return cell

এটিতে পরিবর্তন

return cell.contentView 

আমার জন্য কাজ করেছেন।


0

আমার ক্ষেত্রে

viewForHeaderInSection

সুদৃ a় ক্লাসে ডেইজিকে বিরক্ত করছিল না এমন দূরে একটি উদ্ভূত শ্রেণিতে প্রয়োগ করা হয়েছিল।


0

কেন ফোন viewForHeaderInSectionনা করার কারণ দুটি কারণগুলির মধ্যে একটি:

হয় আপনি নিজের সেট আপ করেননি UITableViewDelegate, বা আপনি আপনার UITableViewDelegateভুলভাবে সেট আপ করেছেন ।


0

আমার ক্ষেত্রে এটি কারণ ছিল যা আমি প্রয়োগ করি নি:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat

-1

কখনও কখনও সেটিং tableview.delegateবা datasource = nilমধ্যে viewWillAppear:অথবা viewDidAppear:পদ্ধতি এই সমস্যা সৃষ্টি করতে পারে। এটি না করার বিষয়টি নিশ্চিত করুন ...


-1

আমি একটি সুইফট 2 প্রকল্প থেকে নিম্নলিখিত দুটি পদ্ধতিটি আমার সুইফট 3 প্রকল্পে কাটা ও পেস্ট করেছি যা কখনও বলা হয় নি কারণ সুইফ্ট 3 এ এই প্রথম পদ্ধতিগুলির "-" পরামিতির নামের আগে থাকতে হবে।

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 44.0
}

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: B2BTrolleyHeaderFooterView.reuseIdentifier) as! B2BTrolleyHeaderFooterView        
    return headerView
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.