UITableView: بنیادی باتیں، iOS ایپس میں فہرستیں اور سیلز

مصنف: IT Sectr اشاعت: 2026-02-23 مطالعے کا وقت: 9 منٹ

UITableView — iOS میں عمودی فہرستیں دکھانے کے لیے UIKit کا مرکزی جزو ہے۔ جدول کی ہر قطار ایک UITableViewCell ہے جس میں پہلے سے طے شدہ اسٹائل ہوتے ہیں۔ ہم UITableView کی بنیادی باتیں بیان کرتے ہیں: DataSource، ڈیلیگیٹ، سیل کا دوبارہ استعمال اور iOS ایپس میں جدول کی کارکردگی۔ Apple (Human Interface Guidelines، 2026) کے مطابق، UITableView iOS میں سب سے زیادہ استعمال ہونے والا UI جزو ہے — App Store ٹاپ 100 میں 85% ایپس میں کم از کم ایک جدول ہوتا ہے۔ پیچیدہ لے آؤٹ کے لیے، UICollectionView کے بارے میں مضمون پڑھیں۔

اہم نکات

  • UITableView — عمودی فہرستوں کے لیے UIKit جزو، iOS 2.0 (iPhone OS 2) سے دستیاب۔
  • UITableViewCell — چار بلٹ ان اسٹائل اور تخصیص کے اختیارات والا جدول سیل۔
  • UITableViewDataSource — پروٹوکول جو ہر سیکشن کے لیے قطاروں اور سیلز کی تعداد متعین کرتا ہے۔
  • UITableViewDelegate — انتخاب، ترمیم اور قطار کی اونچائی کی تشکیل کے لیے پروٹوکول۔
  • UITableViewDiffableDataSource — خودکار تبدیلی حساب کے ساتھ جدید DataSource (iOS 13+)۔

iOS میں UITableView کیا ہے؟

UITableView UIKit فریم ورک کی ایک کلاس ہے جو ایک کالم میں قطاروں کی اسکرول ایبل فہرست دکھانے کے لیے ڈیزائن کی گئی ہے۔ ہر قطار ایک UITableViewCell آبجیکٹ سے ظاہر ہوتی ہے۔ UITableView پہلی بار iPhone OS 2 (2008) میں ظاہر ہوا اور اس کے بعد سے iOS میں فہرستوں کا مرکزی جزو رہا۔ UITableView کا فن تعمیر MVC پیٹرن پر مبنی ہے: ڈیٹا DataSource کے ذریعے، ظاہری شکل اور رویہ Delegate کے ذریعے، اور پیشکش خود جدول کے ذریعے منظم کی جاتی ہے۔

دو جدول اسٹائل: .plain (اختیاری سیکشنز کے ساتھ مسلسل فہرست) اور .grouped (گول کونوں اور مارجن کے ساتھ گروپ شدہ سیکشنز)۔ iOS 13 نے .insetGrouped شامل کیا — کناروں پر مارجن والا گروپڈ اسٹائل، جو سیٹنگز اور ہیلتھ ایپس میں استعمال ہوتا ہے۔ اسٹائل کا انتخاب ڈیفالٹ ظاہری شکل کو متاثر کرتا ہے: plain جدولیں اسکرول کرتے وقت سیکشن ہیڈر کو اوپر چپکا دیتی ہیں (چپکنے والا ہیڈر) جبکہ grouped ایسا نہیں کرتیں۔

سیلف سائزنگ سیلز

iOS 8 سے شروع کرتے ہوئے، UITableView سیلف سائزنگ سیلز کو سپورٹ کرتا ہے۔ فعال کرنے کے لیے، tableView.estimatedRowHeight (مثلاً 80) اور tableView.rowHeight = UITableView.automaticDimension سیٹ کریں۔ جدول سیل کے اندر Auto Layout کنسٹرینٹس کی بنیاد پر خود بخود قطار کی اونچائی کا حساب لگاتا ہے۔ سیلف سائزنگ پیچیدہ سیلز کے لیے کارکردگی کم کرتی ہے — 500+ آئٹمز والے جدولوں کے لیے فکسڈ اونچائی (rowHeight) استعمال کریں۔

UITableViewCell اسٹائل: Basic، Subtitle، Value1، Value2

UITableViewCell چار بلٹ ان اسٹائل فراہم کرتا ہے جو کسٹم سیل بنائے بغیر 80% منظرناموں کو کور کرتے ہیں۔ ہر اسٹائل textLabel، detailTextLabel اور imageView کے امتزاج پر مشتمل ہوتا ہے۔ اسٹائل init(style:reuseIdentifier:) کے ذریعے سیل کو انیشیالائز کرتے وقت منتخب کیا جاتا ہے۔

اسٹائلtextLabeldetailTextLabelimageViewمثال
.default (.basic)بائیں، بولڈکوئی نہیںاختیاریمینو، آئٹمز کی فہرست
.subtitleبائیں، بولڈtextLabel کے نیچے، سرمئیاختیاریرابطے، پلے لسٹ
.value1بائیں، بولڈدائیں، سرمئیکوئی نہیںاقدار کے ساتھ سیٹنگز
.value2دائیں، نیلابائیں، سرمئیکوئی نہیںفون بک (iOS 6 اسٹائل)
swift
// کسٹم سیلز کے ساتھ جدول بنانا
class ContactListController: UIViewController {

    private let tableView = UITableView(frame: .zero, style: .insetGrouped)

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        tableView.dataSource = self
        tableView.delegate = self
        tableView.rowHeight = 60
        view.addSubview(tableView)

        // Auto Layout
        tableView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            tableView.topAnchor.constraint(equalTo: view.topAnchor),
            tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
        ])
    }
}

extension ContactListController: UITableViewDataSource {

    func tableView(_ tableView: UITableView,
                         numberOfRowsInSection section: Int) -> Int {
        contacts.count
    }

    func tableView(_ tableView: UITableView,
                         cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let contact = contacts[indexPath.row]

        var content = cell.defaultContentConfiguration()
        content.text = contact.name
        content.secondaryText = contact.phone
        content.image = UIImage(systemName: "person.circle")
        cell.contentConfiguration = content

        return cell
    }
}

UIContentConfiguration (iOS 14+) — textLabel/detailTextLabel تک براہ راست رسائی کے بجائے contentConfiguration کے ذریعے سیل کنفیگر کرنے کا جدید طریقہ۔ cell.defaultContentConfiguration() استعمال کریں یا کسٹم UIContentConfiguration بنائیں۔ فوائد: Dynamic Type، ڈارک موڈ اور VoiceOver کے لیے بلٹ ان سپورٹ۔ Apple (WWDC 2024) تمام نئے UITableView کے لیے contentConfiguration کی سفارش کرتا ہے۔

DataSource اور Delegate: لازمی طریقے

UITableViewDataSource — پروٹوکول جو جدول کو ڈیٹا فراہم کرتا ہے۔ لازمی طریقے: tableView(_:numberOfRowsInSection:) اور tableView(_:cellForRowAt:)۔ ان کے بغیر، جدول ایک بھی قطار نہیں دکھا سکتا۔ UITableViewDelegate — ظاہری شکل اور رویہ منظم کرنے کے لیے پروٹوکول: قطار کی اونچائی، انتخاب، ترمیم، سیاق و سباق کے اقدامات۔

swift
// متعدد سیکشنز اور ترمیم کے ساتھ مثال
extension ContactListController: UITableViewDelegate {

    // ہر قطار کے لیے کسٹم اونچائی
    func tableView(_ tableView: UITableView,
                         heightForRowAt indexPath: IndexPath) -> CGFloat {
        80
    }

    // انتخاب کی ہینڈلنگ
    func tableView(_ tableView: UITableView,
                         didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        let contact = contacts[indexPath.row]
        showDetail(for: contact)
    }

    // Swipe-to-delete
    func tableView(_ tableView: UITableView,
                         trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath)
        -> UISwipeActionsConfiguration? {
        let deleteAction = UIContextualAction(style: .destructive, title: "حذف کریں") {
            [weak self] _, _, completion in
            self?.contacts.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .automatic)
            completion(true)
        }
        return UISwipeActionsConfiguration(actions: [deleteAction])
    }
}

ڈیلیگیٹ کارکردگی: سائز کے طریقے (heightForRowAt) ہر اسکرول پر دکھائی دینے والی ہر قطار کے لیے بلائے جاتے ہیں۔ یکساں اونچائی کے لیے، براہ راست rowHeight سیٹ کریں — یہ heightForRowAt سے 10 گنا تیز ہے۔ سیلف سائزنگ سیلز کے لیے، estimatedRowHeight اور automaticDimension سیٹ کریں — جدول صرف دکھائی دینے والی قطاروں کے لیے heightForRowAt بلاتا ہے اور بقیہ کے لیے estimatedRowHeight استعمال کرتا ہے۔

سیل کا دوبارہ استعمال: دوبارہ استعمال قطار اور رجسٹریشن

دوبارہ استعمال قطار — دوبارہ استعمال کے قابل UITableView سیلز کا ایک پول۔ جب کوئی سیل اسکرین سے باہر اسکرول ہوتا ہے، تو وہ حذف نہیں ہوتا بلکہ قطار میں ڈال دیا جاتا ہے۔ نئے سیل شروع سے نہیں بنائے جاتے — سسٹم dequeueReusableCell(withIdentifier:for:) کو کال کرتا ہے، جو قطار سے ایک سیل واپس کرتا ہے یا قطار خالی ہونے پر نیا بنا دیتا ہے۔ یہ UITableView کا بنیادی کارکردگی طریقہ کار ہے۔

swift
// کیشنگ کے ساتھ کسٹم سیل
class ContactCell: UITableViewCell {

    private let avatarView = UIImageView()
    private let nameLabel = UILabel()
    private let subtitleLabel = UILabel()

    override init(style: UITableViewCell.Style, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setupViews()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func setupViews() {
        contentView.addSubview(avatarView)
        contentView.addSubview(nameLabel)
        contentView.addSubview(subtitleLabel)

        // Auto Layout کنسٹرینٹس کو ترتیب دینا
        avatarView.translatesAutoresizingMaskIntoConstraints = false
        // ... constraints ...
    }

    func configure(with contact: Contact) {
        nameLabel.text = contact.name
        subtitleLabel.text = contact.phone
        // اوتار کی غیر متزامن لوڈنگ
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        avatarView.image = nil
        nameLabel.text = nil
        subtitleLabel.text = nil
    }
}

// رجسٹریشن اور استعمال
tableView.register(ContactCell.self, forCellReuseIdentifier: "contactCell")

// cellForRowAt میں:
let cell = tableView.dequeueReusableCell(withIdentifier: "contactCell", for: indexPath) as! ContactCell
cell.configure(with: contacts[indexPath.row])
return cell

prepareForReuse() — ایک طریقہ جو سیل کو دوبارہ استعمال قطار میں ڈالنے سے پہلے بلایا جاتا ہے۔ تمام سیل حالت کو دوبارہ سیٹ کریں: متن، تصاویر، اینیمیشنز، لوڈنگ آپریشنز۔ prepareForReuse کے بغیر، دوبارہ استعمال کیا گیا سیل پرانا ڈیٹا دکھا سکتا ہے: نئی تصویر لوڈ ہونے تک پچھلی تصویر ایک سیکنڈ کے کچھ حصے کے لیے دکھائی دے گی۔ Apple (WWDC 2023) prepareForReuse میں URLSessionTask.cancel() کے ذریعے غیر متزامن آپریشنز منسوخ کرنے کی سفارش کرتا ہے۔

سیکشنز، ہیڈر اور فوٹر: ڈیٹا گروپنگ

سیکشنز UITableView میں منطقی طور پر متعلقہ قطاروں کو گروپ کرتے ہیں۔ ہر سیکشن میں ہیڈر اور فوٹر ہو سکتا ہے۔ سیکشنز کی تعداد numberOfSections(in:) طریقہ سے متعین کی جاتی ہے (ڈیفالٹ 1 ہے)۔ grouped اور insetGrouped اسٹائلز کے لیے، سیکشنز مارجن اور گول کونوں سے بصری طور پر الگ ہوتے ہیں۔

DataSource طریقہوضاحتواپسی کی قدر
numberOfSectionsسیکشنز کی تعداد (ڈیفالٹ 1)Int
numberOfRowsInSectionسیکشن میں قطاروں کی تعدادInt
titleForHeaderInSectionسیکشن ہیڈر کا عنوان متنString?
titleForFooterInSectionسیکشن فوٹر کا عنوان متنString?
viewForHeaderInSectionہیڈر کے لیے کسٹم ویوUIView?
heightForHeaderInSectionہیڈر کی اونچائیCGFloat

انڈیکسنگ: سیکشنز کے درمیان فوری نیویگیشن کے لیے، ایک انڈیکس عنوان شامل کریں — دائیں طرف دکھائی جانے والی سٹرنگز کی ایک صف۔ sectionIndexTitles(for:) کو لاگو کریں — ہر سیکشن کے پہلے حروف کی ایک صف واپس کرتا ہے۔ 26+ سیکشنز کے لیے، یہ صارف کے تجربے کو نمایاں طور پر بہتر بناتا ہے۔ iOS 15+ میں، جدولیں sectionHeaderTopPadding کو سپورٹ کرتی ہیں — اسٹیٹس بار اور پہلے ہیڈر کے درمیان پیڈنگ، جسے گھنے لے آؤٹ کے لیے 0 پر دوبارہ سیٹ کیا جا سکتا ہے۔

UITableView کارکردگی: بہترین طریقے

کارکردگی لمبی فہرستوں والی ایپس کے لیے UITableView کی کارکردگی اہم ہے۔ عام مسائل: cellForRowAt میں بھاری کاموں کی وجہ سے سست اسکرولنگ (jank)، بار بار heightForRowAt کالز، prefetching کی کمی۔ Apple (WWDC 2025) 1000+ آئٹمز والے جدولوں کے لیے پانچ اہم طریقوں پر زور دیتا ہے۔

  • فلیٹ اونچائی — تمام سیلز کے لیے heightForRowAt کی بجائے مستقل rowHeight استعمال کریں۔ فرق: 500 قطاروں کے جدول کے لیے 60 FPS بمقابلہ 30 FPS۔
  • Prefetching — سیل اسکرین پر ظاہر ہونے سے پہلے غیر متزامن ڈیٹا لوڈنگ (تصاویر، API) کے لیے UITableViewDataSourcePrefetching لاگو کریں۔
  • کم سب ویوز — contentView میں ہر سب ویو رینڈر کا وقت بڑھاتا ہے۔ UIImageView کی بجائے سادہ گرافکس (علیحدہ کرنے والے، آئیکنز) کے لیے draw() استعمال کریں۔
  • پس منظر میں بھاری کام — تاریخ فارمیٹنگ، لوکلائزیشن، حسابات cellForRowAt میں نہیں بلکہ ماڈل میں کی جانی چاہئیں۔ نتائج کے لیے NSCache استعمال کریں۔
  • DiffableDataSource — reloadData() کو apply(snapshot) سے تبدیل کریں — اینیمیشن مفت میں ہوتی ہے، جدول مکمل طور پر دوبارہ لوڈ نہیں ہوتا۔
swift
// Prefetching کے ساتھ اصلاح
extension ContactListController: UITableViewDataSourcePrefetching {

    func tableView(_ tableView: UITableView,
                         prefetchRowsAt indexPaths: [IndexPath]) {
        for indexPath in indexPaths {
            let contact = contacts[indexPath.row]
            ImageCache.shared.prefetch(url: contact.avatarUrl)
        }
    }

    func tableView(_ tableView: UITableView,
                         cancelPrefetchingForRowsAt indexPaths: [IndexPath]) {
        for indexPath in indexPaths {
            let contact = contacts[indexPath.row]
            ImageCache.shared.cancelPrefetch(url: contact.avatarUrl)
        }
    }
}

// ہموار اپ ڈیٹس کے لیے DiffableDataSource کا استعمال
class ModernTableController: UIViewController {

    private var dataSource: UITableViewDiffableDataSource<Section, Contact>!

    func applyContacts(_ contacts: [Contact]) {
        var snapshot = NSDiffableDataSourceSnapshot<Section, Contact>()
        snapshot.appendSections([.main])
        snapshot.appendItems(contacts)
        dataSource.apply(snapshot, animatingDifferences: true)
    }
}

عملی نتیجہ: ان اصلاحات کو لاگو کرنے سے iPhone 12 اور نئے آلات پر اسکرول FPS 30 سے 60 تک بڑھ جاتا ہے (Apple ٹیسٹ ڈیٹا، 2025 کے مطابق)۔ IT Sectr پروجیکٹس میں، ہم تمام نئے جدولوں کے لیے DiffableDataSource استعمال کرتے ہیں اور تصاویر (اوتار، پیش نظارہ، ایپ آئیکنز) والے جدولوں میں prefetching شامل کرتے ہیں۔

اکثر پوچھے گئے سوالات

UITableView اسکرول نہیں ہو رہی — کیا کریں؟

چیک کریں: (1) contentSize > frame.size — جدول میں اس کی اونچائی سے زیادہ مواد ہونا چاہیے؛ (2) جدول کسی دوسرے UIScrollView کے اندر نہیں ہے جو جیسچر کو روکتا ہو؛ (3) isScrollEnabled = true؛ (4) numberOfRowsInSection صحیح تعداد واپس کر رہا ہے۔ ایک عام مسئلہ estimatedRowHeight کے بغیر heightForRowAt = UITableView.automaticDimension والا جدول ہے، جو لامحدود اونچائی کے حساب کا سبب بنتا ہے۔

UITableView کو بغیر جھلملاہٹ کے کیسے اپ ڈیٹ کریں؟

reloadData() کی بجائے performBatchUpdates یا DiffableDataSource استعمال کریں۔ reloadData() بغیر اینیمیشن کے مکمل ری لوڈ کا سبب بنتا ہے، جس سے بصری جھلملاہٹ پیدا ہوتی ہے۔ ٹارگیٹڈ اپ ڈیٹس کے لیے استعمال کریں: reloadRows(at:with:)، insertRows، deleteRows۔ performBatchUpdates کے اندر تمام تبدیلیاں ایک ساتھ اینیمیٹ ہوتی ہیں۔ DiffableDataSource یہ خود بخود بغیر دستی کالز کے کرتا ہے۔

UITableView اور UICollectionView میں کیا فرق ہے؟

UITableView پہلے سے طے شدہ سیل اسٹائل اور بلٹ ان ایڈیٹنگ کے ساتھ سنگل کالم عمودی فہرست ہے۔ UICollectionView لچکدار لے آؤٹ (گرڈ، فہرست، کیروسل، آبشار) ہے جس میں عناصر کی صوابدیدی پوزیشننگ ہوتی ہے۔ سادہ فہرستوں (سیٹنگز، رابطے، پیغامات) کے لیے UITableView منتخب کریں۔ گیلریوں، کیٹلاگوں، بورڈز اور کسی بھی غیر لکیری لے آؤٹ کے لیے UICollectionView منتخب کریں۔

UITableView میں مواد کے نیچے خالی قطاریں کیسے ہٹائیں؟

tableView.tableFooterView = UIView(frame: .zero) سیٹ کریں۔ ڈیفالٹ طور پر، UITableView آخری آئٹم کے نیچے خالی قطاریں (علیحدہ کرنے والے) دکھاتا ہے۔ خالی UIView کو tableFooterView کے طور پر سیٹ کرنا انہیں ہٹا دیتا ہے۔ grouped اسٹائل کے لیے یہ ضروری نہیں ہے — جدول صرف آخری سیکشن میں گول کونوں کے ساتھ حقیقی قطاریں دکھاتا ہے۔

مستقل اونچائی کے ساتھ UITableView کیسے بنائیں؟

tableView.rowHeight = 80 اور tableView.estimatedRowHeight = 0 سیٹ کریں یا estimatedRowHeight چھوڑ دیں۔ فکسڈ اونچائی کے ساتھ، UITableView heightForRowAt کو کال نہیں کرتا، جو 100+ آئٹمز والی فہرستوں کے لیے رینڈرنگ کو 5–10 گنا تیز کرتا ہے۔ کسٹم اونچائی (مختلف مواد) والے سیلز کے لیے، سیلف سائزنگ استعمال کریں: estimatedRowHeight + UITableView.automaticDimension۔

خلاصہ

  • UITableView — DataSource اور Delegate فن تعمیر کے ساتھ عمودی فہرستوں کے لیے مرکزی UIKit جزو۔
  • UITableViewCell — 4 بلٹ ان اسٹائل (.default، .subtitle، .value1، .value2) اور contentConfiguration کے ذریعے کسٹم۔
  • دوبارہ استعمال قطار — دوبارہ استعمال کے قابل سیلز کا پول؛ register + dequeueReusableCell + prepareForReuse لازمی ہیں۔
  • DiffableDataSource (iOS 13+) — خودکار تبدیلی حساب اور اینیمیشن کے ساتھ ٹائپ سیف DataSource۔
  • کارکردگی: فکسڈ rowHeight، prefetching، کم سب ویوز، پس منظر میں بھاری کام۔
  • App Store ٹاپ 100 میں 85% iOS ایپس مواد دکھانے کے لیے UITableView استعمال کرتی ہیں۔
  • گرڈز، کیروسلز اور پیچیدہ لے آؤٹ کے لیے UITableView کی بجائے UICollectionView استعمال کریں۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں