versiones guia espaƱol descargar actualizar ios objective-c uitableview parse.com parse-platform

ios - guia - qgis manual



Si no hay resultados de Vista de tabla, muestre "Sin resultados" en la pantalla (14)

Agregue este código en un archivo y cambie su tipo de colección a 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 } }

Tengo una vista de tableview , donde a veces puede que no haya resultados para enumerar, por lo que me gustaría poner algo que diga "sin resultados" si no hay resultados (¿una etiqueta o una celda de vista de tabla?).

¿Hay una manera más fácil de hacer esto?

Intentaría una label detrás de la vista de tableview luego ocultaría una de las dos en función de los resultados, pero como estoy trabajando con un TableViewController y no con un ViewController normal, no estoy seguro de qué tan inteligente o factible sea eso.

También estoy usando Parse y subclases como PFQueryTableViewController :

@interface TableViewController : PFQueryTableViewController

Puedo proporcionar cualquier información adicional necesaria, ¡solo házmelo saber!

TableViewController Scene en Storyboard:

EDITAR: Por Midhun MP, aquí está el código que estoy usando

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

Y aquí está la Vista que estoy obteniendo, todavía tiene líneas de separación. Tengo la sensación de que se trata de un pequeño cambio, pero no estoy seguro de por qué aparecen las líneas de separación.


Aquí está la solución que funcionó para mí.

  1. Agregue el siguiente código a un nuevo archivo.

  2. Cambie su clase de tabla a la clase personalizada "MyTableView" del guión gráfico o .xib

(esto funcionará solo para la primera sección. Si desea personalizar más, realice cambios en la función MyTableView reloadData () en consecuencia para otras secciones)

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


Creo que la forma más elegante de resolver su problema es cambiar de un UITableViewController a un UIViewController que contiene un UITableView . De esta manera, puede agregar cualquier UIView que desee como subvistas de la vista principal.

No recomendaría usar un UITableViewCell para hacer esto, es posible que necesite agregar cosas adicionales en el futuro y las cosas pueden ponerse feas rápidamente.

También puede hacer algo como esto, pero esta tampoco es la mejor solución.

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


Presentaría una vista superpuesta que tiene el aspecto y el mensaje que desea si la vista de tabla no tiene resultados. Puede hacerlo en ViewDidAppear, para que tenga los resultados antes de mostrar / no mostrar la vista.


Puede lograrlo fácilmente utilizando backgroundView propiedad backgroundView de UITableView .

C objetivo:

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

Rápido:

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 }

Referencia UITableView Class Reference

Propiedad backgroundView

La vista de fondo de la vista de tabla.

Declaración

Rápido

var backgroundView: UIView?

C objetivo

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

Discusión

La vista de fondo de una vista de tabla cambia automáticamente de tamaño para que coincida con el tamaño de la vista de tabla. Esta vista se coloca como una subvista de la vista de tabla detrás de todas las celdas, vistas de encabezado y vistas de pie de página.

Debe establecer esta propiedad en nil para establecer el color de fondo de la vista de tabla.


Puedes probar este control. Es bastante ordenado. DZNEmptyDataSet

O si fuera tú todo lo que haría es

  • Verifique si su matriz de datos está vacía
  • Si está vacío, agregue un objeto llamado @ "Sin datos"
  • Mostrar esa cadena en cell.textLabel.text

Pan comido


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


Si no utiliza el pie de página de la vista de tabla y no desea que la vista de tabla llene la pantalla con celdas de tabla predeterminadas vacías, le sugiero que configure el pie de página de vista de tabla en una UIView vacía. No sé la sintaxis correcta para hacer esto en obj-c o Swift, pero en Xamarin.iOS lo haría así:

public class ViewController : UIViewController { UITableView _table; public ViewController (IntPtr handle) : base (handle) { } public override void ViewWillAppear(bool animated) { // Initialize table _table.TableFooterView = new UIView(); } }

El código anterior dará como resultado una vista de tabla sin las celdas vacías


Si quieres hacer esto sin ningún código, ¡prueba esto!

Haga clic en su tableView.

Cambie el estilo de "simple" a "agrupado".

Ahora cuando usas ...

tableView.backgroundView = INSERTAR SU ETIQUETA O VER

¡No mostrará los separadores!


Swift 3 (actualizado):

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 }


Use este código en su método numberOfSectionsInTableView : -

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


Versión rápida del código anterior: -

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 }

Pero si está cargando información de un JSON, debe verificar si el JSON está vacío o no, por lo tanto, si coloca un código como este, inicialmente muestra el mensaje "Sin datos" y luego desaparece. Porque después de que la tabla vuelve a cargar los datos, el mensaje se oculta. Entonces, puede poner este código donde cargar datos JSON en una matriz. ENTONCES :-

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


Para Xcode 8.3.2 - Swift 3.1

Aquí hay una forma no tan conocida pero increíblemente fácil de lograr agregar una vista "Sin elementos" a una vista de tabla vacía que se remonta a Xcode 7. Te dejaré a ti controlar esa lógica que agrega / elimina el ver a la vista de fondo de la tabla, pero aquí está el flujo para el guión gráfico Xcode (8.3.2):

  1. Seleccione la escena en el Guión gráfico que tiene su vista de tabla.
  2. Arrastre un UIView vacío al "Scene Dock" de esa escena

  1. Agregue un UILabel y cualquier restricción a la nueva vista y luego cree un IBOutlet para esa vista

  1. Asigne esa vista a la tableView.backgroundView

  1. ¡Mira la magia!

En última instancia, esto funciona cada vez que desea agregar una vista simple a su controlador de vista que no necesariamente desea que se muestre de inmediato, pero que tampoco desea codificar manualmente.


Swift3.0

Espero que sirva su propósito ...... En su 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 } } }

Clase auxiliar con función:

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