Jika tidak ada hasil Tampilan Tabel, tampilkan "Tidak Ada Hasil" di layar

114

Saya memiliki tableview, di mana kadang-kadang mungkin tidak ada hasil apa pun untuk dicantumkan , jadi saya ingin memasang sesuatu yang mengatakan "tidak ada hasil" jika tidak ada hasil (baik label atau sel tampilan tabel satu?).

Apakah ada cara termudah untuk melakukan ini?

Saya akan mencoba di labelbelakang tableviewlalu menyembunyikan salah satu dari dua berdasarkan hasil, tetapi karena saya bekerja dengan a TableViewControllerdan bukan normal, ViewControllersaya tidak yakin seberapa pintar atau bisa dilakukan itu.

Saya juga menggunakan Parsedan subclassing sebagai PFQueryTableViewController:

@interface TableViewController : PFQueryTableViewController

Saya dapat memberikan detail tambahan yang diperlukan, beri tahu saya!

TableViewController Adegan di Storyboard:

masukkan deskripsi gambar di sini

EDIT: Per Midhun MP, berikut kode yang saya gunakan

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSInteger numOfSections = 0;
    if ([self.stringArray count] > 0)
    {
        self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
        numOfSections                 = 1;
        //yourTableView.backgroundView   = nil;
        self.tableView.backgroundView = nil;
    }
    else
    {
        UILabel *noDataLabel         = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, self.tableView.bounds.size.height)];
        noDataLabel.text             = @"No data available";
        noDataLabel.textColor        = [UIColor blackColor];
        noDataLabel.textAlignment    = NSTextAlignmentCenter;
        //yourTableView.backgroundView = noDataLabel;
        //yourTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        self.tableView.backgroundView = noDataLabel;
        self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }

    return numOfSections;
}

Dan inilah Tampilan yang saya dapatkan, masih memiliki garis pemisah. Saya merasa ini adalah beberapa perubahan kecil, tetapi saya tidak yakin mengapa garis pemisah muncul?

masukkan deskripsi gambar di sini

SRMR
sumber
Saya pikir triknya adalah mengatur footerView kosong di tableview untuk menghilangkan garis.
Ben Sinclair
@Andy Apa yang Anda maksud dengan itu?
SRMR
Jangan gunakan solusi yang ditambahkan ke pertanyaan ini. Metode sumber data tampilan tabel tidak boleh melakukan lebih dari yang seharusnya. numberOfSectionsharus mengembalikan hitungan dan hanya itu. Sama untuk numberOfRowsInSection. Ini dapat dipanggil berkali-kali kapan saja. Jangan pernah memperbarui tampilan atau memperbarui data atau melakukan apa pun kecuali mengembalikan hitungan. Logika untuk memperbarui tampilan tidak boleh dalam metode ini.
rmaddy

Jawaban:

206

Anda dapat dengan mudah mencapainya dengan menggunakan backgroundViewproperti UITableView.

Tujuan C:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSInteger numOfSections = 0;
    if (youHaveData)
    {
        yourTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
        numOfSections                = 1;
        yourTableView.backgroundView = nil;
    }
    else
    {   
        UILabel *noDataLabel         = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, yourTableView.bounds.size.width, yourTableView.bounds.size.height)];
        noDataLabel.text             = @"No data available";
        noDataLabel.textColor        = [UIColor blackColor];
        noDataLabel.textAlignment    = NSTextAlignmentCenter;
        yourTableView.backgroundView = noDataLabel;
        yourTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }

    return numOfSections;
}

Cepat:

func numberOfSections(in tableView: UITableView) -> Int
{
    var numOfSections: Int = 0
    if youHaveData
    {
        tableView.separatorStyle = .singleLine
        numOfSections            = 1
        tableView.backgroundView = nil
    }
    else
    {
        let noDataLabel: UILabel  = UILabel(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: tableView.bounds.size.height))
        noDataLabel.text          = "No data available"
        noDataLabel.textColor     = UIColor.black
        noDataLabel.textAlignment = .center
        tableView.backgroundView  = noDataLabel
        tableView.separatorStyle  = .none
    }
    return numOfSections
}

Referensi Referensi Kelas UITableView

backgroundView Properti

Tampilan latar belakang tampilan tabel.

Pernyataan

Cepat

var backgroundView: UIView?

Objective-C

@property(nonatomic, readwrite, retain) UIView *backgroundView

Diskusi

Tampilan latar belakang tampilan tabel secara otomatis diubah ukurannya agar sesuai dengan ukuran tampilan tabel. Tampilan ini ditempatkan sebagai subview dari tampilan tabel di belakang semua sel, tampilan header, dan tampilan footer.

Anda harus menyetel properti ini ke nol untuk menyetel warna latar belakang tampilan tabel.

Midhun MP
sumber
Terima kasih atas jawabannya! Apakah ini berarti saya membutuhkan saluran tableViewkeluar agar saya dapat melakukannya yourTableView.backgroundView? Saya menggunakan TableViewControllerjadi saya tidak memiliki outlet untuk itu sekarang, itu sebabnya saya bertanya-tanya.
SRMR
1
UITableViewControllersudah memiliki properti bernama tableViewjadi Anda tidak perlu membuatnya
Cihan Tek
Mengerti, menggunakanself.tableView
SRMR
1
Koreksi. Setelah pengujian lebih lanjut, saya sebenarnya harus membuat baris yang saya sebutkan mengembalikan nilai yang sama. numOfSections = 1. Jika saya membuatnya nol dan tampilan tabel saya kosong, itu berfungsi, tetapi ketika saya membuat sel dan kemudian menghapusnya, alih-alih menghapus dan menampilkan pesan, itu macet dengan kesalahan berikut. *** Menghentikan aplikasi karena pengecualian yang tidak tertangkap 'NSInternalInconsistencyException', alasan: 'Bug internal UITableView: tidak dapat membuat peta bagian baru dengan jumlah bagian lama: 1 dan jumlah bagian baru: 0'. Saya tidak tahu mengapa mengembalikan nilai yang sama berfungsi, tetapi berfungsi dan berfungsi sebagaimana mestinya.
ChrisOSX
2
Jangan gunakan solusi ini. Metode sumber data tampilan tabel tidak boleh melakukan lebih dari yang seharusnya. numberOfSectionsharus mengembalikan hitungan dan hanya itu. Sama untuk numberOfRowsInSection. Ini dapat dipanggil berkali-kali kapan saja. Jangan pernah memperbarui tampilan atau memperbarui data atau melakukan apa pun kecuali mengembalikan hitungan. Logika untuk memperbarui tampilan tidak boleh dalam metode ini.
rmaddy
107

Untuk Xcode 8.3.2 - Swift 3.1

Berikut adalah cara yang tidak terlalu terkenal tetapi sangat mudah untuk mencapai penambahan tampilan "Tidak Ada Item" ke tampilan tabel kosong yang kembali ke Xcode 7. Saya akan menyerahkannya kepada Anda untuk mengontrol logika yang menambahkan / menghapus tampilan ke tampilan latar belakang tabel, tetapi berikut adalah alur untuk dan storyboard Xcode (8.3.2):

  1. Pilih adegan di Papan Cerita yang memiliki tampilan tabel Anda.
  2. Seret UIView kosong ke "Scene Dock" dari adegan itu

masukkan deskripsi gambar di sini

  1. Tambahkan UILabel dan batasan apa pun ke tampilan baru, lalu buat IBOutlet untuk tampilan tersebut

masukkan deskripsi gambar di sini

  1. Tetapkan tampilan itu ke tableView.backgroundView

masukkan deskripsi gambar di sini

  1. Lihatlah keajaibannya!

masukkan deskripsi gambar di sini

Pada akhirnya ini berfungsi kapan saja Anda ingin menambahkan tampilan sederhana ke pengontrol tampilan yang tidak perlu Anda tampilkan segera, tetapi Anda juga tidak ingin memberikan kode tangan.

Paul Bonneville
sumber
1
Teknik ini berfungsi untuk apa pun yang Anda perlukan tampilan sederhana. Saya juga menggunakannya untuk header bagian tabel kustom. Sungguh, Anda dapat menggunakannya untuk apa pun yang Anda butuhkan untuk dilihat. Cukup rujuk melalui IBOutlet dan tambahkan sebagai subview di mana pun Anda membutuhkan tampilan kustom.
Paul Bonneville
Seperti yang dikatakan @gmogames, setelah melakukan IOS selama 2 tahun ini adalah pertama kalinya mengetahui tentang background tableView!. terima kasih kawan
Ali Adil
1
Terima kasih untuk ini. Hanya untuk meletakkannya di sana, saya harus menggunakan tableView.separatorStyle = .none dan mengubah ukuran UIView default untuk melihat backgroundView. Saya menggunakan Xcode 9.4 dengan Swift 4.
Hammad Tariq
Bagaimana Anda menempatkan tampilan kustom?
Nol4635
1
@ Nol4635 Untuk latar belakang tampilan tabel, Anda cukup menetapkan tampilan yang Anda buat sebagai IBOutlet ke latar belakang tampilan tabel atau, jika Anda hanya ingin menambahkan tampilan ke tampilan lain, Anda dapat menambahkannya sebagai subview. Anda harus menyetel nilai bingkai, tetapi ini seperti tampilan lainnya.
Paul Bonneville
30

Versi Swift dari kode di atas: -

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    var numOfSection: NSInteger = 0

    if CCompanyLogoImage.count > 0 {

        self.tableView.backgroundView = nil
        numOfSection = 1


    } else {

        var noDataLabel: UILabel = UILabel(frame: CGRectMake(0, 0, self.tableView.bounds.size.width, self.tableView.bounds.size.height))
        noDataLabel.text = "No Data Available"
        noDataLabel.textColor = UIColor(red: 22.0/255.0, green: 106.0/255.0, blue: 176.0/255.0, alpha: 1.0)
        noDataLabel.textAlignment = NSTextAlignment.Center
        self.tableView.backgroundView = noDataLabel

    }
    return numOfSection
}

Tetapi Jika Anda sedang memuat Informasi Dari JSON, Anda perlu memeriksa apakah JSON kosong atau tidak, untuk itu jika Anda memasukkan kode seperti ini awalnya muncul Pesan "Tidak ada data" kemudian menghilang. Karena setelah tabel reload data pesan disembunyikan. Jadi Anda dapat meletakkan kode ini di mana memuat data JSON ke sebuah array. JADI: -

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    return 1
}

func extract_json(data:NSData) {


    var error: NSError?

    let jsonData: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers , error: &error)
    if (error == nil) {
        if let jobs_list = jsonData as? NSArray
        {
            if jobs_list.count == 0 {

                var noDataLabel: UILabel = UILabel(frame: CGRectMake(0, 0, self.tableView.bounds.size.width, self.tableView.bounds.size.height))
                noDataLabel.text = "No Jobs Available"
                noDataLabel.textColor = UIColor(red: 22.0/255.0, green: 106.0/255.0, blue: 176.0/255.0, alpha: 1.0)
                noDataLabel.textAlignment = NSTextAlignment.Center
                self.tableView.backgroundView = noDataLabel

            }

            for (var i = 0; i < jobs_list.count ; i++ )
            {
                if let jobs_obj = jobs_list[i] as? NSDictionary
                {
                    if let vacancy_title = jobs_obj["VacancyTitle"] as? String
                    {
                        CJobTitle.append(vacancy_title)

                        if let vacancy_job_type = jobs_obj["VacancyJobType"] as? String
                        {
                            CJobType.append(vacancy_job_type)

                            if let company_name = jobs_obj["EmployerCompanyName"] as? String
                            {
                                CCompany.append(company_name)

                                    if let company_logo_url = jobs_obj["EmployerCompanyLogo"] as? String
                                    {
                                        //CCompanyLogo.append("http://google.com" + company_logo_url)

                                        let url = NSURL(string: "http://google.com" + company_logo_url )
                                        let data = NSData(contentsOfURL:url!)
                                        if data != nil {
                                            CCompanyLogoImage.append(UIImage(data: data!)!)
                                        }

                                        if let vacancy_id = jobs_obj["VacancyID"] as? String
                                        {
                                            CVacancyId.append(vacancy_id)

                                        }

                                    }

                            }

                        }
                    }
                }
            }
        }
    }
    do_table_refresh();


}

func do_table_refresh() {

    dispatch_async(dispatch_get_main_queue(), {
        self.tableView.reloadData()
        return
    })
}
Chathuranga Silva
sumber
Ini bekerja sangat baik untuk menampilkan label ketika tidak ada data di baris. Namun, apa cara terbaik untuk menangani saat data masuk dan self.tableView.reloadData()dipanggil? Saya telah menemukan bahwa itu menambahkan baris baru saya, tetapi noDataLabelmasih ditampilkan di bawahnya.
tylerSF
1
Jika array Anda memiliki item, setel self.tableView.backgroundView = nil
Chathuranga Silva
if jobs_list.count == 0 {// tambahkan kode yang diberikan di atas} else {self.tableView.backgroundView = nil}
Chathuranga Silva
sempurna. menambahkan self.tableView.backgroundView = nilpernyataan if saya sebelum return jobs_list.count berfungsi dengan baik. terima kasih
tylerSF
Jangan gunakan solusi pertama dalam jawaban ini. Metode sumber data tampilan tabel tidak boleh melakukan lebih dari yang seharusnya. numberOfSectionsharus mengembalikan hitungan dan hanya itu. Sama untuk numberOfRowsInSection. Ini dapat dipanggil berkali-kali kapan saja. Jangan pernah memperbarui tampilan atau memperbarui data atau melakukan apa pun kecuali mengembalikan hitungan. Logika untuk memperbarui tampilan tidak boleh dalam metode ini.
rmaddy
6

Anda dapat mencoba kontrol ini. Ini cukup rapi. DZNEmptyDataSet

Atau jika aku jadi kamu, yang akan kulakukan hanyalah

  • Periksa untuk melihat apakah larik data Anda kosong
  • Jika kosong, tambahkan satu objek bernama @ "No Data" ke dalamnya
  • Tampilkan string itu di cell.textLabel.text

Sangat mudah

Sam B
sumber
5

Swift 3 (diperbarui):

override func numberOfSections(in tableView: UITableView) -> Int {
    if myArray.count > 0 {
        self.tableView.backgroundView = nil
        self.tableView.separatorStyle = .singleLine
        return 1
    }

    let rect = CGRect(x: 0,
                      y: 0,
                      width: self.tableView.bounds.size.width,
                      height: self.tableView.bounds.size.height)
    let noDataLabel: UILabel = UILabel(frame: rect)

    noDataLabel.text = "Custom message."
    noDataLabel.textColor = UIColor.white
    noDataLabel.textAlignment = NSTextAlignment.center
    self.tableView.backgroundView = noDataLabel
    self.tableView.separatorStyle = .none

    return 0
}
Teodor Ciuraru
sumber
Jangan gunakan solusi ini. Metode sumber data tampilan tabel tidak boleh melakukan lebih dari yang seharusnya. numberOfSectionsharus mengembalikan hitungan dan hanya itu. Sama untuk numberOfRowsInSection. Ini dapat dipanggil berkali-kali kapan saja. Jangan pernah memperbarui tampilan atau memperbarui data atau melakukan apa pun kecuali mengembalikan hitungan. Logika untuk memperbarui tampilan tidak boleh dalam metode ini.
rmaddy
Saya setuju. Solusi ini dapat ditingkatkan, tetapi juga dapat digunakan.
Teodor Ciuraru
Bagaimana Anda setuju bahwa Anda tidak boleh menggunakan solusi ini tetapi kemudian menyatakan bahwa dapat juga digunakan? Itu kontradiksi.
rmaddy
Saya setuju bahwa solusi ini dapat ditingkatkan, tetapi, dalam kondisi saat ini, juga akan berhasil.
Teodor Ciuraru
5

Swift3.0

Saya berharap itu server tujuan Anda ...... Dalam UITableViewController Anda.

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if searchController.isActive && searchController.searchBar.text != "" {
        if filteredContacts.count > 0 {
            self.tableView.backgroundView = .none;
            return filteredContacts.count
        } else {
            Helper.EmptyMessage(message: ConstantMap.NO_CONTACT_FOUND, viewController: self)
            return 0
        }
    } else {
        if contacts.count > 0 {
            self.tableView.backgroundView = .none;
            return contacts.count
        } else {
            Helper.EmptyMessage(message: ConstantMap.NO_CONTACT_FOUND, viewController: self)
            return 0
        }
    }
}

Kelas Pembantu dengan fungsi:

 /* Description: This function generate alert dialog for empty message by passing message and
           associated viewcontroller for that function
           - Parameters:
            - message: message that require for  empty alert message
            - viewController: selected viewcontroller at that time
         */
        static func EmptyMessage(message:String, viewController:UITableViewController) {
            let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: viewController.view.bounds.size.width, height: viewController.view.bounds.size.height))
            messageLabel.text = message
            let bubbleColor = UIColor(red: CGFloat(57)/255, green: CGFloat(81)/255, blue: CGFloat(104)/255, alpha :1)

            messageLabel.textColor = bubbleColor
            messageLabel.numberOfLines = 0;
            messageLabel.textAlignment = .center;
            messageLabel.font = UIFont(name: "TrebuchetMS", size: 18)
            messageLabel.sizeToFit()

            viewController.tableView.backgroundView = messageLabel;
            viewController.tableView.separatorStyle = .none;
        }
Ravindra Shekhawat
sumber
Jangan gunakan solusi ini. Metode sumber data tampilan tabel tidak boleh melakukan lebih dari yang seharusnya. numberOfSectionsharus mengembalikan hitungan dan hanya itu. Sama untuk numberOfRowsInSection. Ini dapat dipanggil berkali-kali kapan saja. Jangan pernah memperbarui tampilan atau memperbarui data atau melakukan apa pun kecuali mengembalikan hitungan. Logika untuk memperbarui tampilan tidak boleh dalam metode ini.
rmaddy
3

Menurut saya cara paling elegan untuk menyelesaikan masalah Anda adalah beralih dari a UITableViewControllerke a UIViewControlleryang berisi UITableView. Dengan cara ini Anda dapat menambahkan apapun yang UIViewAnda inginkan sebagai subview dari tampilan utama.

Saya tidak akan merekomendasikan menggunakan UITableViewCell untuk melakukan ini, Anda mungkin perlu menambahkan hal-hal tambahan di masa mendatang dan segala sesuatunya bisa menjadi jelek dengan cepat.

Anda juga dapat melakukan sesuatu seperti ini, tetapi ini juga bukan solusi terbaik.

UIWindow* window = [[UIApplication sharedApplication] keyWindow];
[window addSubview: OverlayView];
Cihan Tek
sumber
Terima kasih untuk warna di sekitarnya yang merupakan cara paling elegan untuk diterapkan, selalu cara yang baik untuk memikirkannya. Saya mungkin mencoba mengubah storyboard saya untuk menggunakan yang UIViewControllermengandung UITableView.
SRMR
1
Itu cara paling tahan masa depan. Saya tidak pernah menggunakan UITableViewControllerdiri saya sendiri, karena menggunakannya tidak jauh lebih mudah daripada melakukannya dengan cara lain, namun itu membatasi kemampuan Anda untuk mengubah banyak hal di masa depan.
Cihan Tek
Ini bukan bukti masa depan jika Anda memiliki batang tembus cahaya. Saya sangat merekomendasikan melawan. Paling tidak, buat UIViewController yang berisi UITableViewController dan sesuaikan semuanya dengan tepat.
xtravar
3

Gunakan kode ini dalam numberOfSectionsInTableViewmetode Anda : -

if ([array count]==0
{

    UILabel *fromLabel = [[UILabel alloc]initWithFrame:CGRectMake(50, self.view.frame.size.height/2, 300, 60)];                                                                                        
    fromLabel.text =@"No Result";
    fromLabel.baselineAdjustment = UIBaselineAdjustmentAlignBaselines;
    fromLabel.backgroundColor = [UIColor clearColor];
    fromLabel.textColor = [UIColor lightGrayColor];
    fromLabel.textAlignment = NSTextAlignmentLeft;
    [fromLabel setFont:[UIFont fontWithName:Embrima size:30.0f]];
    [self.view addSubview:fromLabel];
    [self.tblView setHidden:YES];
}
Chandan
sumber
1
Jangan gunakan solusi ini. Metode sumber data tampilan tabel tidak boleh melakukan lebih dari yang seharusnya. numberOfSectionsharus mengembalikan hitungan dan hanya itu. Sama untuk numberOfRowsInSection. Ini dapat dipanggil berkali-kali kapan saja. Jangan pernah memperbarui tampilan atau memperbarui data atau melakukan apa pun kecuali mengembalikan hitungan. Logika untuk memperbarui tampilan tidak boleh dalam metode ini.
rmaddy
2

SWIFT 3

        let noDataLabel: UILabel     = UILabel(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: tableView.bounds.size.height))
        noDataLabel.text             = "No data available"
        noDataLabel.textColor        = UIColor.white
        noDataLabel.font             = UIFont(name: "Open Sans", size: 15)
        noDataLabel.textAlignment    = .center
        tableView.backgroundView = noDataLabel
        tableView.separatorStyle = .none
Ahmed Safadi
sumber
2

Jika Anda tidak menggunakan footer tableview dan tidak ingin tableview mengisi layar dengan sel tabel default kosong, saya sarankan Anda menyetel footer tableview Anda ke UIView kosong. Saya tidak tahu sintaks yang benar untuk melakukan ini di obj-c atau Swift, tetapi di Xamarin.iOS saya akan melakukannya seperti ini:

public class ViewController : UIViewController
{
    UITableView _table;

    public ViewController (IntPtr handle) : base (handle)
    {
    }

    public override void ViewWillAppear(bool animated) {
        // Initialize table

        _table.TableFooterView = new UIView();
    }
}

Kode di atas akan menghasilkan tampilan tabel tanpa sel kosong

frmi
sumber
2

Inilah solusi yang berhasil untuk saya.

  1. Tambahkan kode berikut ke file baru.

  2. Ubah kelas tabel Anda menjadi kelas khusus "MyTableView" dari storyboard atau .xib

(ini hanya akan bekerja untuk bagian pertama. Jika Anda ingin menyesuaikan lebih banyak, lakukan perubahan dalam fungsi MyTableView reloadData () sesuai untuk bagian lain)

public class MyTableView: UITableView {

    override public func reloadData() {
        super.reloadData()

        if self.numberOfRows(inSection: 0) == 0 {
            if self.viewWithTag(1111) == nil {
                let noDataLabel = UILabel()
                noDataLabel.textAlignment = .center
                noDataLabel.text = "No Data Available"
                noDataLabel.tag = 1111
                noDataLabel.center = self.center
                self.backgroundView = noDataLabel
            }

        } else {
            if self.viewWithTag(1111) != nil {
                self.backgroundView = nil
            }
        }
    }
}
ShrikantWalekar
sumber
Ini adalah pendekatan yang bagus. Saya telah menambahkan beberapa peningkatan sebagai berikut untuk membuatnya lebih menyeluruh. 1. Gaya pemisah cache tampilan tabel dan pulihkan setelah transisi status kosong / tidak kosong agar subkelas ini dapat diterapkan untuk kasus penggunaan yang diinginkan gaya pemisah berbeda. 2. Tambahkan @IBInspectable var emptyStateText: String?dan tandai kelas ini @IBDesignablesehingga Anda akan dapat mengubah teks status kosong yang berbeda untuk adegan berbeda di storyboard atau xibs. Nikmati! :)
Egist Li
1

Saya akan menyajikan tampilan hamparan yang memiliki tampilan dan pesan yang Anda inginkan jika tampilan tabel tidak memiliki hasil. Anda bisa melakukannya di ViewDidAppear, sehingga Anda memiliki hasil sebelum menampilkan / tidak menampilkan tampilan.

Siriss
sumber
1

Jika Anda ingin melakukan ini tanpa kode apa pun, coba ini!

Klik pada tableView Anda.

tableView Screenshot

Ubah gaya dari "biasa" menjadi "dikelompokkan".

Tangkapan layar properti Tampilan Tabel-2

Sekarang saat Anda menggunakan ....

tableView.backgroundView = MASUKKAN LABEL ATAU LIHAT ANDA

Ini tidak akan menampilkan pemisah!

F. Morales
sumber
1

Tambahkan kode ini dalam satu file dan ubah jenis koleksi Anda ke CustomCollectionView

import Foundation

class CustomCollectionView: UICollectionView {

  var emptyModel = EmptyMessageModel()
  var emptyView: EmptyMessageView?
  var showEmptyView: Bool = true

  override func reloadData() {
    super.reloadData()

    emptyView?.removeFromSuperview()
    self.backgroundView = nil

    if !showEmptyView {
      return
    }

    if numberOfSections < 1 {
      let rect = CGRect(x: 0,
                        y: 0,
                        width: self.bounds.size.width,
                        height: self.bounds.size.height)

      emptyView = EmptyMessageView()
      emptyView?.frame = rect
      if let emptyView = emptyView {
        //                self.addSubview(emptyView)
        self.backgroundView = emptyView
      }
      emptyView?.setView(with: emptyModel)

    } else {
      emptyView?.removeFromSuperview()
      self.backgroundView = nil
    }
  }
}

class EmptyMessageView: UIView {

  @IBOutlet weak var messageLabel: UILabel!
  @IBOutlet weak var imageView: UIImageView!

  var view: UIView!

  override init(frame: CGRect) {
    super.init(frame: frame)
    xibSetup()
  }

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    xibSetup()
  }

  func xibSetup() {
    view = loadViewFromNib()

    view.frame = bounds

    view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    addSubview(view)
  }

  func loadViewFromNib() -> UIView {

    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: "EmptyMessageView", bundle: bundle)
    let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView

    return view
  }

  func setView(with model: EmptyMessageModel) {
    messageLabel.text = model.message ?? ""
    imageView.image = model.image ?? #imageLiteral(resourceName: "no_notification")
  }
}

///////////
class EmptyMessageModel {
  var message: String?
  var image: UIImage?

  init(message: String = "No data available", image: UIImage = #imageLiteral(resourceName: "no_notification")) {
    self.message = message
    self.image = image
  }
}
ShrikantWalekar
sumber