উত্তর:
আপনি এই সমাধানটির সন্ধান করছেন:
স্ট্যাটিকডেটাটাবল ভিউকন্ট্রোলার ২.০
https://github.com/xelvenone/StaticDataTableViewController
যা অ্যানিমেশন সহ বা ছাড়াই কোনও স্থির ঘর (গুলি) প্রদর্শন / আড়াল / পুনরায় লোড করতে পারে!
[self cell:self.outletToMyStaticCell1 setHidden:hide];
[self cell:self.outletToMyStaticCell2 setHidden:hide];
[self reloadDataAnimated:YES];
সর্বদা কেবলমাত্র ব্যবহারের জন্য দ্রষ্টব্য (রিলোডলোড ডেটা অ্যানিমেটেড: হ্যাঁ / না) (সরাসরি কল করুন না [সেল্ফ.ট্যাবলভিউ রিলোডলোডটি] সরাসরি)
এটি 0 এর উচ্চতা নির্ধারণের সাথে হ্যাকি সমাধানটি ব্যবহার করে না এবং আপনাকে পরিবর্তনটি সঞ্চারিত করতে এবং পুরো বিভাগগুলি গোপন করতে দেয়
IBOutletCollection
তবে এটি কীভাবে কোনও পার্থক্য তৈরি করবে তা আমি দেখতে পাচ্ছি না। আমি গতকাল কেবল কোডটি ডাউনলোড করেছি তাই আমি এটির পুরানো সংস্করণ মনে করি না।
ইউআইটিবেলে স্থিতিশীল ঘরগুলি আড়াল করতে:
আপনার ইউআইটিএবলভিউ নিয়ন্ত্রক প্রতিনিধি শ্রেণিতে:
উদ্দেশ্য গ:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell* cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
if(cell == self.cellYouWantToHide)
return 0; //set the hidden cell's height to 0
return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}
সুইফট:
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
var cell = super.tableView(tableView, cellForRowAtIndexPath: indexPath)
if cell == self.cellYouWantToHide {
return 0
}
return super.tableView(tableView, heightForRowAtIndexPath: indexPath)
}
এই পদ্ধতিটি ইউআইটিবেলে প্রতিটি কক্ষের জন্য কল করবে। এটি যখন আপনার আড়াল করতে চান তার জন্য এটি কল করার পরে আমরা এর উচ্চতা 0 এ সেট করে রেখেছি it আমরা এর জন্য একটি আউটলেট তৈরি করে টার্গেট সেলটি সনাক্ত করি:
ClipToBounds
সমস্যাটি এড়াতে , আপনি ঘরটি গোপনেও সেট করতে পারেন। এটি আমার কাছে আরও পরিষ্কার মনে হবে। ;-)
সর্বোত্তম উপায় নীচের ব্লগে বর্ণিত হয়েছে http://ali-reynolds.com/2013/06/29/hide-cells-in-static-table-view/
আপনার স্থিতিশীল টেবিল ভিউটি ইন্টারফেস বিল্ডারে সাধারণ হিসাবে ডিজাইন করুন - সমস্ত সম্ভাব্য লুকানো ঘর দিয়ে সম্পূর্ণ করুন। তবে আপনি যে কোনও সম্ভাব্য কক্ষটি আড়াল করতে চান তার জন্য আপনাকে অবশ্যই একটি জিনিস করতে হবে - ঘরের "ক্লিপ সাবভিউগুলি" সম্পত্তিটি পরীক্ষা করুন, অন্যথায় যখন আপনি চেষ্টা করার পরে এটি লুকিয়ে রাখেন তখন কক্ষের সামগ্রীটি অদৃশ্য হয়ে যায় না (উচ্চতা সঙ্কুচিত করে) - আরও পরে)।
সুতরাং - আপনার একটি ঘরে একটি স্যুইচ রয়েছে এবং কিছু কিছু স্থিতিশীল কক্ষগুলি লুকিয়ে রাখতে এবং স্যুইচটি গ্রহণ করার কথা। এটি একটি আইবিএક્શન পর্যন্ত লাগান এবং সেখানে এটি করুন:
[self.tableView beginUpdates]; [self.tableView endUpdates];
এটি আপনাকে কোষের উপস্থিতি এবং অদৃশ্য হয়ে যাওয়ার জন্য দুর্দান্ত অ্যানিমেশন দেয়। এখন নিম্নলিখিত টেবিল ভিউ প্রতিনিধি পদ্ধতি বাস্তবায়ন করুন:
- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 1 && indexPath.row == 1) { // This is the cell to hide - change as you need // Show or hide cell if (self.mySwitch.on) { return 44; // Show the cell - adjust the height as you need } else { return 0; // Hide the cell } } return 44; }
এবং এটাই. স্যুইচটি ফ্লিপ করুন এবং সেলটি একটি দুর্দান্ত, মসৃণ অ্যানিমেশন সহ লুকিয়ে রয়েছে এবং পুনরায় প্রদর্শিত হবে।
আমার সমাধান গ্যারেথের মতো একই দিকে চলে যায়, যদিও আমি কিছু জিনিস আলাদাভাবে করি।
এখানে যায়:
1. কোষগুলি লুকান
কোষগুলি সরাসরি আড়াল করার কোনও উপায় নেই। UITableViewController
এটি এমন ডেটা উত্স যা স্থির কোষ সরবরাহ করে এবং বর্তমানে এটি "সেল এক্স সরবরাহ করবেন না" বলার কোনও উপায় নেই। সুতরাং আমাদের নিজস্ব ডেটা উত্স সরবরাহ করতে হবে, যা এই প্রতিনিধিত্ব করেUITableViewController
স্থির কোষগুলি পেতে করে।
সবচেয়ে সহজ সাবক্লাস UITableViewController
, এবং ঘরগুলি লুকিয়ে রাখার সময় অন্যরকম আচরণ করা দরকার এমন সমস্ত পদ্ধতি ওভাররাইড করা ।
সবচেয়ে সহজ ক্ষেত্রে (একক বিভাগের টেবিল, সমস্ত কক্ষের উচ্চতা একই থাকে), এটি এরকম হবে:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [super tableView:tableView numberOfRowsInSection:section] - numberOfCellsHidden;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Recalculate indexPath based on hidden cells
indexPath = [self offsetIndexPath:indexPath];
return [super tableView:tableView cellForRowAtIndexPath:indexPath];
}
- (NSIndexPath*)offsetIndexPath:(NSIndexPath*)indexPath
{
int offsetSection = indexPath.section; // Also offset section if you intend to hide whole sections
int numberOfCellsHiddenAbove = ... // Calculate how many cells are hidden above the given indexPath.row
int offsetRow = indexPath.row + numberOfCellsHiddenAbove;
return [NSIndexPath indexPathForRow:offsetRow inSection:offsetSection];
}
যদি আপনার টেবিলের একাধিক বিভাগ থাকে বা কক্ষগুলির পৃথক উচ্চতা থাকে তবে আপনাকে আরও পদ্ধতি ওভাররাইড করতে হবে। একই নীতিটি এখানে প্রযোজ্য: সুপারকে প্রতিনিধিত্ব করার আগে আপনাকে সূচিপথ, বিভাগ এবং সারিটি অফসেট করতে হবে।
এছাড়াও মনে রাখবেন যে পদ্ধতির জন্য সূচিপথের পরামিতি didSelectRowAtIndexPath:
একই কক্ষের জন্য পৃথক হবে, রাষ্ট্রের উপর নির্ভর করে (অর্থাত্ লুকিয়ে থাকা কক্ষের সংখ্যা)। সুতরাং সর্বদা কোনও ইনডেক্সপথ প্যারামিটার অফসেট করা এবং এই মানগুলি নিয়ে কাজ করা সম্ভবত একটি ভাল ধারণা।
2. পরিবর্তন অ্যানিমেটেড
গ্যারেথ যেমন ইতিমধ্যে জানিয়েছে, আপনি যদি reloadSections:withRowAnimation:
পদ্ধতিটি ব্যবহার করে পরিবর্তনগুলি অ্যানিমেটেড করেন তবে আপনি প্রধান বিভক্ততা পেতে পারেন ।
আমি জানতে পেরেছিলাম যে আপনি reloadData:
তত্ক্ষণাত কল করলে অ্যানিমেশনটি অনেক উন্নত হয় (কেবলমাত্র ছোটখাটো বিস্কুট)। সারণিটি অ্যানিমেশনের পরে সঠিকভাবে প্রদর্শিত হয়।
সুতরাং আমি যা করছি তা হ'ল:
- (void)changeState
{
// Change state so cells are hidden/unhidden
...
// Reload all sections
NSIndexSet* reloadSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [self numberOfSectionsInTableView:tableView])];
[tableView reloadSections:reloadSet withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView reloadData];
}
numberOfRowsInSection:
কেবল তখনই বলা হয় যখন টেবিলটি প্রথমবার লোড হয়। আমি যখন [সেল্ফ.ট্যাবলভিউ রিলোডলোড ডেটা] কল করি - numberOfRowsInSection:
কখনই আর কল হয় না। শুধুমাত্র cellForRowAtIndexPath:
বলা হয়। আমি কী মিস করছি?
cellOneOutlet.hmitted = সত্য
এখন নীচের পদ্ধতিটি ওভাররাইড করুন, কোন ঘরের অবস্থানটি লুকানো আছে তা পরীক্ষা করুন এবং সেই ঘরের (গুলি) এর জন্য উচ্চতা 0 ফিরিয়ে দিন। স্থির টেবিলভিউতে যে কোনও ঘরটি দ্রুতগতিতে লুকিয়ে রাখতে পারবেন এমন একাধিক উপায়ে এটি।
override func tableView(tableView: UITableView, heightForRowAtIndexPathindexPath: NSIndexPath) -> CGFloat
{
let tableViewCell = super.tableView(tableView,cellForRowAtIndexPath: indexPath)
if tableViewCell.hidden == true
{
return 0
}
else{
return super.tableView(tableView, heightForRowAtIndexPath: indexPath)
}
}
let tableViewCell = super.tableView(tableView,cellForRowAtIndexPath: indexPath)
। আমি ধরে নিলাম এটি প্রতিস্থাপন করেছে let tableViewCell = tableView.cellForRow(at: indexPath as IndexPath)
।
UITableViewController
, আমার কোনও UITableView
প্রতিনিধি পদ্ধতি নেই। এটি কল করার জন্য heightForRow
, আমারও কি অন্য কোনও পদ্ধতি থাকা দরকার?
আমি এমন একটি বিকল্প নিয়ে এসেছি যা প্রকৃতপক্ষে বিভাগগুলি গোপন করে এবং সেগুলি মুছে দেয় না। আমি @ হেনিং 7777 এর পদ্ধতির চেষ্টা করেছি, কিন্তু আমি স্থিতিশীল ইউআইটিএবলভিউয়ের বিভাগগুলির সংখ্যা পরিবর্তন করার সময় সমস্যার মধ্যে পড়তে থাকি। এই পদ্ধতিটি আমার পক্ষে সত্যই ভাল কাজ করেছে তবে আমি প্রাথমিকভাবে সারিগুলির পরিবর্তে বিভাগগুলি আড়াল করার চেষ্টা করছি। আমি ফ্লাইতে কয়েকটি সারি সাফল্যের সাথে সরিয়ে দিচ্ছি, তবে এটি অনেকটা মেসওয়্যার, তাই আমি জিনিসগুলিকে এমন বিভাগগুলিতে গ্রুপ করার চেষ্টা করেছি যা আমার দেখানোর বা লুকানোর প্রয়োজন need এখানে আমি কীভাবে বিভাগগুলি আড়াল করছি তার একটি উদাহরণ এখানে দেওয়া হয়েছে:
প্রথমে আমি একটি NSMutableArray সম্পত্তি ঘোষণা করি
@property (nonatomic, strong) NSMutableArray *hiddenSections;
ভিউডিডলয়েডে (বা আপনি নিজের ডেটা জিজ্ঞাসা করার পরে) আপনি যে বিভাগগুলি অ্যারেতে লুকিয়ে রাখতে চান তা যোগ করতে পারেন।
- (void)viewDidLoad
{
hiddenSections = [NSMutableArray new];
if(some piece of data is empty){
// Add index of section that should be hidden
[self.hiddenSections addObject:[NSNumber numberWithInt:1]];
}
... add as many sections to the array as needed
[self.tableView reloadData];
}
তারপরে নিম্নলিখিত টেবিলভিউ প্রতিনিধি পদ্ধতিগুলি বাস্তবায়ন করুন
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
if([self.hiddenSections containsObject:[NSNumber numberWithInt:section]]){
return nil;
}
return [super tableView:tableView titleForHeaderInSection:section];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if([self.hiddenSections containsObject:[NSNumber numberWithInt:indexPath.section]]){
return 0;
}
return [super tableView:tableView heightForRowAtIndexPath:[self offsetIndexPath:indexPath]];
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if([self.hiddenSections containsObject:[NSNumber numberWithInt:indexPath.section]]){
[cell setHidden:YES];
}
}
তারপরে লুকানো বিভাগগুলির জন্য শিরোলেখ এবং পাদলেখের উচ্চতা 1 তে সেট করুন কারণ আপনি উচ্চতা 0 তে নির্ধারণ করতে পারবেন না এটির ফলে অতিরিক্ত 2 পিক্সেল স্থান হয় তবে আমরা পরবর্তী দৃশ্যমান শিরোনামটির উচ্চতা সামঞ্জস্য করে এর জন্য প্রস্তুত করতে পারি।
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
CGFloat height = [super tableView:tableView heightForHeaderInSection:section];
if([self.hiddenSections containsObject:[NSNumber numberWithInt:section]]){
height = 1; // Can't be zero
}
else if([self tableView:tableView titleForHeaderInSection:section] == nil){ // Only adjust if title is nil
// Adjust height for previous hidden sections
CGFloat adjust = 0;
for(int i = (section - 1); i >= 0; i--){
if([self.hiddenSections containsObject:[NSNumber numberWithInt:i]]){
adjust = adjust + 2;
}
else {
break;
}
}
if(adjust > 0)
{
if(height == -1){
height = self.tableView.sectionHeaderHeight;
}
height = height - adjust;
if(height < 1){
height = 1;
}
}
}
return height;
}
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
if([self.hiddenSections containsObject:[NSNumber numberWithInt:section]]){
return 1;
}
return [super tableView:tableView heightForFooterInSection:section];
}
তারপরে, আপনার যদি লুকানোর জন্য নির্দিষ্ট সারি থাকে তবে আপনি নম্বরআফ্রাউজইনসেকশনটি সমন্বয় করতে পারবেন এবং কোন সারিগুলি সেলফোরআউটিইন্ডেক্সপ্যাথে ফিরে এসেছে। এই উদাহরণে এখানে আমার একটি বিভাগে তিনটি সারি রয়েছে যেখানে কোনও তিনটি ফাঁকা থাকতে পারে এবং সরানোর প্রয়োজন রয়েছে।
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSInteger rows = [super tableView:tableView numberOfRowsInSection:section];
if(self.organization != nil){
if(section == 5){ // Contact
if([self.organization objectForKey:@"Phone"] == [NSNull null]){
rows--;
}
if([self.organization objectForKey:@"Email"] == [NSNull null]){
rows--;
}
if([self.organization objectForKey:@"City"] == [NSNull null]){
rows--;
}
}
}
return rows;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
return [super tableView:tableView cellForRowAtIndexPath:[self offsetIndexPath:indexPath]];
}
আপনি শর্তসাপেক্ষে সারিগুলি সরিয়ে দিচ্ছেন এমন সারিগুলির জন্য সূচকপথ গণনা করতে এই অফসেটডেক্সপথটি ব্যবহার করুন। আপনি যদি কেবল বিভাগগুলি লুকিয়ে রাখেন তবে প্রয়োজন হয় না
- (NSIndexPath *)offsetIndexPath:(NSIndexPath*)indexPath
{
int row = indexPath.row;
if(self.organization != nil){
if(indexPath.section == 5){
// Adjust row to return based on which rows before are hidden
if(indexPath.row == 0 && [self.organization objectForKey:@"Phone"] == [NSNull null] && [self.organization objectForKey:@"Email"] != [NSNull null]){
row++;
}
else if(indexPath.row == 0 && [self.organization objectForKey:@"Phone"] == [NSNull null] && [self.organization objectForKey:@"Address"] != [NSNull null]){
row = row + 2;
}
else if(indexPath.row == 1 && [self.organization objectForKey:@"Phone"] != [NSNull null] && [self.organization objectForKey:@"Email"] == [NSNull null]){
row++;
}
else if(indexPath.row == 1 && [self.organization objectForKey:@"Phone"] == [NSNull null] && [self.organization objectForKey:@"Email"] != [NSNull null]){
row++;
}
}
}
NSIndexPath *offsetPath = [NSIndexPath indexPathForRow:row inSection:indexPath.section];
return offsetPath;
}
ওভাররাইড করার জন্য প্রচুর পদ্ধতি রয়েছে তবে আমি এই পদ্ধতির বিষয়ে যা পছন্দ করি তা হ'ল এটি পুনরায় ব্যবহারযোগ্য। লুকানোসেকশন অ্যারে সেটআপ করুন, এতে যুক্ত করুন এবং এটি সঠিক বিভাগগুলি গোপন করবে। সারিগুলি এটিকে সামান্য কৌশলযুক্ত করে লুকিয়ে রাখা, তবে সম্ভব। আমরা যদি একটি গোষ্ঠীযুক্ত ইউআইটিএবল ভিউ ব্যবহার করি তবে আমরা সারিগুলির উচ্চতা 0 টি আড়াল করতে চাই না কারণ সীমানাটি সঠিকভাবে আঁকতে পারে না।
NSMutableSet
জন্য ব্যবহার করতে hiddenSections
হবে। আপনি বেশিরভাগ সদস্যতার জন্য পরীক্ষা করছেন বলে এটি অনেক দ্রুত।
NSMutableSet
জন্য ব্যবহার সম্পর্কে ভাল ধারণা দেয় hiddenSections
, যদিও আমি বুঝতে পেরেছি যে আপনার উত্তরটির বিন্দুটি কোন ধরণের ডেটা স্ট্রাকচার ব্যবহার করা উচিত সে সম্পর্কে নীট-পিকের চেয়ে ধারণাটি ছিল।
দেখা যাচ্ছে, আপনি একটি অচলিত ইউআইটিএবলভিউতে এবং অ্যানিমেশন সহ কক্ষগুলি লুকিয়ে রাখতে এবং প্রদর্শন করতে পারেন। এবং এটি অর্জন করা এত কঠিন নয় is
সারকথা:
Use tableView:heightForRowAtIndexPath:
কিছু রাজ্যের ভিত্তিতে গতিশীল কক্ষের উচ্চতা নির্দিষ্ট করতে totableView.beginUpdates();tableView.endUpdates()
tableView.cellForRowAtIndexPath:
ভিতরে ডাকবে না tableView:heightForRowAtIndexPath:
। কক্ষগুলি পৃথক করতে ক্যাশেড সূচকপথগুলি ব্যবহার করুন।হ্যাঁ, এটি অবশ্যই সম্ভব, যদিও আমি এই মুহূর্তে একই সমস্যা নিয়ে লড়াই করছি। আমি ঘরগুলি আড়াল করতে সক্ষম হয়েছি এবং সবকিছু ঠিকঠাক কাজ করে তবে আমি বর্তমানে জিনিসটি খুব সুন্দরভাবে অ্যানিমেট করতে পারি না। আমি যা পেয়েছি তা এখানে:
আমি প্রথম বিভাগের প্রথম সারিতে একটি অন / অফ স্যুইচের অবস্থার ভিত্তিতে সারিগুলি গোপন করছি। যদি স্যুইচটি চালু থাকে তবে তার নীচে একই বিভাগে 1 টি সারি রয়েছে, অন্যথায় 2 টি পৃথক সারি রয়েছে।
স্যুইচটি টগল করা অবস্থায় আমার একটি নির্বাচক ডেকেছিল এবং আমি কোন অবস্থায় আছি তা নির্দেশ করার জন্য আমি একটি পরিবর্তনশীল সেট করেছি Then
[[self tableView] reloadData];
আমি টেবিলটি ওভাররাইড করব: উইল ডিসপ্লেকেল: ফরঅ্যান্ড ইন্ডেক্সপথ: ফাংশন এবং যদি ঘরটি গোপন করার কথা মনে হয় তবে আমি এটি করি:
[cell setHidden:YES];
এটি ঘর এবং এর সামগ্রীগুলি গোপন করে, তবে এটি যে স্থান দখল করে তা সরিয়ে দেয় না।
স্থানটি সরাতে, টেবিলটি ওভাররাইড করুন দেখুন: উচ্চতার জন্যরোআউটআইডেক্সপথ: ফাংশন করুন এবং লুকানো থাকা সারিগুলির জন্য 0 প্রদান করুন return
আপনাকে টেবিলভিউ ওভাররাইড করতে হবে: সংখ্যাআফ্রাউজআইনসেকশন: এবং এই বিভাগে সারিগুলির সংখ্যাটি ফিরিয়ে দিন। আপনাকে এখানে অদ্ভুত কিছু করতে হবে যাতে আপনার টেবিলটি একটি শ্রেণিবদ্ধ শৈলী হলে গোলাকার কোণগুলি সঠিক কোষে ঘটে। আমার স্ট্যাটিক টেবিলটিতে বিভাগটির জন্য পূর্ণাঙ্গ কক্ষ রয়েছে, সুতরাং বিকল্পটি সম্বলিত প্রথম কক্ষ রয়েছে, তারপরে ওএন রাষ্ট্রীয় বিকল্পগুলির জন্য 1 টি সেল এবং অফ স্টেট বিকল্পগুলির জন্য আরও 2 টি কোষ, মোট 4 কোষ রয়েছে। যখন বিকল্পটি চালু থাকে, আমাকে 4 ফিরতে হবে, এতে লুকানো বিকল্প অন্তর্ভুক্ত রয়েছে যাতে প্রদর্শিত শেষ বিকল্পটির একটি গোলাকার বাক্স থাকে। যখন বিকল্পটি বন্ধ থাকে, শেষ দুটি বিকল্প প্রদর্শিত হয় না তাই আমি ফিরে আসি 2 all এগুলি সব ক্লিঙ্ক অনুভব করে। দুঃখিত যদি এটি খুব স্পষ্ট না হয় তবে এটি বর্ণনা করা কঠিন। কেবল সেটআপটি চিত্রিত করার জন্য, এটি আইবিতে টেবিল বিভাগটি নির্মাণ:
সুতরাং যখন টেবিলটি অপশনটি থাকে তখন দুটি সারি রিপোর্ট করে যা:
যখন বিকল্পটি সারণীটি বন্ধ থাকে তখন চারটি সারি রিপোর্ট করে যা:
এই পদ্ধতির বেশ কয়েকটি কারণে সঠিক বোধ হয় না, এটি আমার পরীক্ষার সাথে আমি যতদূর পেরেছি ঠিক ততটুকু ভাল, সুতরাং যদি আপনি আরও ভাল কোনও উপায় খুঁজে পান তবে দয়া করে আমাকে জানান। আমি এখন পর্যন্ত যে সমস্যাগুলি পর্যবেক্ষণ করেছি সেগুলি হ'ল:
টেবিলকে সারণির সংখ্যাটি অন্তর্নিহিত ডেটাতে সম্ভবত অন্তর্ভুক্ত থাকা সংখ্যার চেয়ে আলাদা বলে মনে করা ভুল বলে মনে হয়।
আমি পরিবর্তন অ্যানিমেটেড বলে মনে হচ্ছে না। আমি টেবিল ভিউ: রিলোডসেকশনগুলি: রও অ্যানিমেশন ব্যবহার করে চেষ্টা করেছি : রিলোডডাটার পরিবর্তে এবং ফলাফলগুলি বোধগম্য মনে হয় না, আমি এখনও এই কাজটি করার চেষ্টা করছি। বর্তমানে যা ঘটতে দেখা যাচ্ছে তা হ'ল টেবিলভিউ সঠিক সারিগুলি আপডেট করে না যাতে একটি লুকানো থাকে যা প্রদর্শিত হওয়া উচিত এবং প্রথম সারির নীচে একটি শূন্যতা রেখে যায়। আমি মনে করি এটি অন্তর্নিহিত ডেটা সম্পর্কে প্রথম পয়েন্টের সাথে সম্পর্কিত হতে পারে।
আশা করি কেউ বিকল্প পদ্ধতি বা সম্ভবত অ্যানিমেশন দিয়ে কীভাবে প্রসারিত করবেন সে সম্পর্কে পরামর্শ দিতে সক্ষম হবেন তবে সম্ভবত এটি আপনাকে শুরু করবে। ফাংশনগুলিতে হাইপারলিঙ্কের অভাবের জন্য আমার ক্ষমাপ্রার্থনা, আমি সেগুলিতে রেখেছিলাম তবে সেগুলি স্প্যাম ফিল্টার দ্বারা প্রত্যাখ্যাত হয়েছিল কারণ আমি মোটামুটি নতুন ব্যবহারকারী।
[[self tableView] reloadData];
যে ঘরগুলি আড়াল করার পরে আপনার আরও একবার কল করা উচিত
return [super tableView:tableView cellForRowAtIndexPath:indexPath];
মধ্যে UITableViewController
স্ট্যাটিক কোষ তৈরি করার জন্য উপশ্রেণী। সূচী পথগুলি স্থির
জাস্টার উত্তর অনুসারে, তবে সুইফট 4 এর জন্য:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let cell = super.tableView(tableView, cellForRowAt: indexPath)
if cell == self.cellYouWantToHide {
return 0
}
return super.tableView(tableView, heightForRowAt: indexPath)
}
tableView.reloadRows(at:, with:)
সারিটি ইতিমধ্যে দৃশ্যমান অবস্থায় আপনি যদি উচ্চতা পরিবর্তন করেন তবে আপনার ঘরগুলি আপডেট করার জন্য একটি দরকার হতে পারে ।
ঠিক আছে, কিছু চেষ্টা করার পরে, আমার একটি সাধারণ সাধারণ উত্তর নেই। এই ঘরটি লুকিয়ে রাখা উচিত কিনা তা পরীক্ষা করার জন্য আমি "isHmitted" বা "লুকানো" ভেরিয়েবল ব্যবহার করছি।
আপনার ভিউ কন্ট্রোলারে একটি আইবিআউটলেট তৈরি করুন।
@IBOutlet weak var myCell: UITableViewCell!
myCell
আপনার কাস্টম ফাংশনটিতে আপডেট করুন , উদাহরণস্বরূপ আপনি এটি ভিডডিলডে যুক্ত করতে পারেন:
override func viewDidLoad() {
super.viewDidLoad()
self.myCell.isHidden = true
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let cell = super.tableView(tableView, cellForRowAt: indexPath)
guard !cell.isHidden else {
return 0
}
return super.tableView(tableView, heightForRowAt: indexPath)
}
এটি ডেলিগেট পদ্ধতিতে আপনার যুক্তি হ্রাস করবে এবং আপনাকে কেবল আপনার ব্যবসায়ের প্রয়োজনীয়তার দিকে মনোনিবেশ করতে হবে।
উপরের উত্তরগুলি যে কক্ষগুলি লুকিয়ে / দেখায়, সারি হাইট পরিবর্তন করে, বা অটো লেআউটের সীমাবদ্ধতার সাথে জগাখিচুড়ি অটো লেআউট সমস্যার কারণে আমার পক্ষে কাজ করে না। কোডটি অসহনীয় হয়ে উঠল।
একটি সাধারণ স্ট্যাটিক টেবিলের জন্য, আমার পক্ষে সবচেয়ে ভাল কাজ করাটি হ'ল:
আমার টেবিল ভিউ কন্ট্রোলারের একটি উদাহরণ এখানে রয়েছে:
@IBOutlet weak var titleCell: UITableViewCell!
@IBOutlet weak var nagCell: UITableViewCell!
@IBOutlet weak var categoryCell: UITableViewCell!
var cellsToShow: [UITableViewCell] = []
override func viewDidLoad() {
super.viewDidLoad()
determinCellsToShow()
}
func determinCellsToShow() {
if detail!.duration.type != nil {
cellsToShow = [titleCell, nagCell, categoryCell]
}
else {
cellsToShow = [titleCell, categoryCell]
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
return cellsToShow[indexPath.row]
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cellsToShow.count
}
আইওএস ১১-এর জন্য, আমি জানতে পেরেছিলাম যে অ্যাপলের ডকুমেন্টেশনের ভিত্তিতে কিছু উন্নতি সহ মোহাম্মদ সালেহের উত্তরের একটি পরিবর্তিত সংস্করণ সবচেয়ে ভাল কাজ করেছে। এটি দুর্দান্তভাবে অ্যানিমেট করে, কোনও কুৎসিত হ্যাক বা হার্ডকোডযুক্ত মানগুলি এড়িয়ে যায় এবং ইন্টারফেস বিল্ডারে ইতিমধ্যে সেট করা সারি উচ্চতা ব্যবহার করে ।
মূল ধারণাটি কোনও লুকানো সারিগুলির জন্য সারি উচ্চতা 0 তে নির্ধারণ করা হয়। তারপরে tableView.performBatchUpdates
অবিচ্ছিন্নভাবে কাজ করে এমন অ্যানিমেশনটি ট্রিগার করতে ব্যবহার করুন ।
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if indexPath == indexPathOfHiddenCell {
if cellIsHidden {
return 0
}
}
// Calling super will use the height set in your storyboard, avoiding hardcoded values
return super.tableView(tableView, heightForRowAt: indexPath)
}
আপনি নিশ্চিত করতে চাইবেন cellIsHidden
এবং indexPathOfHiddenCell
আপনার ব্যবহারের ক্ষেত্রে উপযুক্তভাবে সেট হয়ে গেছেন। আমার কোডের জন্য তারা আমার টেবিল ভিউ নিয়ন্ত্রকের বৈশিষ্ট্য।
যে কোনও পদ্ধতিতে দৃশ্যমানতা নিয়ন্ত্রণ করা যায় (সম্ভবত একটি বোতাম ক্রিয়া বা didSelectRow
), একটি performBatchUpdates
ব্লকের অভ্যন্তরে সেল আইসহিডেন রাষ্ট্র টগল করুন :
tableView.performBatchUpdates({
// Use self to capture for block
self.cellIsHidden = !self.cellIsHidden
}, completion: nil)
অ্যাপল /performBatchUpdates
beginUpdates
endUpdates
যখনই সম্ভব সুপারিশ করে ।
আমি স্ট্যাটিক টেবিলের মধ্যে গোপন কক্ষগুলি সঞ্চার করার জন্য একটি সমাধান পেয়েছি।
// Class for wrapping Objective-C block
typedef BOOL (^HidableCellVisibilityFunctor)();
@interface BlockExecutor : NSObject
@property (strong,nonatomic) HidableCellVisibilityFunctor block;
+ (BlockExecutor*)executorWithBlock:(HidableCellVisibilityFunctor)block;
@end
@implementation BlockExecutor
@synthesize block = _block;
+ (BlockExecutor*)executorWithBlock:(HidableCellVisibilityFunctor)block
{
BlockExecutor * executor = [[BlockExecutor alloc] init];
executor.block = block;
return executor;
}
@end
শুধুমাত্র একটি অতিরিক্ত অভিধানের প্রয়োজন:
@interface MyTableViewController ()
@property (nonatomic) NSMutableDictionary * hidableCellsDict;
@property (weak, nonatomic) IBOutlet UISwitch * birthdaySwitch;
@end
এবং MyTableViewController এর বাস্তবায়ন দেখুন। দৃশ্যমান এবং অদৃশ্য সূচকগুলির মধ্যে সূচিপথ রূপান্তর করতে আমাদের দুটি পদ্ধতি দরকার ...
- (NSIndexPath*)recoverIndexPath:(NSIndexPath *)indexPath
{
int rowDelta = 0;
for (NSIndexPath * ip in [[self.hidableCellsDict allKeys] sortedArrayUsingSelector:@selector(compare:)])
{
BlockExecutor * executor = [self.hidableCellsDict objectForKey:ip];
if (ip.section == indexPath.section
&& ip.row <= indexPath.row + rowDelta
&& !executor.block())
{
rowDelta++;
}
}
return [NSIndexPath indexPathForRow:indexPath.row+rowDelta inSection:indexPath.section];
}
- (NSIndexPath*)mapToNewIndexPath:(NSIndexPath *)indexPath
{
int rowDelta = 0;
for (NSIndexPath * ip in [[self.hidableCellsDict allKeys] sortedArrayUsingSelector:@selector(compare:)])
{
BlockExecutor * executor = [self.hidableCellsDict objectForKey:ip];
if (ip.section == indexPath.section
&& ip.row < indexPath.row - rowDelta
&& !executor.block())
{
rowDelta++;
}
}
return [NSIndexPath indexPathForRow:indexPath.row-rowDelta inSection:indexPath.section];
}
ইউআইএসবিচ মান পরিবর্তন করার জন্য একটি আইবিএક્શન:
- (IBAction)birthdaySwitchChanged:(id)sender
{
NSIndexPath * indexPath = [self mapToNewIndexPath:[NSIndexPath indexPathForRow:1 inSection:1]];
if (self.birthdaySwitch.on)
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
else
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
কিছু ইউআইটিএবলভিটা ডেটা সোর্স এবং ইউআইটিএবল ভিউডেলিগেট পদ্ধতি:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
int numberOfRows = [super tableView:tableView numberOfRowsInSection:section];
for (NSIndexPath * indexPath in [self.hidableCellsDict allKeys])
if (indexPath.section == section)
{
BlockExecutor * executor = [self.hidableCellsDict objectForKey:indexPath];
numberOfRows -= (executor.block()?0:1);
}
return numberOfRows;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
indexPath = [self recoverIndexPath:indexPath];
return [super tableView:tableView cellForRowAtIndexPath:indexPath];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
indexPath = [self recoverIndexPath:indexPath];
return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}
- (void)viewDidLoad
{
[super viewDidLoad];
// initializing dictionary
self.hidableCellsDict = [NSMutableDictionary dictionary];
[self.hidableCellsDict setObject:[BlockExecutor executorWithBlock:^(){return self.birthdaySwitch.on;}] forKey:[NSIndexPath indexPathForRow:1 inSection:1]];
}
- (void)viewDidUnload
{
[self setBirthdaySwitch:nil];
[super viewDidUnload];
}
@end
দ্রুত উত্তর :
আপনার টেবিলভিউ নিয়ন্ত্রণকারীতে নিম্নলিখিত পদ্ধতিটি যুক্ত করুন:
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return indexPathOfCellYouWantToHide == indexPath ? 0 : super.tableView(tableView, heightForRowAtIndexPath: indexPath)
}
যদি টেবিলভিউ আপনি যে ঘরটি আড়াল করতে চান সেটিকে আঁকতে চেষ্টা করে, তবে এটি প্রদর্শিত হবে না কারণ উপরের পদ্ধতির জন্য এর উচ্চতা 0 পয়েন্টে সেট করা হবে, অন্য সমস্ত কিছুই অব্যবহৃত থাকে।
দয়া করে নোট করুন যে indexPathOfCellYouWantToHide
কোনও সময় পরিবর্তন করা যেতে পারে :)
> সুইফট ২.২ এ, আমি এখানে কয়েকটি উত্তর একত্রিত করেছি।
আপনার স্ট্যাটিকসেলের সাথে লিঙ্ক করতে স্টোরিবোর্ড থেকে একটি আউটলেট তৈরি করুন।
@IBOutlet weak var updateStaticCell: UITableViewCell!
override func viewDidLoad() {
...
updateStaticCell.hidden = true
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if indexPath.row == 0 {
return 0
} else {
return super.tableView(tableView, heightForRowAtIndexPath: indexPath)
}
}
আমি আমার প্রথম ঘরটি আড়াল করতে চাই তাই উপরে বর্ণিত হিসাবে আমি উচ্চতা 0 তে সেট করে রেখেছি।
সুইফট 4:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
var height = super.tableView(tableView, heightForRowAt: indexPath)
if (indexPath.row == HIDDENROW) {
height = 0.0
}
return height
}
সবচেয়ে সহজ দৃশ্যের জন্য আপনি যখন টেবিল দর্শনের একেবারে নীচে কক্ষগুলি আড়াল করেন, আপনি ঘরটি আড়াল করার পরে আপনি টেবিলভিউয়ের সামগ্রীটি সামঞ্জস্য করতে পারেন:
- (void)adjustBottomInsetForHiddenSections:(NSInteger)numberOfHiddenSections
{
CGFloat bottomInset = numberOfHiddenSections * 44.0; // or any other 'magic number
self.tableView.contentInset = UIEdgeInsetsMake(self.tableView.contentInset.top, self.tableView.contentInset.left, -bottomInset, self.tableView.contentInset.right);
}
Https://github.com/k06a/ABStaticTableViewController ব্যবহার করে এটি করার নতুন উপায়
NSIndexPath *ip = [NSIndexPath indexPathForRow:1 section:1];
[self deleteRowsAtIndexPaths:@[ip] withRowAnimation:UITableViewRowAnimationFade]
K06a ( https://github.com/k06a/ABStaticTableViewController ) এর সমাধান আরও ভাল কারণ এটি ঘরগুলির শিরোনাম এবং পাদচরণগুলি সহ পুরো বিভাগটি আড়াল করে, যেখানে এই সমাধান ( https://github.com/peterpaulis/StaticDataTableViewController ) ফুটার ব্যতীত সমস্ত কিছু আড়াল করে।
সম্পাদনা
যদি আপনি লুকান পাদচরণ করতে চান আমি শুধু সমাধান পাওয়া StaticDataTableViewController
। স্ট্যাটিক টেবিলভিউ কন্ট্রোলআরএম ফাইলটিতে আপনার এটি অনুলিপি করতে হবে:
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) {
return nil;
} else {
return [super tableView:tableView titleForFooterInSection:section];
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
CGFloat height = [super tableView:tableView heightForFooterInSection:section];
if (self.originalTable == nil) {
return height;
}
if (!self.hideSectionsWithHiddenRows) {
return height;
}
OriginalSection * os = self.originalTable.sections[section];
if ([os numberOfVissibleRows] == 0) {
//return 0;
return CGFLOAT_MIN;
} else {
return height;
}
//return 0;
return CGFLOAT_MIN;
}
অবশ্যই আপনি পারেন। প্রথমে আপনার টেবিলভিউতে ফিরে আসুন আপনি যে কক্ষগুলি প্রদর্শন করতে চান তারপরে super
আপনার স্টোরিবোর্ড থেকে নির্দিষ্ট ঘর অর্জনের জন্য কল করুন এবং এটি টেবিলভিউয়ের জন্য ফিরিয়ে দিন:
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.mode.numberOfCells()
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = super.tableView(tableView, cellForRowAtIndexPath: self.mode.indexPathForIndexPath(indexPath))
return cell
}
যদি আপনার কোষগুলিতে আলাদা হাইগট থাকে তবে এটিও ফিরিয়ে দিন:
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return super.tableView(tableView, heightForRowAtIndexPath: self.mode.indexPathForIndexPath(indexPath))
}
@ সালেহ মাসুম সমাধান ছাড়াও:
যদি আপনি স্বতঃ-লেআউট ত্রুটিগুলি পান তবে আপনি কেবলমাত্র সীমাবদ্ধতাগুলি সরাতে পারেনtableViewCell.contentView
সুইফট 3:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let tableViewCell = super.tableView(tableView, cellForRowAt: indexPath)
if tableViewCell.isHidden == true
{
tableViewCell.contentView.removeConstraints(tableViewCell.contentView.constraints)
return 0
}
else{
return super.tableView(tableView, heightForRowAt: indexPath)
}
}
এই সমাধানটি আপনার অ্যাপ্লিকেশনটির প্রবাহের উপর নির্ভর করে । আপনি যদি একই ভিউ কন্ট্রোলার উদাহরণে ঘরটি প্রদর্শন / আড়াল করতে চান তবে এটি সেরা পছন্দ নাও হতে পারে, কারণ এটি সীমাবদ্ধতাগুলি সরিয়ে দেয় ।
আমি কোনও হ্যাক ছাড়াই স্থিতিশীল ঘর এবং এমনকি বিভাগগুলি গতিশীলভাবে আড়াল করার আরও ভাল উপায় পেয়েছি।
সারি উচ্চতা 0 তে নির্ধারণ করা একটি সারিটি আড়াল করতে পারে তবে আপনি যদি একটি পুরো বিভাগটি গোপন করতে চান তবে এটি কাজ করে না যা এমনকি সমস্ত সারিগুলিকেও গোপন করে রাখে।
আমার পদ্ধতির স্ট্যাটিক সেলগুলির একটি বিভাগের অ্যারে তৈরি করা ray তারপরে সারণী প্রদর্শনের বিষয়বস্তুগুলি বিভাগের অ্যারে দ্বারা চালিত হবে।
এখানে কিছু নমুনা কোড রয়েছে:
var tableSections = [[UITableViewCell]]()
private func configTableSections() {
// seciton A
tableSections.append([self.cell1InSectionA, self.cell2InSectionA])
// section B
if shouldShowSectionB {
tableSections.append([self.cell1InSectionB, self.cell2InSectionB])
}
// section C
if shouldShowCell1InSectionC {
tableSections.append([self.cell1InSectionC, self.cell2InSectionC, self.cell3InSectionC])
} else {
tableSections.append([self.cell2InSectionC, self.cell3InSectionC])
}
}
func numberOfSections(in tableView: UITableView) -> Int {
return tableSections.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tableSections[section].count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return tableSections[indexPath.section][indexPath.row]
}
এইভাবে, আপনি সারি এবং বিভাগের সংখ্যা গণনা করতে বাজে কোড না লিখে আপনার সমস্ত কনফিগারেশন কোডটি একসাথে রাখতে পারেন। এবং অবশ্যই, না0
উচ্চতা নেই।
এই কোডটি খুব সহজ বজায় রাখাও হয়। উদাহরণস্বরূপ, আপনি আরও কক্ষ বা বিভাগগুলি যুক্ত / সরাতে চাইলে।
একইভাবে, আপনি আপনার বিভাগের শিরোনামগুলি গতিশীলভাবে কনফিগার করতে একটি বিভাগ শিরোনাম শিরোনাম অ্যারে এবং বিভাগ পাদচরণ শিরোনাম অ্যারে তৈরি করতে পারেন।