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í.
-
Agregue el siguiente código a un nuevo archivo.
-
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):
- Seleccione la escena en el Guión gráfico que tiene su vista de tabla.
- Arrastre un UIView vacío al "Scene Dock" de esa escena
- Agregue un UILabel y cualquier restricción a la nueva vista y luego cree un IBOutlet para esa vista
- Asigne esa vista a la tableView.backgroundView
- ¡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;
}