ইউআইটিএবলভিউতে কি একক ইউআইটিএবলভিউসেলকে রিফ্রেশ করা সম্ভব?


182

আমার এস UITableViewব্যবহার করে একটি প্রথা আছে UITableViewCell। প্রতিটিতে UITableViewCell2 টি বোতাম রয়েছে। এই বোতামগুলি ক্লিক করা একটি UIImageViewঘরের মধ্যে একটি চিত্র পরিবর্তন করবে ।

নতুন চিত্রটি প্রদর্শনের জন্য কি প্রতিটি ঘর আলাদাভাবে রিফ্রেশ করা সম্ভব? কোন সাহায্য প্রশংসা করা হয়।

উত্তর:


323

আপনার কক্ষের সূচকপথটি একবার এলে আপনি এমন কিছু করতে পারেন:

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

এক্সকোডে 4.6 এবং উচ্চতর:

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

অবশ্যই আপনার পছন্দসই অ্যানিমেশন প্রভাব হিসাবে সেট করতে পারেন।


4
এখানে নিটপিকিং, তবে অবশ্যই যদি আপনি কেবলমাত্র একটি একক কক্ষকে রিফ্রেশ করে থাকেন তবে আপনি সম্ভবত তার [NSArray arrayWithObject:]পরিবর্তে ব্যবহার করতে চান ।
লিও কাসারানী

57
এছাড়াও, এই পরিস্থিতিতে, beginUpdatesএবং endUpdatesঅপ্রয়োজনীয়।
কুবি

2
ওপি কোনও অ্যানিমেট করছে না, তাই আরম্ভ / সমাপ্তির তারিখগুলি বলার দরকার নেই
কুবি

2
যতদিন পদ্ধতি বলে না অবচিত গত প্রকাশ্য Xcode সংস্করণে, সব iOS সংস্করণ জরিমানা করা উচিত।
আলেজান্দ্রো ইভান

1
@ সুপেরেকনোবফ সত্য, তবে কোনও এক সময় এটি প্রতিস্থাপন করা যেতে পারে বা এর আচরণ পরিবর্তন করতে পারে। অবচয়কে তাত্ক্ষণিকভাবে পরিচালনা করা আরও ভাল
আলেজান্দ্রো ইভান

34

আমি কেবল কল করার চেষ্টা করেছি -[UITableView cellForRowAtIndexPath:], কিন্তু এটি কার্যকর হয়নি। তবে, উদাহরণস্বরূপ নীচেরগুলি আমার জন্য কাজ করে। আমি allocএবং জন্য আঁট মেমরি ব্যবস্থাপনা।releaseNSArray

- (void)reloadRow0Section0 {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
    [indexPaths release];
}

[সূচকপথগুলি প্রকাশের] এখানে কি প্রয়োজনীয়? আমি ভেবেছিলাম আপনার কেবলমাত্র এটির প্রয়োজন ছিল যদি আপনি নিজেরাই এই জিনিসটি বরাদ্দ করেন।
পাওয়ারj1984

4
তিনি সূচিপথগুলি অ্যারে বরাদ্দ করেছিলেন। তবে আরও ভাল প্রশ্ন তিনি কেন "টাইট মেমরি ম্যানেজমেন্ট" প্রয়োজনীয় বলে মনে করেন। অটোরলেজ এখানে পুরোপুরি ভাল কাজ করবে।
জন ক্রোমারটি

22

সুইফট:

func updateCell(path:Int){
    let indexPath = NSIndexPath(forRow: path, inSection: 1)

    tableView.beginUpdates()
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
    tableView.endUpdates()
}

কোথায় এই পদ্ধতি কল?
মাস্টার এজেন্টএক্স

18

reloadRowsAtIndexPaths:ঠিক আছে, তবে তবুও UITableViewDelegateপদ্ধতিগুলিকে আগুন লাগাতে বাধ্য করবে ।

সবচেয়ে সহজ পদ্ধতির আমি কল্পনা করতে পারি:

UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
[self configureCell:cell forIndexPath:indexPath];

মূল থ্রেডে আপনার প্রয়োগটি শুরু করা গুরুত্বপূর্ণconfigureCell: , কারণ এটি নন-ইউআই থ্রেডে কাজ করবে না (একই গল্পটি reloadData/ reloadRowsAtIndexPaths:)। কখনও কখনও এটি যুক্ত হতে সহায়ক হতে পারে:

dispatch_async(dispatch_get_main_queue(), ^
{
    [self configureCell:cell forIndexPath:indexPath];
});

বর্তমানে দৃশ্যমান দর্শনটির বাইরে যে কাজ করা হবে তা এড়াতেও এটি মূল্যবান:

BOOL cellIsVisible = [[self.tableView indexPathsForVisibleRows] indexOfObject:indexPath] != NSNotFound;
if (cellIsVisible)
{
    ....
}

আপনি ডেলিগেট ডেকে আসতে চান না কেন?
কর্নিক্স

এটি সর্বোত্তম পন্থা যেহেতু এটি সারণীদর্শনটিকে পুনরায় লোডরাউজঅ্যাটটাইজপ্যাথস: বা পুনরায়লোড ডেটা পদ্ধতির বিপরীতে শীর্ষে সমস্ত উপায়ে স্ক্রোল করতে বাধ্য করে না।
ZviBar 4'15

আমি এটি করেছিলাম এবং সেই
ট্র্যাভেলিং ম্যান

16

আপনি যদি কাস্টম টেবিলভিউসেলগুলি ব্যবহার করছেন তবে জেনেরিক

[self.tableView reloadData];    

আপনি বর্তমান দর্শনটি ছেড়ে না দিয়ে এবং ফিরে না আসা পর্যন্ত এই প্রশ্নের কার্যকর উত্তর দেয় না । উভয়ই প্রথম উত্তর দেয় না।

ভিউ স্যুইচিং ছাড়াই আপনার প্রথম টেবিল ভিউ সেলটি সাফল্যের সাথে পুনরায় লোড করতে নিম্নলিখিত কোডটি ব্যবহার করুন:

//For iOS 5 and later
- (void)reloadTopCell {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}

নিম্নলিখিত রিফ্রেশ পদ্ধতিটি প্রবেশ করান যা উপরের পদ্ধতিতে কল করে যাতে আপনি কেবলমাত্র শীর্ষ সেলটি কাস্টম করতে পারেন (বা আপনি চাইলে পুরো টেবিলের দৃশ্যটি):

- (void)refresh:(UIRefreshControl *)refreshControl {
    //call to the method which will perform the function
    [self reloadTopCell];

    //finish refreshing 
    [refreshControl endRefreshing];
}

এখন আপনি যেটি বাছাই করেছেন আপনার অভ্যন্তরের অভ্যন্তরে viewDidLoadনিম্নলিখিতটি যুক্ত করুন:

//refresh table view
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];

[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];

[self.tableView addSubview:refreshControl];

আপনার এখন একটি কাস্টম রিফ্রেশ সারণী বৈশিষ্ট্য রয়েছে যা শীর্ষ সেলটি পুনরায় লোড করবে। পুরো টেবিলটি পুনরায় লোড করতে, যুক্ত করুন

[self.tableView reloadData]; আপনার নতুন রিফ্রেশ পদ্ধতিতে।

আপনি যখন বার বার ভিউগুলিতে স্যুইচ করে ডেটাটি পুনরায় লোড করতে চান তবে এই পদ্ধতিটি প্রয়োগ করুন:

//ensure that it reloads the table view data when switching to this view
- (void) viewWillAppear:(BOOL)animated {
    [self.tableView reloadData];
}

6

সুইফট 3:

tableView.beginUpdates()
tableView.reloadRows(at: [indexPath], with: .automatic)
tableView.endUpdates()

4

কেবলমাত্র এই উত্তরগুলি আইওএস 6-তে নতুন আক্ষরিক সিনট্যাক্সের সাথে সামান্য আপডেট করার জন্য - আপনি একক বস্তুর জন্য পাথ = @ [সূচিপথ], বা একাধিক বস্তুর জন্য পাথ = @ [সূচিপথ 1, সূচকপথ 2, ...] ব্যবহার করতে পারেন।

ব্যক্তিগতভাবে, আমি অ্যারে এবং অভিধানগুলির জন্য প্রচুর উপকারী এবং বড় সময় সাভার হিসাবে আক্ষরিক সিনট্যাক্স পেয়েছি। এটি পড়ার জন্য এটি কেবল সহজ one এবং এটি যে কোনও মাল্টি-অবজেক্ট তালিকার শেষে শিলার প্রয়োজনীয়তা সরিয়ে দেয়, যা সর্বদা ব্যক্তিগত বাগবাবু। আমাদের সকলের সাথে আমাদের বায়ুচক্রগুলি ঝুঁকতে আছে, হ্যাঁ? ;-)

ভেবেছিলাম আমি এটিকে মিশ্রণে ফেলে দেব। আশা করি এটা সাহায্য করবে.


গ্রেগ বলুন, সেখানে আসলে সেই সিনট্যাক্সের একটি উদাহরণ আসলে কী? ধন্যবাদ!
ফ্যাটি

3

সুইফট 5 সহ এখানে একটি ইউআইটিএবলভিউ এক্সটেনশন:

import UIKit

extension UITableView
{    
    func updateRow(row: Int, section: Int = 0)
    {
        let indexPath = IndexPath(row: row, section: section)

        self.beginUpdates()
        self.reloadRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic)
        self.endUpdates()
    }

}

সাথে কল

self.tableView.updateRow(row: 1)

0

আমার আপগ্রেড সেল দরকার তবে আমি কীবোর্ডটি বন্ধ করতে চাই। যদি আমি ব্যবহার করি

let indexPath = NSIndexPath(forRow: path, inSection: 1)
tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
tableView.endUpdates()

কীবোর্ড অদৃশ্য হয়ে যায়

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