ইউআইটিএবলভিউ স্থিতিশীল কক্ষে সেট করা আছে। প্রোগ্রাম থেকে কোষের কিছু লুকানো সম্ভব?


132

UITableView স্থির কোষে সেট করুন।

প্রোগ্রাম থেকে কোষের কিছু লুকানো সম্ভব?

উত্তর:


48

আপনি এই সমাধানটির সন্ধান করছেন:

স্ট্যাটিকডেটাটাবল ভিউকন্ট্রোলার ২.০

https://github.com/xelvenone/StaticDataTableViewController

যা অ্যানিমেশন সহ বা ছাড়াই কোনও স্থির ঘর (গুলি) প্রদর্শন / আড়াল / পুনরায় লোড করতে পারে!

[self cell:self.outletToMyStaticCell1 setHidden:hide]; 
[self cell:self.outletToMyStaticCell2 setHidden:hide]; 
[self reloadDataAnimated:YES];

সর্বদা কেবলমাত্র ব্যবহারের জন্য দ্রষ্টব্য (রিলোডলোড ডেটা অ্যানিমেটেড: হ্যাঁ / না) (সরাসরি কল করুন না [সেল্ফ.ট্যাবলভিউ রিলোডলোডটি] সরাসরি)

এটি 0 এর উচ্চতা নির্ধারণের সাথে হ্যাকি সমাধানটি ব্যবহার করে না এবং আপনাকে পরিবর্তনটি সঞ্চারিত করতে এবং পুরো বিভাগগুলি গোপন করতে দেয়


6
সমাধানটির একটি সমস্যা হ'ল এটি গোপন কোষগুলি যেখানে ফাঁকা রেখেছিল leaves
জ্যাক

ফাঁক বলতে কী বোঝ? আপনি পরিস্থিতি আরও ভালভাবে বর্ণনা করতে পারেন, সরাসরি গিথুব-এ? আপনি কি নমুনা চালিয়েছেন?
পিটার লাপিসু

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

1
নমুনাটি পরীক্ষা করে দেখুন, আরও বড় আপডেট হয়েছে, সম্ভবত আপনার কিছু পুরানো কোড ছিল ... আমার জন্য নিখুঁত কাজ করে
পিটার লাপিসু

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

164

ইউআইটিবেলে স্থিতিশীল ঘরগুলি আড়াল করতে:

  1. এই পদ্ধতিটি যুক্ত করুন :

আপনার ইউআইটিএবলভিউ নিয়ন্ত্রক প্রতিনিধি শ্রেণিতে:

উদ্দেশ্য গ:

- (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 আমরা এর জন্য একটি আউটলেট তৈরি করে টার্গেট সেলটি সনাক্ত করি:

  1. ডিজাইনারে, আপনি যে কক্ষটি গোপন করতে চান সেগুলির জন্য একটি আউটলেট তৈরি করুন। এই জাতীয় একটি কক্ষের আউটলেটটিকে উপরে বলা হয় "সেল ইউওয়ানওয়ানটোহাইড"।
  2. আপনি যে কক্ষগুলি গোপন করতে চান সেগুলির জন্য আইবিতে "ক্লিপ সাবভিউ" পরীক্ষা করুন। আপনি যে কক্ষগুলি গোপন করছেন সেগুলির ক্লিপটোবাউন্ডস = হ্যাঁ হওয়া দরকার। অন্যথায় পাঠ্যটি ইউআইটিএবলভিউতে পাইল করা হবে।

10
সুন্দর সমাধান। ClipToBoundsসমস্যাটি এড়াতে , আপনি ঘরটি গোপনেও সেট করতে পারেন। এটি আমার কাছে আরও পরিষ্কার মনে হবে। ;-)
MonsieurDart

13
ক্লিপটোবাউন্ডের জন্য +1 = হ্যাঁ। অন্যান্য থ্রেডে সংখ্যাসমূহের সমাধানগুলি এটি মিস করেছে।
জেফ

2
ভালো বুদ্ধি. এটি আমি খুঁজে পাওয়া সবচেয়ে সহজ সমাধান। অন্যান্য সমাধানগুলির দুটি বা ততোধিক স্থানে কোড ছিল। বিটিডাব্লু, আইবিতে, ক্লিপটোবাউন্ডগুলি "ক্লিপ সাবভিউ" হিসাবে তালিকাভুক্ত।
ভ্যাপারওয়ারওয়াল্ফ

1
কিছুটা সংশোধন করে, এই .सेल ইউটওয়ান্টটোহাইডের পরিবর্তে স্ব। সেল ইউওয়ান্টটোহাইড ব্যবহার করুন ।
জোল্টন ভিনকলার

2
সেল অবজেক্ট তৈরি না করে আমরা "ইউটিবেলভিউসেল" লুকানোর জন্য "index.row" ব্যবহার করতে পারি
g212gs

38

সর্বোত্তম উপায় নীচের ব্লগে বর্ণিত হয়েছে 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
আপনার অবশ্যই লক্ষ্য করা উচিত যে আপনার স্থিতিশীল কক্ষের সামগ্রীর মধ্যে কোনও ইউআইভিউ-র যদি সেল কন্টেন্টের প্রতি কোনও বাধা থাকে তবে আপনি যদি একটি নতুন টাইমের উচ্চতার জন্য সীমাবদ্ধতাগুলি অবৈধ হয়ে যান তবে আপনি রানটাইম ত্রুটি পেতে পারেন।
পেড্রো বোর্জেস

1
সর্বোত্তম উত্তর. ধন্যবাদ।
এরিক চেন

1
আমি জানি এই কৌশলটি গতিশীল সামগ্রী সহ কাজ করেছে। স্থির সঙ্গে খুব সুন্দর কাজ করে। খুব সহজ।
পিঁপড়াগুলি

2
এটি সত্যিই কাজ করে তবে একটি অনুপস্থিত পয়েন্টটি coverাকতে: যদি সারিটি লুকিয়ে রাখতে / দেখানো হয় তবে একটি তারিখ বাছাই করে কেবল [স্ব.ট্যাটিভিউ শুরুউদ্দীপক]; [স্ব-টেবিলভিউ শেষ আপডেটগুলি]; এটি লুকিয়ে রাখার পরেও একটি ত্রুটি ছেড়ে দেবে। সমস্যাটি দূর করার জন্য, আপনাকে কল করতে হবে [স্বতঃ টেবিলভিউ পুনরায় লোড করুন RowAtIndexPaths: @ [সূচিপথঅফটারেজ র]] রআউনিমেশন সহ: UITableViewRowAnimationNone]; এছাড়াও লক্ষ করুন যে সারি অ্যানিমেশনটি এখানে কোনওভাবে "অক্ষম" রয়েছে।
ক্রিস

34

আমার সমাধান গ্যারেথের মতো একই দিকে চলে যায়, যদিও আমি কিছু জিনিস আলাদাভাবে করি।

এখানে যায়:

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];
}

2
দোয়া করুন, মিষ্টি মিষ্টি মানুষ।
গুপ্ত্রন

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

আমার সমস্যাটি হ'ল স্থির কক্ষগুলির সাথে numberOfRowsInSection:কেবল তখনই বলা হয় যখন টেবিলটি প্রথমবার লোড হয়। আমি যখন [সেল্ফ.ট্যাবলভিউ রিলোডলোড ডেটা] কল করি - numberOfRowsInSection:কখনই আর কল হয় না। শুধুমাত্র cellForRowAtIndexPath:বলা হয়। আমি কী মিস করছি?
রোমান

13
  1. ডিজাইনারে, আপনি যে কক্ষটি গোপন করতে চান সেগুলির জন্য একটি আউটলেট তৈরি করুন। উদাহরণস্বরূপ আপনি 'সেলঅোন' লুকিয়ে রাখতে চান, সুতরাং ভিডিডিডোডে () এটি করুন

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)
        }

}

এখন পর্যন্ত সেরা সমাধান!
derdida

পরিবর্তনগুলি করার পরে টেবিলভিউ.রেলোডডেটা () যুক্ত করুন এবং এটি নিখুঁত। সমাধান পরিবর্তনের জন্য অনেক প্রচেষ্টা বাঁচিয়েছি! ধন্যবাদ
শায়ান সি

1
সুইফট 4 আমাকে ব্যবহার করতে দেয় না let tableViewCell = super.tableView(tableView,cellForRowAtIndexPath: indexPath)। আমি ধরে নিলাম এটি প্রতিস্থাপন করেছে let tableViewCell = tableView.cellForRow(at: indexPath as IndexPath)
ক্লিফ্টন ল্যাব্রাম

যেহেতু আমি একটিতে স্ট্যাটিক সেল ব্যবহার করছি UITableViewController, আমার কোনও UITableViewপ্রতিনিধি পদ্ধতি নেই। এটি কল করার জন্য heightForRow, আমারও কি অন্য কোনও পদ্ধতি থাকা দরকার?
ক্লিফটন ল্যাব্রাম

ক্লিফটনল্যাব্রাম নং, আপনি কেবল এই পদ্ধতিটিকে ওভাররাইড করতে পারেন।
আলেকজান্ডার এরশভ

11

আমি এমন একটি বিকল্প নিয়ে এসেছি যা প্রকৃতপক্ষে বিভাগগুলি গোপন করে এবং সেগুলি মুছে দেয় না। আমি @ হেনিং 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 টি আড়াল করতে চাই না কারণ সীমানাটি সঠিকভাবে আঁকতে পারে না।


1
আমি সম্ভবত পরিবর্তে NSMutableSetজন্য ব্যবহার করতে hiddenSectionsহবে। আপনি বেশিরভাগ সদস্যতার জন্য পরীক্ষা করছেন বলে এটি অনেক দ্রুত।
পিক্সেলফ্রেইক

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

10

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

ডেমো প্রকল্প

ডেমো প্রকল্পের ভিডিও

সারকথা:

  1. Use tableView:heightForRowAtIndexPath: কিছু রাজ্যের ভিত্তিতে গতিশীল কক্ষের উচ্চতা নির্দিষ্ট করতে to
  2. যখন রাষ্ট্র কল করে অ্যানিমেট সেলগুলি দেখিয়ে / লুকিয়ে রাখে tableView.beginUpdates();tableView.endUpdates()
  3. tableView.cellForRowAtIndexPath:ভিতরে ডাকবে না tableView:heightForRowAtIndexPath:। কক্ষগুলি পৃথক করতে ক্যাশেড সূচকপথগুলি ব্যবহার করুন।
  4. কোষগুলি গোপন করবেন না। পরিবর্তে এক্সকোডে "ক্লিপ সাবভিউ" সম্পত্তি সেট করুন।
  5. একটি দুর্দান্ত লুকানোর অ্যানিমেশনটি পেতে কাস্টম সেলগুলি (সমতল ইত্যাদি নয়) ব্যবহার করুন। এছাড়াও, ঘরের উচ্চতা == 0 হলে কেসটির জন্য অটো লেআউটটি সঠিকভাবে পরিচালনা করুন।

আমার ব্লগে আরও তথ্য (রাশিয়ান ভাষা)


1
এই পয়েন্টটি আমার জন্য গুরুত্বপূর্ণ ছিল: "ঘরগুলি গোপন করবেন না instead পরিবর্তে এক্সকোডে" ক্লিপ সাবভিউ "সম্পত্তি সেট করুন" "
বালকথ

8

হ্যাঁ, এটি অবশ্যই সম্ভব, যদিও আমি এই মুহূর্তে একই সমস্যা নিয়ে লড়াই করছি। আমি ঘরগুলি আড়াল করতে সক্ষম হয়েছি এবং সবকিছু ঠিকঠাক কাজ করে তবে আমি বর্তমানে জিনিসটি খুব সুন্দরভাবে অ্যানিমেট করতে পারি না। আমি যা পেয়েছি তা এখানে:

আমি প্রথম বিভাগের প্রথম সারিতে একটি অন / অফ স্যুইচের অবস্থার ভিত্তিতে সারিগুলি গোপন করছি। যদি স্যুইচটি চালু থাকে তবে তার নীচে একই বিভাগে 1 টি সারি রয়েছে, অন্যথায় 2 টি পৃথক সারি রয়েছে।

স্যুইচটি টগল করা অবস্থায় আমার একটি নির্বাচক ডেকেছিল এবং আমি কোন অবস্থায় আছি তা নির্দেশ করার জন্য আমি একটি পরিবর্তনশীল সেট করেছি Then

[[self tableView] reloadData];

আমি টেবিলটি ওভাররাইড করব: উইল ডিসপ্লেকেল: ফরঅ্যান্ড ইন্ডেক্সপথ: ফাংশন এবং যদি ঘরটি গোপন করার কথা মনে হয় তবে আমি এটি করি:

[cell setHidden:YES];

এটি ঘর এবং এর সামগ্রীগুলি গোপন করে, তবে এটি যে স্থান দখল করে তা সরিয়ে দেয় না।

স্থানটি সরাতে, টেবিলটি ওভাররাইড করুন দেখুন: উচ্চতার জন্যরোআউটআইডেক্সপথ: ফাংশন করুন এবং লুকানো থাকা সারিগুলির জন্য 0 প্রদান করুন return

আপনাকে টেবিলভিউ ওভাররাইড করতে হবে: সংখ্যাআফ্রাউজআইনসেকশন: এবং এই বিভাগে সারিগুলির সংখ্যাটি ফিরিয়ে দিন। আপনাকে এখানে অদ্ভুত কিছু করতে হবে যাতে আপনার টেবিলটি একটি শ্রেণিবদ্ধ শৈলী হলে গোলাকার কোণগুলি সঠিক কোষে ঘটে। আমার স্ট্যাটিক টেবিলটিতে বিভাগটির জন্য পূর্ণাঙ্গ কক্ষ রয়েছে, সুতরাং বিকল্পটি সম্বলিত প্রথম কক্ষ রয়েছে, তারপরে ওএন রাষ্ট্রীয় বিকল্পগুলির জন্য 1 টি সেল এবং অফ স্টেট বিকল্পগুলির জন্য আরও 2 টি কোষ, মোট 4 কোষ রয়েছে। যখন বিকল্পটি চালু থাকে, আমাকে 4 ফিরতে হবে, এতে লুকানো বিকল্প অন্তর্ভুক্ত রয়েছে যাতে প্রদর্শিত শেষ বিকল্পটির একটি গোলাকার বাক্স থাকে। যখন বিকল্পটি বন্ধ থাকে, শেষ দুটি বিকল্প প্রদর্শিত হয় না তাই আমি ফিরে আসি 2 all এগুলি সব ক্লিঙ্ক অনুভব করে। দুঃখিত যদি এটি খুব স্পষ্ট না হয় তবে এটি বর্ণনা করা কঠিন। কেবল সেটআপটি চিত্রিত করার জন্য, এটি আইবিতে টেবিল বিভাগটি নির্মাণ:

  • সারি 0: অন / অফ স্যুইচ সহ বিকল্প
  • সারি 1: বিকল্প চালু থাকা অবস্থায় প্রদর্শিত হবে
  • সারি 2: বিকল্পটি বন্ধ থাকা অবস্থায় প্রদর্শিত হবে ed
  • সারি 3: বিকল্পটি বন্ধ থাকলে প্রদর্শিত হবে

সুতরাং যখন টেবিলটি অপশনটি থাকে তখন দুটি সারি রিপোর্ট করে যা:

  • সারি 0: অন / অফ স্যুইচ সহ বিকল্প
  • সারি 1: বিকল্প চালু থাকা অবস্থায় প্রদর্শিত হবে

যখন বিকল্পটি সারণীটি বন্ধ থাকে তখন চারটি সারি রিপোর্ট করে যা:

  • সারি 0: অন / অফ স্যুইচ সহ বিকল্প
  • সারি 1: বিকল্প চালু থাকা অবস্থায় প্রদর্শিত হবে
  • সারি 2: বিকল্পটি বন্ধ থাকা অবস্থায় প্রদর্শিত হবে ed
  • সারি 3: বিকল্পটি বন্ধ থাকলে প্রদর্শিত হবে

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

  • টেবিলকে সারণির সংখ্যাটি অন্তর্নিহিত ডেটাতে সম্ভবত অন্তর্ভুক্ত থাকা সংখ্যার চেয়ে আলাদা বলে মনে করা ভুল বলে মনে হয়।

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

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


আমি নিশ্চিত [[self tableView] reloadData];যে ঘরগুলি আড়াল করার পরে আপনার আরও একবার কল করা উচিত
শিমিডট

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

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

1
স্থির কক্ষগুলি কীভাবে আড়াল করা / প্রদর্শন করা যায় তা আমি সমাধান পেয়েছি। শুধু কল return [super tableView:tableView cellForRowAtIndexPath:indexPath];মধ্যে UITableViewControllerস্ট্যাটিক কোষ তৈরি করার জন্য উপশ্রেণী। সূচী পথগুলি স্থির
সূচকযুক্ত

8

জাস্টার উত্তর অনুসারে, তবে সুইফট 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)
}

1
tableView.reloadRows(at:, with:)সারিটি ইতিমধ্যে দৃশ্যমান অবস্থায় আপনি যদি উচ্চতা পরিবর্তন করেন তবে আপনার ঘরগুলি আপডেট করার জন্য একটি দরকার হতে পারে ।
ফ্রস্ট-লি

5

ঠিক আছে, কিছু চেষ্টা করার পরে, আমার একটি সাধারণ সাধারণ উত্তর নেই। এই ঘরটি লুকিয়ে রাখা উচিত কিনা তা পরীক্ষা করার জন্য আমি "isHmitted" বা "লুকানো" ভেরিয়েবল ব্যবহার করছি।

  1. আপনার ভিউ কন্ট্রোলারে একটি আইবিআউটলেট তৈরি করুন। @IBOutlet weak var myCell: UITableViewCell!

  2. myCellআপনার কাস্টম ফাংশনটিতে আপডেট করুন , উদাহরণস্বরূপ আপনি এটি ভিডডিলডে যুক্ত করতে পারেন:

override func viewDidLoad() { super.viewDidLoad() self.myCell.isHidden = true }

  1. আপনার প্রতিনিধি পদ্ধতিতে:

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) }

এটি ডেলিগেট পদ্ধতিতে আপনার যুক্তি হ্রাস করবে এবং আপনাকে কেবল আপনার ব্যবসায়ের প্রয়োজনীয়তার দিকে মনোনিবেশ করতে হবে।


4

উপরের উত্তরগুলি যে কক্ষগুলি লুকিয়ে / দেখায়, সারি হাইট পরিবর্তন করে, বা অটো লেআউটের সীমাবদ্ধতার সাথে জগাখিচুড়ি অটো লেআউট সমস্যার কারণে আমার পক্ষে কাজ করে না। কোডটি অসহনীয় হয়ে উঠল।

একটি সাধারণ স্ট্যাটিক টেবিলের জন্য, আমার পক্ষে সবচেয়ে ভাল কাজ করাটি হ'ল:

  1. স্ট্যাটিক টেবিলের প্রতিটি কক্ষের জন্য একটি আউটলেট তৈরি করুন
  2. কেবল সেলগুলির আউটলেটগুলি দেখানোর জন্য একটি অ্যারে তৈরি করুন
  3. অ্যারে থেকে ঘরটি ফিরে আসার জন্য সেলফোরআরএন্ডআইডেক্সপথকে ওভাররাইড করুন
  4. অ্যারের গণনা ফিরিয়ে আনার জন্য নম্বরটি ওভাররাইডআইনসেকশন
  5. সেই অ্যারেতে কী কী কোষ থাকা দরকার তা নির্ধারণ করার জন্য একটি পদ্ধতি প্রয়োগ করুন এবং যখনই প্রয়োজন হবে সেই পদ্ধতিটি কল করুন এবং তারপরে পুনরায় লোড করুন।

আমার টেবিল ভিউ কন্ট্রোলারের একটি উদাহরণ এখানে রয়েছে:

@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
}

এটি দুর্দান্ত কাজ করেছে, এমনকি 5 বছর পরে! তোমাকে অনেক ধন্যবাদ.
শ্রোকওয়েল

2020 এবং এটি এর সর্বাধিক সমাধান। কোন হ্যাক প্রয়োজন।
এমডোনাটি

3

সাধারণ আইওএস 11 এবং আইবি / স্টোরিবোর্ডের সামঞ্জস্যপূর্ণ পদ্ধতি

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

মূল ধারণাটি কোনও লুকানো সারিগুলির জন্য সারি উচ্চতা 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)

অ্যাপল /performBatchUpdatesbeginUpdatesendUpdates যখনই সম্ভব সুপারিশ করে


1

আমি স্ট্যাটিক টেবিলের মধ্যে গোপন কক্ষগুলি সঞ্চার করার জন্য একটি সমাধান পেয়েছি।

// 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

1

দ্রুত উত্তর :

আপনার টেবিলভিউ নিয়ন্ত্রণকারীতে নিম্নলিখিত পদ্ধতিটি যুক্ত করুন:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return indexPathOfCellYouWantToHide == indexPath ? 0 : super.tableView(tableView, heightForRowAtIndexPath: indexPath)
}

যদি টেবিলভিউ আপনি যে ঘরটি আড়াল করতে চান সেটিকে আঁকতে চেষ্টা করে, তবে এটি প্রদর্শিত হবে না কারণ উপরের পদ্ধতির জন্য এর উচ্চতা 0 পয়েন্টে সেট করা হবে, অন্য সমস্ত কিছুই অব্যবহৃত থাকে।

দয়া করে নোট করুন যে indexPathOfCellYouWantToHideকোনও সময় পরিবর্তন করা যেতে পারে :)


1

> সুইফট ২.২ এ, আমি এখানে কয়েকটি উত্তর একত্রিত করেছি।

আপনার স্ট্যাটিকসেলের সাথে লিঙ্ক করতে স্টোরিবোর্ড থেকে একটি আউটলেট তৈরি করুন।

@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 তে সেট করে রেখেছি।


1

সুইফট 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
}

0

সবচেয়ে সহজ দৃশ্যের জন্য আপনি যখন টেবিল দর্শনের একেবারে নীচে কক্ষগুলি আড়াল করেন, আপনি ঘরটি আড়াল করার পরে আপনি টেবিলভিউয়ের সামগ্রীটি সামঞ্জস্য করতে পারেন:

- (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);
}


0

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;
}

0

অবশ্যই আপনি পারেন। প্রথমে আপনার টেবিলভিউতে ফিরে আসুন আপনি যে কক্ষগুলি প্রদর্শন করতে চান তারপরে 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))
}

0

@ সালেহ মাসুম সমাধান ছাড়াও:

যদি আপনি স্বতঃ-লেআউট ত্রুটিগুলি পান তবে আপনি কেবলমাত্র সীমাবদ্ধতাগুলি সরাতে পারেন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

আমি কোনও হ্যাক ছাড়াই স্থিতিশীল ঘর এবং এমনকি বিভাগগুলি গতিশীলভাবে আড়াল করার আরও ভাল উপায় পেয়েছি।

সারি উচ্চতা 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 উচ্চতা নেই।

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

একইভাবে, আপনি আপনার বিভাগের শিরোনামগুলি গতিশীলভাবে কনফিগার করতে একটি বিভাগ শিরোনাম শিরোনাম অ্যারে এবং বিভাগ পাদচরণ শিরোনাম অ্যারে তৈরি করতে পারেন।

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