Если результатов нет в таблице, отобразите "Нет результатов" на экране

У меня есть tableview, где иногда не может быть никаких результатов для списка, поэтому я хотел бы поместить что-то, что говорит "нет результатов" , если результатов нет (либо ярлык или одну ячейку таблицы просмотра?).

Есть ли простой способ сделать это?

Я попытался бы label за tableview, а затем скрыть один из двух на основе результатов, но так как я работаю с TableViewController, а не с обычным ViewController, я не уверен, как умный или выполнимый.

Я также использую Parse и подклассифицирую как PFQueryTableViewController:

@interface TableViewController : PFQueryTableViewController

Я могу предоставить любые дополнительные данные, просто дайте мне знать!

TableViewController Сцена в раскадровке:

enter image description here

РЕДАКТИРОВАТЬ: В течение Midhun MP, здесь код, который я использую

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

И вот представление, которое я получаю, у него все еще есть разделительные линии. У меня возникает ощущение, что это небольшие изменения, но я не уверен, почему появляются линии разделителя?

enter image description here

Ответ 1

Вы можете легко достичь этого, используя свойство backgroundView UITableView.

Цель 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
}

Ссылка на класс UITableView

Свойство backgroundView

Фоновый вид табличного представления.

декларация

стриж

var backgroundView: UIView?

Objective-C

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

обсуждение

Размер фонового представления табличных представлений автоматически изменяется в соответствии с размером табличного представления. Это представление размещается как подпредставление табличного представления позади всех ячеек, представлений заголовка и представлений нижнего колонтитула.

Вы должны установить это свойство равным nil, чтобы установить цвет фона табличного представления.

Ответ 2

Для Xcode 8.3.2 - Swift 3.1

Вот не очень известный, но невероятно простой способ добиться добавления представления "Нет элементов" в пустой табличный вид, который восходит к Xcode 7. Я оставлю его для контроля этой логики, которая добавляет/удаляет представление в фоновом режиме таблицы, но вот раскадровка потока и Xcode (8.3.2):

  • Выберите сцену в раскадровке, в которой есть вид таблицы.
  • Перетащите пустой UIView в "Scene Dock" этой сцены

введите описание изображения здесь

  1. Добавьте UILabel и любые ограничения для нового представления, а затем создайте IBOutlet для этого представления

введите описание изображения здесь

  1. Назначить этот вид в tableView.backgroundView

введите описание изображения здесь

  1. Вот волшебство!

введите описание изображения здесь

В конечном счете это работает в любое время, когда вы хотите добавить простой вид к контроллеру представления, который вам не обязательно нужно отображать сразу, но вы также не хотите передавать код.

Ответ 3

Быстрая версия кода выше: -

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
}

Но если вы загружаете информацию из JSON, вам нужно проверить, является ли JSON пустым или нет, поэтому, если вы помещаете такой код, он сначала показывает сообщение "Нет данных", затем исчезает. Потому что после перезагрузки таблицы сообщение скрывается. Таким образом, вы можете поместить этот код, где загружают данные JSON в массив. SO: -

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

Ответ 4

Вы можете попробовать этот элемент управления. Это довольно аккуратно. DZNEmptyDataSet

Или, если бы я был вами, я бы сделал это

  • Убедитесь, что ваш массив данных пуст.
  • Если он пуст, добавьте к нему один объект с именем "Нет данных"
  • Отобразить эту строку в файле cell.textLabel.text

Легкий peasy

Ответ 5

Swift3.0

Я надеюсь, что это сервер вашей цели...... В вашем UITableViewController.

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

Класс помощника с функцией:

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

Ответ 6

Swift 3 (обновлено):

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
}

Ответ 7

Я думаю, что самый элегантный способ решить вашу проблему - перейти от UITableViewController в UIViewController, который содержит UITableView. Таким образом вы можете добавить все UIView, которые вы хотите, в качестве подзонов основного вида.

Я бы не рекомендовал использовать UITableViewCell для этого, вам может понадобиться добавить дополнительные вещи в будущем, и все может быстро стать уродливым.

Вы также можете сделать что-то подобное, но это тоже не лучшее решение.

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

Ответ 8

Используйте этот код в методе numberOfSectionsInTableView: -

if ([array count]==0
{

    UILabel *fromLabel = [[UILabel alloc]initWithFrame:CGRectMake(50, self.view.frame.size.height/2, 300, 60)];                                                                                        
    fromLabel.text [email protected]"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];
}

Ответ 9

Вот решение, которое сработало для меня.

  • Добавьте следующий код в новый файл.

  • Измените класс таблицы на пользовательский класс "MyTableView" из раскадровки или .xib

(это будет работать только для первого раздела. Если вы хотите настроить больше, внесите изменения в функцию reloadData() MyTableView соответственно для других разделов)

открытый класс 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
        }
    }
}

}

Ответ 10

Я бы представил представление наложения, которое имеет вид и сообщение, которое вы хотите, если tableview не имеет никаких результатов. Вы можете сделать это в ViewDidAppear, поэтому у вас есть результаты, прежде чем показывать/не показывать представление.

Ответ 11

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

Ответ 12

Если вы не используете нижний колонтитул tableview и не хотите, чтобы tableview заполняло экран пустыми ячейками таблицы по умолчанию, я бы предположил, что вы установите нижний колонтитул tableview на пустой UIView. Я не знаю правильного синтаксиса для этого в obj-c или Swift, но в Xamarin.iOS я бы сделал это следующим образом:

public class ViewController : UIViewController
{
    UITableView _table;

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

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

        _table.TableFooterView = new UIView();
    }
}

Выше кода приведет к представлению таблицы без пустых ячеек

Ответ 13

Добавьте этот код в один файл и измените тип коллекции на 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
  }
}

Ответ 14

Если вы хотите сделать это без кода, попробуйте это!

Нажмите на свой tableView.

tableView Screenshot

Измените стиль с "простой" на "сгруппированный".

Table View properties screenshot-2

Теперь, когда вы используете....

tableView.backgroundView = ВСТАВИТЬ СВОЮ ЭТИКЕТКУ ИЛИ ВИД

Это не будет показывать разделители!