2011-03-07 97 views
4

我想向用户显示文本以通知数据源中没有内容。例如,如果您没有联系人,则可以在联系人应用程序中看到这种行为,并在灰色文本的表格中间显示。有没有简单的方法来做到这一点,或者我必须使用一些技巧,如创建空单元格或其他东西..谢谢!如果数据源为空,则为tableview占位符文本

回答

8

没有(AFAIK)任何内置方式让表视图在空时显示消息。如果数据源为空,您可以让tableView:numberOfRowsInSection:返回1,并且tableView:cellForRowAtIndexPath:返回一个“虚拟”单元,表示没有数据。或者您可以添加自己的视图来显示相应的消息,完全忽略(空)表格视图。

1

我写了three different approaches in my blog

  • 去与失范所描述的简单的解决方案:在您的数据源方法使用条件。
  • 使用“神奇”的全部类别UITableView+NXEmptyView
  • 对于特殊情况(空,加载等)使用单独的数据源类。
+0

我不明白您的博客中implementatoin中的tableView numberOfRowsInSection将返回1,即使没有视图,然后你做,如果([tableView numberOfRowsInSection:0]> 0)检查数字是否高于0,我相信它会一直是因为你是默认返回1,你能解释这个解决方案吗? – Necronet 2014-01-03 11:39:24

+0

这个想法是,当表视图为空时,您有一个单独的数据源。在您的视图控制器中,如果底层数据发生变化(例如,用户添加/删除了某些内容),则检查哪个数据源适用。 – 2014-01-05 15:45:50

+1

我不得不说这个解决方案在检查NXEmptyView类别后非常糟糕。它在CATEGORY中调用了reloadData和layoutSubviews方法,你如何确保调用者不使用相同的黑客方法?我之前通过相同的解决方案,但我更喜欢为自定义tableview构建独立的空视图类。 – Itachi 2016-03-09 05:36:50

7

下面是一个简短而甜蜜的解决方案。

第一步,在你的UITableViewController初始化,添加:

UILabel *placeholder = [[UILabel alloc] init]; 
placeholder.font = [placeholder.font fontWithSize:20]; 
placeholder.numberOfLines = 0; // Use as many lines as needed. 
placeholder.text = NSLocalizedString(@"Your text here", nil); 
placeholder.textAlignment = NSTextAlignmentCenter; 
placeholder.textColor = [UIColor lightGrayColor]; 

placeholder.hidden = YES; // Initially hidden. 
[self.tableView addSubview:placeholder]; 

self.placeholder = placeholder; // You'll need a reference to the placeholder. 

第二步,在你的UITableViewController,添加:

- (void)viewWillLayoutSubviews 
{ 
    [super viewWillLayoutSubviews]; 

    self.placeholder.frame = self.tableView.bounds; 
} 

最后一步,显示/在需要的时候隐藏的占位符。

更好的解决方案是不使用UITableViewController。只需将一个tableView添加到UIViewController,然后将一个占位符视图添加到tableView上方的UIViewController。使用自动布局可使占位符垂直和水平居中。最后,在需要时显示/隐藏占位符。

你们对这个解决方案有什么看法?请给出意见。

+0

这对我来说很完美,在Swift中实现它。但我有个问题。最后一步“在需要时显示/隐藏占位符”。为此,在tableView(_:numberOfRowsInSection:)内部,在返回表格中的行数之前,我已经包含了:'placeholder.hidden = myDataSource.count> 0',并且就像我想要的那样工作,但我想知道它是否包含代码的正确位置。或者,如果该函数仅用于返回行数,而没有额外的代码。 – alondono 2014-11-15 10:02:01

4

在Swift 2。0

只是日历下面,我有一个实现代码如下

disregard the calendar

func TabelaSemDados(Array:NSArray){ 
    if Array.count == 0 { 
     tableView.tableFooterView = UIView(frame: CGRect.zero) 
     tableView.backgroundColor = UIColor.clearColor() 

     var label = UILabel() 
     label.frame.size.height = 42 
     label.frame.size.width = tableView.frame.size.width 
     label.center = tableView.center 
     label.center.y = (tableView.frame.size.height/2) 
     label.numberOfLines = 2 
     label.textColor = UIColor.grayColor() 
     label.text = "No Data Text" 
     label.textAlignment = .Center 
     label.tag = 1 

     self.tableView.addSubview(label) 
    }else{ 
     self.tableView.viewWithTag(1)?.removeFromSuperview() 
    } 
} 

称为viewdidapper:

override func viewDidAppear(animated: Bool) { 
    TabelaSemDados(self.Agenda) 
} 
+0

这是一个非常干净的解决方案,如果你的tableview不是从左边缘到右边缘,你需要将帧源添加到标签中心 – Johannes 2016-01-18 19:49:18