2011-03-07 38 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