Tablo Görünümü sonucu yoksa, ekranda "Sonuç Yok" öğesini görüntüleyin


114

Bir tableview, bazen listelenecek hiçbir sonuç olmayabilir, bu yüzden sonuç yoksa "sonuç yok" yazan bir şey koymak istiyorum (bir etiket veya bir tablo görüntüleme hücresi?).

Bunu yapmanın en kolay yolu var mı?

Sonuçlara dayanarak ikisinden birini labelarkasına tableviewgizlemeyi deneyecektim , ama TableViewControllernormal değil ve a ile çalıştığım için bunun ViewControllerne kadar akıllı veya yapılabilir olduğundan emin değilim.

Ayrıca şu şekilde kullanıyorum Parseve alt sınıflara ayırıyorum PFQueryTableViewController:

@interface TableViewController : PFQueryTableViewController

İhtiyaç duyulan her türlü ek ayrıntıyı sağlayabilirim, sadece bana bildirin!

TableViewController Storyboard'daki Sahne:

görüntü açıklamasını buraya girin

DÜZENLEME: Midhun MP başına, kullandığım kod burada

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

Ve işte aldığım Görünüm, hala ayırıcı çizgileri var. Bunun küçük bir değişiklik olduğu hissine kapılıyorum, ancak ayırıcı çizgilerin neden göründüğünden emin değilim?

görüntü açıklamasını buraya girin


Bence işin püf noktası, satırlardan kurtulmak için tableview üzerinde boş footerView kurmaktı.
Ben Sinclair

@Andy Bununla ne demek istiyorsun?
SRMR

Bu soruya eklenen çözümü kullanmayın. Tablo görünümü veri kaynağı yöntemleri asla yapmaları gerekenden fazlasını yapmamalıdır. numberOfSectionsbir sayı döndürmeli ve bu kadar. Aynı numberOfRowsInSection. Bunlar herhangi bir zamanda birçok kez çağrılabilir. Asla görünümleri güncellemeyin veya verileri güncellemeyin veya bir sayı döndürmek dışında herhangi bir şey yapmayın. Görünümleri güncelleme mantığı asla bu yöntemlerde olmamalıdır.
rmaddy

Yanıtlar:


206

backgroundViewMülkiyetini kullanarak bunu kolayca başarabilirsiniz UITableView.

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

Swift:

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
}

Referans UITableView Sınıf Başvurusu

backgroundView Emlak

Tablo görünümünün arka plan görünümü.

deklarasyon

hızlı

var backgroundView: UIView?

Objective-C

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

Tartışma

Bir tablo görünümünün arka plan görünümü, tablo görünümünün boyutuyla eşleşecek şekilde otomatik olarak yeniden boyutlandırılır. Bu görünüm, tüm hücrelerin, üst bilgi görünümlerinin ve alt bilgi görünümlerinin arkasına tablo görünümünün bir alt görünümü olarak yerleştirilir.

Tablo görünümünün arka plan rengini ayarlamak için bu özelliği nil olarak ayarlamalısınız.


Cevap için teşekkürler! Bu tableView, yapabilmem için bir prize ihtiyacım olduğu anlamına mı geliyor yourTableView.backgroundView? A kullanıyorum TableViewController, bu yüzden şu anda bunun için bir prizim yok, bu yüzden merak ediyorum.
SRMR

1
UITableViewControllerzaten adında bir mülk var, tableViewbu yüzden bir mülk oluşturmanıza gerek yok
Cihan Tek

Anladım, kullanarakself.tableView
SRMR

1
Düzeltme. Daha fazla test yaptıktan sonra, bahsettiğim satırın aynı değeri döndürmesini sağlamak zorunda kaldım. numOfSections = 1. Eğer sıfır yaparsam ve tablo görünümüm boşsa, çalışır, ancak bir hücre oluşturup sonra sildiğimde, mesajı silip göstermek yerine, aşağıdaki hata ile çöker. *** Yakalanmamış istisna 'NSInternalInconsistencyException' nedeniyle uygulama sonlandırılıyor, neden: 'UITableView dahili hatası: eski bölüm sayısı: 1 ve yeni bölüm sayısı: 0 ile yeni bir bölüm haritası oluşturulamıyor'. Aynı değeri döndürmenin neden işe yaradığını bilmiyorum ama işe yarıyor ve olması gerektiği gibi çalışıyor.
ChrisOSX

2
Bu çözümü kullanmayın. Tablo görünümü veri kaynağı yöntemleri asla yapmaları gerekenden fazlasını yapmamalıdır. numberOfSectionsbir sayı döndürmeli ve bu kadar. Aynı numberOfRowsInSection. Bunlar herhangi bir zamanda birçok kez çağrılabilir. Asla görünümleri güncellemeyin veya verileri güncellemeyin veya bir sayı döndürmek dışında herhangi bir şey yapmayın. Görünümleri güncelleme mantığı asla bu yöntemlerde olmamalıdır.
rmaddy

107

Xcode 8.3.2 - Swift 3.1 için

İşte Xcode 7'ye geri dönen boş bir tablo görünümüne "Öğesiz" görünümü eklemenin çok iyi bilinmeyen ancak inanılmaz derecede kolay bir yolu. Bunu size bırakacağım, bu mantığı ekleyen / kaldıran tablonun arka plan görünümüne bakın, ancak işte Xcode (8.3.2) film şeridi için akış:

  1. Storyboard'da tablo görünümünüzün bulunduğu sahneyi seçin.
  2. Boş bir UIVView'ü o sahnenin "Scene Dock" kısmına sürükleyin

görüntü açıklamasını buraya girin

  1. Yeni görünüme bir UILabel ve herhangi bir kısıtlama ekleyin ve ardından bu görünüm için bir IBOutlet oluşturun

görüntü açıklamasını buraya girin

  1. Bu görünümü tableView.backgroundView'a atayın

görüntü açıklamasını buraya girin

  1. Sihre bakın!

görüntü açıklamasını buraya girin

Sonuçta bu, görünüm denetleyicinize hemen görüntülenmesini istemediğiniz, ancak aynı zamanda kodu elden geçirmek istemediğiniz basit bir görünüm eklemek istediğinizde çalışır.


1
Bu teknik, basit bir görünüme ihtiyaç duyduğunuz her şey için işe yarar. Özel tablo bölümü başlıkları için de kullandım. Gerçekten, görünüme ihtiyaç duyduğunuz her şey için kullanabilirsiniz. Bir IBOutlet aracılığıyla referans verin ve özel bir görünüme ihtiyaç duyduğunuz her yere onu alt görünüm olarak ekleyin.
Paul Bonneville

@Gmogames'in dediği gibi, 2 yıl boyunca IOS yaptıktan sonra tableView arka planını ilk kez biliyorsunuz! teşekkürler dostum
Ali Adil

1
Bunun için teşekkürler. Sadece oraya koymak için tableView.separatorStyle = .none kullanmak ve backgroundView'ı görmek için varsayılan UIView'ı yeniden boyutlandırmak zorunda kaldım. Swift 4 ile Xcode 9.4 kullanıyorum.
Hammad Tariq

Özel görünümü nasıl yerleştirirsiniz?
Nol4635

1
@ Nol4635 Tablo görünümü arka planı durumunda, IBOutlet olarak oluşturduğunuz görünümü tablo görünümünün arka planına atarsınız veya görünümü başka bir görünüme eklemek isterseniz, bunu bir alt görünüm olarak ekleyebilirsiniz. Çerçeve değerlerini ayarlamanız gerekecek, ancak bu diğer tüm görünümler gibi.
Paul Bonneville

30

Yukarıdaki kodun Swift Versiyonu: -

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
}

Ancak bir JSON'dan Bilgi yüklüyorsanız, JSON'un boş olup olmadığını kontrol etmeniz gerekir, bu nedenle eğer böyle bir kod koyarsanız başlangıçta "Veri yok" mesajı görünür ve sonra kaybolur. Çünkü tablo veriyi yeniden yükledikten sonra mesaj gizlenir. Yani bu kodu JSON verilerinin bir diziye yüklendiği yere koyabilirsiniz. YANİ :-

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

Bu, satırlarda veri olmadığında etiketi görüntülemek için çok işe yarar. Bununla birlikte, veri geldiğinde ve self.tableView.reloadData()çağrıldığında başa çıkmanın en iyi yolu nedir? Yeni satırlarımı eklediğini fark ettim, ancak noDataLabelhala altlarında görüntüleniyor.
tylerSF

1
Dizinizde öğe varsa, self.tableView.backgroundView = nil olarak ayarlayın
Chathuranga Silva

if jobs_list.count == 0 {// verilen kodun üstüne ekleyin} else {self.tableView.backgroundView = nil}
Chathuranga Silva

mükemmel. self.tableView.backgroundView = nilif deyimime eklemek return jobs_list.count iyi çalışıyor. teşekkürler
tylerSF

Bu cevapta ilk çözümü kullanmayın. Tablo görünümü veri kaynağı yöntemleri asla yapmaları gerekenden fazlasını yapmamalıdır. numberOfSectionsbir sayı döndürmeli ve bu kadar. Aynı numberOfRowsInSection. Bunlar herhangi bir zamanda birçok kez çağrılabilir. Asla görünümleri güncellemeyin veya verileri güncellemeyin veya bir sayı döndürmek dışında herhangi bir şey yapmayın. Görünümleri güncelleme mantığı asla bu yöntemlerde olmamalıdır.
rmaddy

6

Bu kontrolü deneyebilirsiniz. Oldukça temiz. DZNEmptyDataSet

Ya da senin yerinde olsaydım tek yapacağım

  • Veri dizinizin boş olup olmadığını kontrol edin
  • Boşsa, buna @ "Veri Yok" adlı bir nesne ekleyin
  • Bu dizeyi cell.textLabel.text içinde görüntüleyin

Tereyağından kıl çeker gibi


5

Swift 3 (güncellendi):

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
}

Bu çözümü kullanmayın. Tablo görünümü veri kaynağı yöntemleri asla yapmaları gerekenden fazlasını yapmamalıdır. numberOfSectionsbir sayı döndürmeli ve bu kadar. Aynı numberOfRowsInSection. Bunlar herhangi bir zamanda birçok kez çağrılabilir. Asla görünümleri güncellemeyin veya verileri güncellemeyin veya bir sayı döndürmek dışında herhangi bir şey yapmayın. Görünümleri güncelleme mantığı asla bu yöntemlerde olmamalıdır.
rmaddy

Katılıyorum. Bu çözüm geliştirilebilir, ancak aynı zamanda kullanılabilir.
Teodor Ciuraru

Bu çözümü kullanmamanız gerektiği konusunda nasıl hemfikirsiniz ama sonra bunun da kullanılabileceğini söyleyebilirsiniz? Bu bir çelişki.
rmaddy

Bu çözümün iyileştirilebileceğine katılıyorum, ancak mevcut durumunda da işe yarayacak.
Teodor Ciuraru

5

Swift3.0

Umarım amacınıza hizmet eder ...... UITableViewController cihazınızda.

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

İşlevli Yardımcı Sınıf:

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

Bu çözümü kullanmayın. Tablo görünümü veri kaynağı yöntemleri asla yapmaları gerekenden fazlasını yapmamalıdır. numberOfSectionsbir sayı döndürmeli ve bu kadar. Aynı numberOfRowsInSection. Bunlar herhangi bir zamanda birçok kez çağrılabilir. Asla görünümleri güncellemeyin veya verileri güncellemeyin veya bir sayı döndürmek dışında herhangi bir şey yapmayın. Görünümleri güncelleme mantığı asla bu yöntemlerde olmamalıdır.
rmaddy

3

Sanırım probleminizi çözmenin en zarif yolu, a'dan UITableViewControllera UIViewControlleriçeren a'ya geçmektir UITableView. Bu şekilde, UIViewistediğiniz her şeyi ana görünümün alt görünümleri olarak ekleyebilirsiniz .

Bunu yapmak için bir UITableViewCell kullanmanızı tavsiye etmem, gelecekte ek şeyler eklemeniz gerekebilir ve işler çabuk çirkinleşebilir.

Bunun gibi bir şey de yapabilirsiniz, ancak bu da en iyi çözüm değildir.

UIWindow* window = [[UIApplication sharedApplication] keyWindow];
[window addSubview: OverlayView];

Uygulamanın en zarif yolu olan renk için teşekkürler, her zaman bunu düşünmek için iyi bir yol. Görsel senaryo taslağımı bir UIViewControlleriçeren a kullanacak şekilde değiştirmeyi deneyebilirim UITableView.
SRMR

1
Geleceğe yönelik en iyi yol budur. UITableViewControllerKendim hiç kullanmadım , çünkü onu kullanmak, başka bir şekilde yapmaktan çok daha kolay değil, ancak gelecekte bir şeyleri değiştirme yeteneğinizi sınırlıyor.
Cihan Tek

Yarı saydam çubuklarınız varsa, bu geleceğe yönelik değildir. Karşı tavsiye ederim. En azından, bir UITableViewController içeren ve her şeyi uygun şekilde ayarlayan bir UIViewController yapın.
xtravar

3

numberOfSectionsInTableViewYönteminizde bu kodu kullanın : -

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

1
Bu çözümü kullanmayın. Tablo görünümü veri kaynağı yöntemleri asla yapmaları gerekenden fazlasını yapmamalıdır. numberOfSectionsbir sayı döndürmeli ve bu kadar. Aynı numberOfRowsInSection. Bunlar herhangi bir zamanda birçok kez çağrılabilir. Asla görünümleri güncellemeyin veya verileri güncellemeyin veya bir sayı döndürmek dışında herhangi bir şey yapmayın. Görünümleri güncelleme mantığı asla bu yöntemlerde olmamalıdır.
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

2

Tablo görünümü alt bilgisini kullanmıyorsanız ve tablo görünümünün ekranı boş varsayılan tablo hücreleriyle doldurmasını istemiyorsanız, tablo görünümü alt bilginizi boş bir UIView olarak ayarlamanızı öneririm. Bunu obj-c veya Swift'de yapmak için doğru sözdizimini bilmiyorum, ancak Xamarin.iOS'ta bunu şöyle yapardım:

public class ViewController : UIViewController
{
    UITableView _table;

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

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

        _table.TableFooterView = new UIView();
    }
}

Yukarıdaki kod, boş hücreler olmadan bir tablo görünümüne neden olur


2

İşte benim için çalışan çözüm.

  1. Aşağıdaki kodu yeni bir dosyaya ekleyin.

  2. Tablo sınıfınızı film şeridi veya .xib'den özel "MyTableView" sınıfına değiştirin

(bu yalnızca ilk bölüm için çalışacaktır. Daha fazla özelleştirmek istiyorsanız, MyTableView reloadData () işlevinde diğer bölümler için uygun şekilde değişiklikler yapın)

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

Bu iyi bir yaklaşım. Daha kapsamlı hale getirmek için aşağıdaki gibi bazı geliştirmeler ekledim. 1. Tablo görünümünün önbellek ayırıcı stili ve boş / boş olmayan durum geçişinde bu alt sınıfı farklı ayırıcı stillerin arzu edildiği kullanım durumları için uygulanabilir hale getirmek için geri yükleyin. 2. @IBInspectable var emptyStateText: String?Bu sınıfı ekleyin ve işaretleyin, @IBDesignableöyleyse film şeridi veya xibs'deki farklı sahneler için farklı boş durum metinlerini değiştirebileceksiniz. Zevk almak! :)
Egist Li

1

Tablo görünümünde sonuç yoksa, istediğiniz görünüme ve mesaja sahip bir kaplama görünümü sunarım. Bunu ViewDidAppear'da yapabilirsiniz, böylece görünümü göstermeden / göstermeden önce sonuçlara sahip olursunuz.


1

Bunu herhangi bir kod olmadan yapmak istiyorsanız, bunu deneyin!

Tablo görünümünüze tıklayın.

tableView Ekran Görüntüsü

Stili "düz" den "gruplandırılmış" olarak değiştirin.

Tablo Görünümü özellikleri ekran görüntüsü-2

Şimdi kullandığınızda ...

tableView.backgroundView = ETİKETİNİZİ EKLEYİN VEYA GÖRÜNÜMÜNÜZÜ EKLEYİN

Ayırıcıları göstermeyecek!


1

Bu kodu tek bir dosyaya ekleyin ve koleksiyon türünüzü CustomCollectionView olarak değiştirin

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
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.