Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 18

206
votes
answers
26 views
+10

Use didSelectRowAtIndexPath or prepareForSegue method for UITableView?

I'm using storyboards and I have a UITableView. I have a segue setup that pushes from my table to the detail VC. But which method should I use to handle this? I'll have to pass a couple objects to the detail view. But do I use didSelectRowAtIndex or -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender?

up vote 196 down vote accepted favorite
沙发
+1960
+50

如果您使用 prepareForSegue:sender:,那麼如果您以後決定從表視圖外的某些控件觸發segue,則不會有太多更改。

prepareForSegue:sender:消息被發送到當前視圖控制器,所以我建議這樣的事情:

   - (void)prepareForSegue:(UIStoryboardSegue *) segue sender:(id)sender {//假設self.view是表視圖NSIndexPath * path = [self.tableView indexPathForSelectedRow]; DetailObject * detail = [self detailForIndexPath:path]; [segue.destinationViewController setDetail:detail]; }   

在Swift中:

 覆蓋func prepareForSegue(segue:UIStoryboardSegue,sender:AnyObject?){let path = self.tableView.indexPathForSelectedRow()!segue.destinationViewController.detail = self.detailForIndexPath(path)}  
     
			
        

好的,您能舉例說明如何通過傳遞基於indexPath的對象來實現它。 - Jon 11年11月15日凌晨3點04分

我已經更新了我的答案。 - rob mayoff 11月15日11:47

不應該自我。只是發送者在這裡?我甚至無法使[self.view indexPathForSelectedRow]工作,我不得不做[sender indexPathForSelectedRow]; - ladookie 2011年12月23日17:26

你會如何在Swift中做到這一點? - 用戶2014年9月26日18:00

@macdonjo查看我的更新。 - rob mayoff 2014年9月26日18:43

+50

我做了這個並且它工作了

   - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {NSLog(@“Row Selected =%i”,indexPath 。行); [self performSegueWithIdentifier:@“testID”sender:self.view]; }  
     
			
        

這沒有意義。您應該使用segue或表視圖委託。只需從Cell創建一個segue,它將自動執行您所做的相同操作而無需編寫代碼。 - Yariv 2013年1月23日8:44

如何在沒有didSelectRow的情況下為單元格指定segue? - Morkrom 2013年11月27日17:15

+30

當sender是UITableViewCell時,你可以要求UITableView查詢單元格的indexPath。

 覆蓋func prepareForSegue(segue:UIStoryboardSegue,sender:AnyObject?){if let cell = sender as?UITableViewCell {let indexPath = self.tableView.indexPathForCell(cell)!assert(segue.destinationViewController.isKindOfClass(DetailViewController))讓detailViewController = segue.destinationViewController為!DetailViewController detailViewController.item = self.items [indexPath.row] //喜歡這個}}  
     
			
        
+10

如果你的tableView屬性在另一個類中並且只有一個部分,那麼你可以使用標記屬性來存儲單元格的行,如:

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@“cell”]; cell.tag = indexPath.row; 返回細胞; }   

然後您可以訪問它,因為 sender 是與其標記中的行值相同的單元格:

  - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {MyDestinationViewController * destinationViewController = segue.destinationViewController; destinationViewController.myProperty = [tableViewElementsArray objectAtIndex:[sender tag]]; //發件人將是你的手機}  
     
			
        
+10

self.tableView.indexPathForSelectedRow 返回選定的單元格,但不返回segue發送方單元格,例如未選擇發送方單元格(附件操作),或多選擇情況。最好的方法是為segue發送者獲取indexPath:

   - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {__auto_type itemViewController =(id< ItemViewController>)segue.destinationViewController ; itemViewController.senderIndexPath = [self.tableView indexPathForCell:sender]; }   

在Swift中:

 協議ItemViewController {var senderIndexPath:IndexPath?{get set} var selectedIndexPaths:[IndexPath]?{get set}}覆蓋func prepare(對於segue:UIStoryboardSegue,sender:任何?){if let cell = sender as?UITableViewCell,var itemViewController = segue.destination為?ItemViewController {itemViewController.senderIndexPath = tableView.indexPath(for:cell)itemViewController.selectedIndexPaths = tableView.indexPathsForSelectedRows}}  
     
			
        
0

如果您使用 prepareForSegue:,您可以檢查誰是發件人並執行不同的代碼

例如在swift中

 覆蓋func prepareForSegue (segue:UiStoryboardSegue,sender:AnyObject?){var senderIsTableviewCell:Bool!= sender?。isKindOfClass(UITableViewCell)if senderIsTableviewCell {// do something}}  
     
			
        

只是這樣做:如果讓tableViewCell =發送者為?UITableViewCell {//做某事}。如果發送者無法轉發到UITableViewCell,則“執行某些操作”將無法執行。 - mbeaty 2015年3月4日3:23

0
votes
answers
37 views
+10

iOS:如何在主線程中更新UI的後臺線程?

4

我實現了UIImageView單元的UITableView,每個單元通過NSTimer每隔5秒定期刷新一次。每個圖像在後臺線程中從服務器加載,並且從後臺線程中,我還通過調用performSelectorOnMainThread來更新UI,顯示新圖像。到現在爲止還挺好。iOS:如何在主線程中更新UI的後臺線程?

當我不等到一個圖像加載到當前單元格並且我快速向下滾動到一個新的單元格時,我目前遇到了一個問題。然而,這個新單元顯示的是前一個單元的圖像,而不是新單元的圖像。雖然下一輪的NSTimer會正確顯示圖像,但這可能會首先讓用戶感到困惑。

如果我不重用UITableView的單元格,問題就會消失,但如果在我的應用程序中顯示單元格的數量,這不是一個選項。

所以我能想到的唯一解決方案是取消(或殺死)後臺線程,如果我知道用戶執行滾動操作,將顯示舊圖像。

我想知道這可能不是最佳實踐,因此,尋求您的建議。

// In MyViewController.m 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ... 
    NSTimer* timer=[NSTimer scheduledTimerWithTimeInterval:ANIMATION_SCHEDULED_AT_TIME_INTERVAL 
               target:self 
               selector:@selector(updateImageInBackground:) 
               userInfo:cell.imageView 
               repeats:YES]; 
    ... 
} 

- (void) updateImageInBackground:(NSTimer*)aTimer 
{ 
    [self performSelectorInBackground:@selector(updateImage:) 
         withObject:[aTimer userInfo]]; 
} 

- (void) updateImage:(AnimatedImageView*)animatedImageView 
{  
    @autoreleasepool { 
     [animatedImageView refresh]; 
    } 
} 

// In AnimatedImageView.m 
-(void)refresh 
{ 
    if(self.currentIndex>=self.urls.count) 
     self.currentIndex=0; 

    ASIHTTPRequest *request=[[ASIHTTPRequest alloc] initWithURL:[self.urls objectAtIndex:self.currentIndex]]; 
    [request startSynchronous]; 

    UIImage *image = [UIImage imageWithData:[request responseData]]; 

    // How do I cancel this operation if I know that a user performs a scrolling action, therefore departing from this cell. 
    [self performSelectorOnMainThread:@selector(performTransition:) 
         withObject:image 
        waitUntilDone:YES]; 
} 

-(void)performTransition:(UIImage*)anImage 
{ 
    [UIView transitionWithView:self duration:1.0 options:(UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionAllowUserInteraction) animations:^{ 
     self.image=anImage; 
     currentIndex++; 
    } completion:^(BOOL finished) { 
    }]; 
} 
+1

WWDC 2012會話211詳細介紹了這一點,其中包括不同級別的隊列取消,優化等。這是一個很棒的視頻。 'cellForRow'中的 – jrturton 2012-07-23 09:54:58

+0

,爲什麼不立即設置圖像爲零?這樣,它會暫時空白,而不是錯誤的圖像。 – user102008 2012-07-23 17:55:35

+0

@ user102008我這樣做了,但它不起作用。錯誤的圖像已經在主線程中排隊(刷新處於執行過程中),等待顯示。 – 2012-07-23 22:05:49

沙发
0
1

好(我,因爲我的要求就是顯示一組從服務器中加載循環圖片也不能使用SDWebImage)... 另一種方式來做到這將是把您的「形象請求代碼」到你的AnimatedImageView,並失去每次設定一個新的圖像URL時掛起的請求

// your controller 
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    ... 
    [cell.imageView setDistantImage:imageURL]; 
    ...  
    } 

然後,在你的手機類,「setDistantImage」創建ASIHttpRequest和無效前一個

//your ImageView class 

@property (...) ASIHttpRequest *distantImageRequest; 

- (void) setDistantImageUrl:(NSUrl *)imageUrl 
{ 
    //clear previous request 
    [distantImageRequest clearDelegatesAndCancel]; 
    //set a new request, with the callBack embedded directly in this ImageView class 
    ... 
} 

//animation and callBacks methods in this ImageView class too... 
板凳
0
0

我的CollectionView & TableView中有重用的小區覆蓋所有具有快速和長期滾動下載的圖像加載許多圖像時有完全相同的問題。

對於TableView,我解決了它在'didEndDisplayingCell'方法出現的地方看WWDC 2012,但是這對於沒有這種方法的CollectionView來說並不是有用的。 :O(

最後,我發現了兩個......幸運的是解決方案 的想法是創建ImageLoader的從TableView中或的CollectionView和細胞叫,這將是負責。下載圖像 在您的實現,添加這段代碼隱藏變量到世界其他地區:

@interface ImageLoader() { 
__block NSURLSession *_session; 
} 

然後,添加下列功能的實現:

- (void)getViewForCell:(UIImageView*)cell 
       FromURL:(NSURL*)url { 

NSBlockOperation *_loadImageOp; 
__block NSOperationQueue *_opQueue; 

_opQueue = [[NSOperationQueue alloc]init]; 

if (_session != nil) { 
    [_session invalidateAndCancel]; 
} 

_loadImageOp = [[NSBlockOperation alloc]init]; 
[_loadImageOp addExecutionBlock:^{ 

    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    _session = [NSURLSession sessionWithConfiguration:config 
              delegate:nil 
             delegateQueue:_opQueue]; 

    NSURLSessionDownloadTask *downloadTask = [_session downloadTaskWithURL:url 
                 completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) { 
     UIImage *imageCell = [UIImage imageWithData:[NSData dataWithContentsOfURL:location]]; 

     if (imageCell) { 
      [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
       cell.image = imageCell; 
      }]; 
     } else { 
      [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
       cell.image = [UIImage imageNamed:@"imageNotWorking.png"]; 
      }]; 
     } 
    }]; 

    [downloadTask resume]; 
}]; 

[_opQueue addOperation:_loadImageOp]; 
} 

這個想法是1 /。您創建一個塊,其中成員變量_session將通過downloadTask,2 /獲取傳入參數中給定的url。在下載時通過mainQueue將圖像顯示到用戶界面... 3 /。最初創建的塊被添加到專用於該特定重用單元的隊列中。

重要的是'invalidateAndCancel'函數被調用,如果成員變量不是零,因爲每次你想重用單元格時,前一個會話將不會返回最後一個圖像,而是新定義的傳入參數'url'。

然後,不要忘記在您的TableView/CollectionView單元類中放置1 /。以下代碼片段,以便爲每個重複單元使用一個imageLoader和2 /要在方法中調用的方法'的tableView:的cellForRowAtIndexPath:' 你的CollectionView的/ TableView中:

@interface TableCell() { //...or CollectionCell :o) 
ImageLoader *_imgLoader; 
} 
@end 

@implementation TableCell 
- (instancetype)initWithCoder:(NSCoder *)aDecoder { 
self = [super initWithCoder:aDecoder]; 
_imgLoader = [[ImageLoader alloc]init]; 
return self; 
} 

- (void)imageURL:(NSURL*)url { 
[_imgLoader getViewForCell:self.imageViewWhereTheDownloadedImageIs 
        FromURL:url]; 
} 
@end 

一旦完成,只需調用該方法[cell imageURL:url] '的tableView:的cellForRowAtIndexPath:' 你的CollectionView/TableView中的。

現在,您可以儘可能快地滾動,並且始終具有適當的圖像,而且只有這一個。

我希望它能幫助...很好。 :o)

0
votes
answers
32 views
+10

UITableViewCells停止X細胞後正確顯示

2

雨燕4 + Xcode的9UITableViewCells停止X細胞後正確顯示

我一直在這個問題上幾個星期,試圖解決它自己。我希望任何人都可以提供幫助。我沒有在我最初的問題中發佈任何代碼,因爲它是專有的。如果需要幫助解決我的問題,我會很樂意提供。

我有一個自定義的細胞,其含有子視圖,其中一些被隱藏或顯示(使用1000-priorityheight=0約束其期間cellForRowAt添加和刪除),這取決於數據的一個非常複雜的佈局的UITableView。還有一個ImageView,它應該始終是全寬,並且應該更改高度以匹配通過Kingfisher.shared.retrieveImage()加載的圖像。一旦我有了圖像,我就更新了該單元圖像上的aspectRatio約束,並顯示單元格。這適用於前15-20個單元格,但當我滾動更多行時,它會停止運行。圖像很小,居中,某些數據字段沒有更新等。如果我繼續滾動,有時候一個單元格會在這裏和那裏正確行爲,但幾乎都不會。

現在有趣的部分:如果我滾動備份,每一個單元格會自動重新格式化,看起來應該是這樣,之後,每個單元格都是完美的。代碼顯然是有效的 - 我覺得這可能是平臺中的一個bug,但在我假設之前,我想看看是否有其他人遇到過這樣的問題。

再次,非常感謝您提供的任何幫助 - 我非常渴望解決這個問題。

更新:要回答幾個問題,這裏是自定義單元類的一部分代碼片段。這是我如何設置單元格的圖像(其中包括更新寬高比約束),以及如何重置單元格以供重用。

internal var aspectConstraint : NSLayoutConstraint? { 
    didSet { 
     if oldValue != nil { 
      imageView.removeConstraint(oldValue!) 
     } 
     if aspectConstraint != nil { 
      imageView.addConstraint(aspectConstraint!) 
     } 
    } 
} 

override func prepareForReuse() { 
    super.prepareForReuse() 
    aspectConstraint = nil 
    imageView.image = nil 
    for view in subviews { 
     for c in view.constraints { 
      if c.firstAttribute == NSLayoutAttribute.height && c.constant == 0 { 
       view.removeConstraint(c) 
      } 
     } 
    } 
} 

func setCustomImage(image : UIImage) { 
    let aspect = image.size.width/image.size.height 
    let constraint = NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: imageView, attribute: NSLayoutAttribute.height, multiplier: aspect, constant: 0.0) 
    constraint.priority = UILayoutPriority(999) 
    aspectConstraint = constraint 
    imageView.image = image 
} 
+0

可以請你分享一下pic @ joel –

+0

聽起來好像你可能因爲單元重用而有額外的約束。你在做什麼來確保當一個單元格被重用時刪除了添加的任何約束條件?你如何更新縱橫比約束? – vacawama

+0

添加到@vacawama所說的內容:這聽起來很像是單元重用問題。罪魁禍首可能在你的'prepareForReuse'方法中。這應該重置每個被重用到原始狀態的單元。 – Gereon

沙发
0
0

對於任何涉及到誰這個問題,因爲完全缺乏對這個問題的解決方法,我得出的結論是UIKit中是不適合我的目的。我用Texture(以前稱爲AsyncDisplayKit)去了,我的進度已經恢復。

311
votes
answers
14 views
+10

UITableViewHeaderFooterView: Unable to change background color

I'm trying to change the background color of UITableViewHeaderFooterView. Although the view is appearing, the background color remains the default color. I'm getting a log from xcode saying:

Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.

However, none of the following options work:

myTableViewHeaderFooterView.contentView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundColor = [UIColor blackColor];

I've also tried changing the background color of the view in the xib file.

Any suggestions? Thanks.

up vote 75 down vote accepted favorite
沙发
+750
+50

您應該使用myTableViewHeaderFooterView.tintColor,或者為myTableViewHeaderFooterView.backgroundView指定自定義背景視圖。

myTableViewHeaderFooterView.tintColor完美運行。謝謝你的回答! - 2013年3月24日23:01

不知道為什麼,但對我來說tintColor不適用於iOS7。我只能通過分配自定義視圖來改變顏色:myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@“myImage.png”]]; - skywinder 2014年1月16日6:28

TintColor不是背景色!! - JoãoNunes於2014年10月1日12:29

仍然可以在iOS 12上運行。 - Yonat 18年11月7日在13:29

+1730

iOS 8,9,10,11 ......

設置任何顏色(使用任何alpha)的唯一方法是使用 backgroundView < p> Swift

  self.backgroundView = UIView(frame:self.bounds)self.backgroundView.backgroundColor = UIColor(白色:0.5,alpha:0.5)  

Obj-C

  self .backgroundView =({UIView * view = [[UIView alloc] initWithFrame:self.bounds]; view.backgroundColor = [UIColor colorWithWhite:0.5 alpha:0.5]; view;});   

對評論的回應

  • 這些其他選項都沒有可靠地工作(儘管下面的評論)

      // self。 contentView.backgroundColor = [UIColor clearColor]; // self.backgroundColor = [UIColor clearColor]; // self.tintColor = [UIColor clearColor];    
  • 自動調整 backgroundView 的大小。(無需添加約束)

  • 使用 UIColor(白色:0.5,alpha:0.5)或<控制alpha code> backgroundView.alpha = 0.5
    (當然,任何顏色都可以)

  • 使用時XIB ,使根視圖成為< 代碼> UITableViewHeaderFooterView 並以編程方式關聯 backgroundView

    註冊:

      tableView.register(UINib(nibName:”View“,bundle:nil),forHeaderFooterViewReuseIdentifier:”header“)  

    加載:

     覆蓋func tableView(_ tableView:UITableView,viewForHeaderInSection section:Int) - &gt; UIView的?{if let header = tableView.dequeueReusableHeaderFooterView(withIdentifier:“header”){let backgroundView = UIView(frame:header。
         
    			
            

contentView不存在,這就是原因。tintcolor是為視圖著色而不是它的背景。和backgroundcolor已棄用。因此,您的方式是使其工作的方式。Btw很好的代碼語法 - JoãoNunes2014年10月1日12:30

這對我有用。謝謝! - Tuslareb 2014年10月5日7:48

@JoãoNunes,C#/ Xamarin的語法更整潔:view.BackgroundView = new UIView(view.Bounds){BackgroundColor = UIColor.Clear}; - crishoj 2014年11月3日6:03

在Xcode 6.1.1中,您會收到運行時控制台警告:不建議在UITableViewHeaderFooterView上設置背景顏色。請改用contentView.backgroundColor。 - Albert Bori 14年6月6日4:38

對於仍然收到警告的人:確保UITableViewHeaderFooterView沒有在IB中設置backgroundColor。 - Tuslareb 2016年2月13日19:40

+180

在iOS 7 contentView.backgroundColor 為我工作, tintColor 沒有。

  headerView.contentView.backgroundColor = [UIColor blackColor ]。  

雖然 clearColor 對我來說不起作用,但我找到的解決方法是將 backgroundView 屬性設置為透明圖像。也許它會幫助某人:

  UIGraphicsBeginImageContextWithOptions(CGSizeMake(1,1),NO,0.0); UIImage * blank = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); headerView.backgroundView = [[UIImageView alloc] initWithImage:blank];  
     
			
        

我認為這是比@SwiftArchitect的答案更好的方法(雖然它有效)。您不必添加新的UIView這一事實會讓事情變得更好。為我工作完美。 - ErickA.Montañez17年10月11日20:13

這應該是公認的答案 - onmyway133 2月9日'18在10:27

+110

確保為 UITableViewHeaderFooterView 設置 contentView 的backgroundColor:

  self.contentView.backgroundColor = [UIColor whiteColor] ;   

然後就可以了。

iOS> = 10只!對於iOS <10使用:backgroundView?.backgroundColor = UIColor.white - Peter Kreinz 17年6月21日在7:43

+90

對我來說,我嘗試了上述所有內容但仍然收到警告“在UITableViewHeaderFooterView上設置背景顏色已被棄用。請改用contentView.backgroundColor。” 然後我嘗試了這個:在xib文件中,標題視圖的背景顏色被選中以清除顏色而不是默認顏色,一旦我將其更改為默認警告就消失了。

+50

對於清晰的顏色,我使用

  self.contentView.backgroundColor = [UIColor clearColor]; self.backgroundView = [UIView new]; self.backgroundView.backgroundColor = [UIColor clearColor];   

對我來說似乎很好。

設置backgroundView = UIView()然後backgroundColor = .clear是唯一可行的解​​決方案。謝謝。 - Vive 17年5月16日7:58

+40

iOS9 headerView.backgroundView.backgroundColor 為我工作:

   - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {TableViewHeader * headerView =(TableViewHeader *)[super tableView:tableView viewForHeaderInSection:section]; headerView.backgroundView.backgroundColor = [UIColor redColor]; }   

iOS8 上我使用 headerView.contentView.backgroundColor 沒有問題,但現在使用iOS 9,我變得很奇怪使背景顏色不填充細胞的整個空間的問題。所以我嘗試了 headerView.backgroundColor ,我從OP得到了同樣的錯誤。

不推薦在UITableViewHeaderFooterView上設置背景顏色。請改用contentView.backgroundColor。

所以現在一切都很好,沒有警告,使用 headerView.backgroundView.backgroundColor

+40

如果使用 xib 文件創建 UITableViewHeaderFooterView 的自定義子類,則應覆蓋 setBackgroundColor 保持空虛。

   - (void)setBackgroundColor:(UIColor *)backgroundColor {}   

這將解決您的問題。

這對我來說是正確的答案。雖然我沒有在HeaderFooterView中設置任何背景顏色,但警告消息在我的控制台日誌中不斷出現。很煩人! - stan liu 2017年2月15日6:45

安裝Snow Leopard和新的iPhone SDK(Xcode 3.2)後會發生這種情況嗎? - avocade 09年9月28日在13:45

我的回答解決了這個問題。請檢查。 - 約旦2010年10月16日14:44

在答案中未討論的另一種可能性是,如果您添加了對非通用框架的引用(即您添加了armv6 / armv7框架,然後嘗試進行模擬器構建),則會出現此錯誤。如果您構建自己的自定義框架,這主要是一個問題。 - 2011年5月26日在23:11

@aroth也是正確的,請檢查這個問題 - ArkReversed 2013年9月19日8:44

+40

如果您自定義某個部分帶有Storyboard / Nib 的標題單元格,然後確保“Table Section Header”視圖的背景顏色為默認

如果您繼承 UITableViewHeaderFooterView ,並且使用nib,那麼你要做的就是為內容視圖創建一個 IBOutlet ,並將其命名為。<代碼> containerView 這不要與 contentView 混淆,後者是此容器視圖的父級。

使用該設置,您可以更改 containerView 的背景顏色

+40

在界面構建器中,拉出.xib,在頂部元素上,在屬性檢查器中將背景顏色設置為默認值。然後轉到內容視圖並在那裡設置背景顏色(參考 https:// github的.com / jiecao-FM / SwiftTheme /問題/ 24 )。

謝謝,我的pbxproj文件中也有一個迷路的LIBRARY_SEARCH_PATHS密鑰。密鑰在Xcode 3的項目設置中以粗體顯示,但沒有任何價值。這讓我相信有些不對勁。我確實在Xcode 4 Preview 5中打開了一次項目,之後發生了這種情況。 - mvexel 2011年1月11日11:13

+30

對於純色背景,設置 contentView.backgroundColor 應該足夠了:

  func tableView(_ tableView:UITableView,willDisplayHeaderView視圖:UIView,forSection部分: Int){if let headerView = view as?UITableViewHeaderFooterView {headerView.contentView.backgroundColor = .red // Works!  

對於具有透明度的顏色,包括 .clear 顏色,這不再有效:

  func tableView(_ tableView :UITableView,willDisplayHeaderView視圖:UIView,forSection section:Int){if let headerView = view as?UITableViewHeaderFooterView {headerView.contentView.backgroundColor = .clear //不起作用 
			
        

這是我的問題。每次我添加一個新庫時,它都添加了一堆搜索目錄。即使我刪除引用曾經導致問題的搜索目錄條目。 - darshansonde 12年1月18日13:43

在我的案例中,“框架搜索路徑”已經是空的。我得到的確切錯誤是ld:為iOS模擬器構建,但是為針對架構i386 clang的MacOSX文件'/usr/lib/libSystem.B.dylib'構建的dylib鏈接:錯誤:鏈接器命令失敗,退出代碼為1(使用-v來查看調用我在Mavericks上使用SDK 7.0。 - Ans 10年3月30日在5:02

我有同樣的錯誤,我從構建設置下的框架搜索路徑中刪除了值,現在它成功編譯。 - Nirav 2015年9月12日14:33

+10

我嘗試使用appearanceWhenContainedIn鏈,它對我有用。

  [[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class],[UITableView class],nil] setBackgroundColor:[UIColor.grayColor] ]。 
     
			
        

我有同樣的問題讓我絕對瘋狂。看起來你們知道解決方案,但我找不到“project.pbxproj”文件,找不到“編輯項目設置”所在的位置。 - saman01 11年7月7日在2:56

在XCode 4.2.1中,我發現如下:在Project Navigator中單擊項目名稱。在出現的屬性屏幕中,選擇“構建設置”選項卡。搜索路徑位於此屏幕中。刪除它們對我有用。 - dsteele 12年12月12日23:16

0

使用清晰的顏色設置BackgroundView可以正常顯示可見標題。如果滾動表以顯示底部的標題,則此解決方案將失敗。

PSMy表僅包含沒有任何單元格的標題。

0

Swift:

  func tableView(tableView:UITableView,viewForHeaderInSection section:Int) - &gt; UIView {var headerView:TableViewHeader = super.tableView(tableView,viewForHeaderInSection:section)as!TableViewHeader headerView.backgroundView.backgroundColor = UIColor.redColor()}  
     
			
        
0

創建UIView並設置背景顏色,然後將其設置為self.backgroundView。

   - (void)setupBackgroundColor:(UIColor *)color {UIView * bgView = [[UIView alloc] initWithFrame :self.bounds]; bgView.backgroundColor = color; self.backgroundView = bgView; }  
     
			
        

我要開始一個新項目。哦,井。 - Gabe Shahbazian 09年9月23日0:59

您可以從目標的信息面板修復“框架搜索路徑”構建設置。 - 約翰Cromartie 09年9月23日在16:48

我收到了錯誤,但沒有上述框架問題。奇怪的是,在一台計算機上,該項目可以從SVN中檢出並構建得很好,而在另外兩台計算機上,它突然導致每次構建時出現此錯誤。在嘗試各種其他解決方案之後,唯一(而且相當簡單)的修復方法是創建一個新的空白項目並將所有文件移入其中。 - mmattke 2011年9月8日18:18

這種方法對我有用。我有一個工作項目集,突然停止構建一天只有一個配置。沒理由。使用上面的textmate技術並註意到該配置中缺少“$(SDKROOT)/ Developer / Library / Frameworks”。不知道為什麼,我無法使用Xcode看到這一點。 - Rob於2012年5月12日19:22

0

我覺得有必要分享我的經驗。我有這段代碼適用於iOS 10和iOS 11 headerView?.contentView.backgroundColor = .lightGray

然後我突然決定部署應用程序對於iOS 9,因為有一些設備(一些老一代的iPad mini不會更新到9以上的任何操作系統) - 適用於所有iOS 9,10和11的唯一解決方案是為頭部定義一個基本視圖,然後包含所有其他標題子視圖,從故事板開始連接並設置該基本視圖的 backgroundColor

在連接插座時,您需要注意不要調用它: backgroundView 因為在某些超類中已經存在具有該名稱的屬性。我叫我<

模擬器是否支持AppleScript? - Rog 3月28日'09時8:00

是的,它確實。我編寫了一個AppleScript來遍歷每個設備和操作系統版本的所有iOS模擬器並重置其內容和設置:github.com/michaelpatzer/ResetAllSimulators - mpatzer 2014年5月27日14:24

0

可能因為backgroundView不存在

 覆蓋func draw(_ rect:CGRect){//繪圖代碼讓view = UIView()view.frame = rect self.backgroundView =查看self.backgroundView?.backgroundColor = UIColor.yourColorHere}   

對我有用。

在代碼中添加一些說明。 - 比拉2012年12月17日9:47

那些字段已經是空的。我仍然得到這樣的錯誤。 - Dainius Kreivys 2016年9月17日22:53

0
votes
answers
42 views
+10

JavaFX:通過選定的組合框更新tableview上下文(綁定)

0

我想通過選擇組合框項目從數據庫顯示數據。 Combobox包含我的數據庫中用戶可以選擇的列。我嘗試了這一點,combobox是好的,代碼工作沒有錯誤,但表不更新。JavaFX:通過選定的組合框更新tableview上下文(綁定)

控制器類:

package application; 

    import java.io.IOException; 
    import java.net.URL; 
    import java.sql.PreparedStatement; 
    import java.sql.ResultSet; 
    import java.util.ResourceBundle; 

    import javafx.collections.FXCollections; 
    import javafx.collections.ObservableList; 
    import javafx.event.ActionEvent; 
    import javafx.fxml.FXML; 
    import javafx.fxml.FXMLLoader; 
    import javafx.fxml.Initializable; 
    import javafx.scene.Node; 
    import javafx.scene.Parent; 
    import javafx.scene.Scene; 
    import javafx.scene.control.ComboBox; 
    import javafx.scene.control.TableColumn; 
    import javafx.scene.control.TableView; 
    import javafx.scene.control.cell.PropertyValueFactory; 
    import javafx.stage.Stage; 

     public class SortareDupaAngajatiController implements Initializable{ 
      final ObservableList<tableAngajati> data=FXCollections.observableArrayList(); 
      final ObservableList<String> optiuni=FXCollections.observableArrayList(); 
      PreparedStatement intabel=null; 
      ResultSet rezultate=null; 
      String prequery; 
      String postquery; 

      @FXML 
      public ComboBox<String> meniu; 
      @FXML 
      TableView<tableAngajati> tabelangajati; 

      @FXML 
      private TableColumn<tableAngajati,String> numesediucol; 

      @FXML 
      private TableColumn<tableAngajati,Integer> angajaticol; 

      @Override 
      public void initialize(URL location, ResourceBundle resources) { 

       comboMeniu(); 
       insertInTabel(); 


      } 


      public void comboMeniu(){ 
       try { 
        String query = "SELECT * FROM maginfo"; 
        PreparedStatement dindb = Conexiune.conexiuneBd.prepareStatement(query); 
        ResultSet rezultate = dindb.executeQuery(); 


        while (rezultate.next()) { 
         optiuni.add(rezultate.getString("nume")); 
         meniu.setItems(optiuni); 
        } 
        dindb.close(); 
        rezultate.close(); 
      } 
      catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
      } 

      public void insertInTabel(){ 

     try { 
        prequery="SELECT * FROM sediu where nume='"+meniu.getValue()+"'ORDER BY numarangajati DESC"; 
        postquery=prequery; 
        intabel= Conexiune.conexiuneBd.prepareStatement(postquery); 
        rezultate=intabel.executeQuery(); 

        while(rezultate.next()){ 
         data.add(new tableAngajati(
           rezultate.getString(2), 
           rezultate.getInt(7) 
           )); 


        } 

        intabel.close(); 
        rezultate.close(); 

       } catch (Exception e) { 
        System.err.println(e); 
       } 

       numesediucol.setCellValueFactory(new PropertyValueFactory<>("numesediu")); 
       angajaticol.setCellValueFactory(new PropertyValueFactory<>("numarangajati")); 
       tabelangajati.setItems(null); 
       tabelangajati.setItems(data); 

      }} 

表類:

 

    package application; 

    public class tableAngajati { 
     private String numesediu; 
     private int angajati; 


     public tableAngajati(String numesediu, int angajati) { 
      super(); 
      this.numesediu=numesediu; 
      this.angajati=angajati; 
     } 

     public String getNumesediu(){ 
      return numesediu; 
     } 

     public void setNumesediu(String numesediu){ 
      this.numesediu=numesediu; 
     } 

     public int getNumarangajati(){ 
      return angajati; 
     } 

     public void setNumarangajati(int angajati){ 
      this.angajati=angajati; 
     } 

    } 

非常感謝!

+1

顯示'fxml'文件 –

+0

@mrmcwolf我下面張貼的FXML。謝謝! – AnoGio

沙发
0
0

FXML文件:

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.ComboBox?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.control.ScrollPane?> 
<?import javafx.scene.control.Separator?> 
<?import javafx.scene.control.TableColumn?> 
<?import javafx.scene.control.TableView?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.layout.Pane?> 
<?import javafx.scene.text.Font?> 

<AnchorPane prefHeight="389.0" prefWidth="620.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SortareDupaAngajatiController"> 
    <children> 
     <Separator layoutX="178.0" orientation="VERTICAL" prefHeight="382.0" prefWidth="0.0" /> 
     <Pane layoutX="-9.0" layoutY="-1.0" opacity="0.6" prefHeight="390.0" prefWidth="190.0" style="-fx-background-color: #0074D9;"> 
     <children> 
      <Button layoutX="35.0" layoutY="20.0" mnemonicParsing="false" onAction="#arataHome" prefHeight="100.0" prefWidth="130.0" style="-fx-background-color: #FFF;" text="Home" /> 
      <Button layoutX="35.0" layoutY="146.0" mnemonicParsing="false" onAction="#arataAdaugareSediu" prefHeight="100.0" prefWidth="130.0" style="-fx-background-color: #FFF;" text="Adauga sediu" /> 
      <Button layoutX="35.0" layoutY="272.0" mnemonicParsing="false" onAction="#arataAdaugareMagazin" prefHeight="100.0" prefWidth="130.0" style="-fx-background-color: #FFF;" text="Adauga supermarket" /> 
     </children> 
     </Pane> 
     <Label layoutX="195.0" layoutY="10.0" text="Sortare supermarket-uri dupa nr. de angajati din toate sediile" wrapText="true"> 
     <font> 
      <Font name="Berlin Sans FB" size="16.0" /> 
     </font> 
     </Label> 
     <ScrollPane layoutX="194.0" layoutY="38.0" prefHeight="304.0" prefWidth="414.0"> 
     <content> 
      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="361.0" prefWidth="399.0"> 
       <children> 
        <TableView fx:id="tabelangajati" layoutX="1.0" layoutY="30.0" prefHeight="338.0" prefWidth="411.0"> 
        <columns> 
         <TableColumn fx:id="numesediucol" prefWidth="204.0" sortable="false" text="Sedii" /> 
         <TableColumn fx:id="angajaticol" prefWidth="193.0" sortable="false" text="Numar angajati" /> 
        </columns> 
        </TableView> 
        <ComboBox fx:id="meniu" layoutX="100.0" layoutY="3.0" prefHeight="25.0" prefWidth="209.0" promptText="Selectati supermarket-ul" /> 
       </children></AnchorPane> 
     </content> 
     </ScrollPane> 
     <Button layoutX="556.0" layoutY="354.0" mnemonicParsing="false" onAction="#Inapoi" text="Inapoi" /> 
    </children> 
</AnchorPane> 

+0

將'onAction =「#insertInTabel」'添加到'ComboBox fx:id =「meniu」'中。 –

+0

@mrmcwolf非常感謝你!代碼有效,但是當我從菜單中選擇其他項目時,表格不刷新,它包含之前所有選定的項目。 – AnoGio

+0

@mrmcwolf我做了!我添加'data.removeAll(data);'到insertInTabel嘗試。感謝您的關注! – AnoGio

339
votes
answers
30 views
+10

Handling an empty UITableView. Print a friendly message

I have a UITableView that in some cases it is legal to be empty. So instead of showing the background image of the app, I would prefer to print a friendly message in the screen, such as:

This list is now empty

What is the simplest way to do it?

up vote 153 down vote accepted favorite
沙发
+1530
+50

UITableView的backgroundView屬性是你的朋友。

viewDidLoad 或你 reloadData 的任何地方,你應該確定你的表是否為空,使用包含UILabel的UIView更新UITableView的backgroundView屬性,或者將其設置為nil。就是這樣。

當然可以讓UITableView的數據源執行雙重任務並返回一個特殊的“list is empty”單元格,它讓我感覺像是一個kludge。突然 numberOfRowsInSection:(NSInteger)部分必須計算未被詢問的其他部分的行數,以確保它們也是空的。您還需要創建一個具有空消息的特殊單元格。也不要 忘記你需要改變單元格的高度來容納空信息。這一切都是可行的,但看起來像創可貼上的創可貼。

+770

基於這裡的答案,這裡是一個快速的類,我可以在你的 UITableViewController 中使用。

  import Foundation import UIKit class TableViewHelper {class func EmptyMessage(message:String,viewController:UITableViewController){let rect = CGRect(origin:CGPoint(x:0,y:0),size:CGSize(width:self.view.bounds.size.width,height:self。 view.bounds.size.height))讓messageLabel = UILabel(frame:rect)messageLabel.text = message messageLabel.textColor = UIColor.blackColor()messageLabel.numberOfLines = 0; messageLabel.textAlignment = .Center; messageLabel.font = UIFont(名稱:“TrebuchetMS”,大小:15)messageLabel.sizeToFit()viewController.tableView.backgroundView = messageLabel; viewController.tableView.separatorStyle = .None;   

UITableViewController 中,您可以在 numberOfSectionsInTableView(tableView:UITableView) - &gt;中調用它。Int

 覆蓋func numberOfSectionsInTableView(tableView:UITableView) - &gt; Int {if projects.count&gt; 0 {return 1} else {TableViewHelper.EmptyMessage(“你還沒有任何項目。你最多可以創建10個。”,viewController:self)return 0}}   

< a href =“https://i.stack.imgur.com/wpbHj.png”rel =“noreferrer”> <

+470

與Jhonston的答案相同,但我更喜歡它作為擴展名:

 擴展名UITableView {func setEmptyMessage(_ message:String){let messageLabel = UILabel(frame:CGRect(x:0) ,y:0,width:self.bounds.size.width,height:self.bounds.size.height))messageLabel.text = message messageLabel.textColor = .black messageLabel.numberOfLines = 0; messageLabel.textAlignment = .center; messageLabel.font = UIFont(名稱:“TrebuchetMS”,大小:15)messageLabel.sizeToFit()self.backgroundView = messageLabel; self.separatorStyle = .none; } func restore(){self.backgroundView = nil self.separatorStyle = .singleLine}}   

用法:

  override func tableView(_ tableView:UITableView,numberOfRowsInSection section:Int) - &gt; Int {if things.count == 0 {self.tableView.setEmptyMessage(“My Message”)} else {self.tableView.restore()} return things.count}  
     
			
        

謝謝你的建議。 - ssowri1 4月26日'18在12:01

擴展更好!謝謝。 - Ogulcan Orhan 18年8月19日9:41

喜歡延伸:) - Alix 3月1日15:53

+140
viewDidLoad 添加以下代碼行:
  tableView.emptyDataSetSource = self tableView.emptyDataSetDelegate = self tableView.tableFooterView = UIView()  

現在你要做的就是顯示空狀態:

  //為空數據集添加標題func titleForEmptyDataSet(scrollView:UIScrollView!) - &gt; NSAttributedString!{let str =“Welcome”let attrs = [NSFontAttributeName:UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)] return NSAttributedString(string:str,attributes:attrs)} //在空數據集func descriptionForEmptyDataSet(scrollView:UIScrollView!)上添加描述/副標題 - &GT; NSAttributedString!{let str =“點擊下面的按鈕添加你的第一個grokkleglob。” let attrs = [NSFontAttributeName:UIFont.preferredFontForTextStyle(UIFontTextStyleBody)] return NSAttributedString(string:str,attributes:attrs)} //添加你的圖片func imageForEmptyDataSet(scrollView:UIScrollView!) - &gt; UIImage的!{return UIImage(named:“MYIMAGE”)} //添加你的按鈕功能buttonTitleForEmptyDataSet(scrollView:UIScrollView!,forState state:UIControlState) - &gt; NSAttributedString!{let str =“Add Grokkleglob”let attrs = [NSFontAttributeName:UIFont.preferredFontForTextStyle(UIFontTextStyleCallout)] return NSAttributedString(string:str,attributes:attrs)} //為按鈕func添加動作emptyDataSetDidTapButton(scrollView:UIScrollView!){let ac = UIAlertController(標題:“按鈕點擊!”,消息:nil,preferredStyle:.Alert)ac。addAction(UIAlertAction(標題:“Hurray”,樣式:.Default,handler:nil))presentViewController(ac,animated:true,completion:nil)}   

這些方法不是強制性的,也可以只顯示沒有按鈕等的空狀態。

對於Swift 4

  // MARK: - 處理空數據集//添加空數據集函數標題的標題(forEmptyDataSet _:UIScrollView!) - &gt; NSAttributedString!{let str =“Welcome”let attrs = [NSAttributedStringKey.font:UIFont.preferredFont(forTextStyle:UIFontTextStyle.headline)] return NSAttributedString(string:str,attributes:attrs)} //在空數據集func描述中添加描述/副標題( forEmptyDataSet _:UIScrollView!) - &gt; NSAttributedString!{let str =“點擊下面的按鈕添加你的第一個grokkleglob。” let attrs = [NSAttributedStringKey.font:UIFont.preferredFont(forTextStyle:UIFontTextStyle.body)] return NSAttributedString(string:str,attributes:attrs)} //添加你的圖像func圖像(forEmptyDataSet _:UIScrollView!) - &gt; UIImage的!{return UIImage(named:“MYIMAGE”)} //添加你的按鈕功能buttonTitle(forEmptyDataSet _:UIScrollView!,for _:UIControlState) - &gt; NSAttributedString!{let str =“Add Grokkleglob”let attrs = [NSAttributedStringKey.font:UIFont.preferredFont(forTextStyle:UIFontTextStyle.callout),NSAttributedStringKey.foregroundColor:UIColor.white] return NSAttributedString(string:str,attributes:attrs)} // Add按鈕功能的操作emptyDataSetDidTapButton(_:
     
			
        

我遇到DZEmptyDataSet未正確垂直對齊的問題。有沒有人有同樣的問題? - damiancesar 18年9月27日22:49

+120

執行此操作的一種方法是修改數據源,以便在行數為零時返回 1 ,並生成一個特殊用途的單元格(可能具有不同的單元標識符) tableView:cellForRowAtIndexPath:方法。

   - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {NSInteger actualNumberOfRows =&lt;計算實際數行&gt ;; return(actualNumberOfRows == 0)?1:actualNumberOfRows; }  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {NSInteger actualNumberOfRows =&lt;計算實際行數&gt ;; if(actualNumberOfRows == 0){//使用“生成特殊單元格”
     
			
        

我在使用deleteRowsAtIndexPaths:withRowAnimation刪除行的表中遇到了問題:因為numberOfRowsInSection返回的數字需要與$ numRows - $ rowsDeleted的結果相匹配。 - Animal451 2014年1月28日8:48

我強烈建議不要這樣做。它通過邊緣情況謎語你的代碼。 - xtravar 2014年3月16日23:29

@xtravar而不是低估,考慮發布自己的答案。 - dasblinkenlight 2014年3月16日23:44

我一直走在那條道路上,它導致了一系列問題。根據我的經驗,增加Apple API幾乎總是比嘗試更換它們更好。 - xtravar 2014年3月17日凌晨4點

此解決方案不適用於NSFetchedResultsController。我將嘗試使用backgroundView方法。 - Sam 7月6日在7:06

+90

我一直在使用titleForFooterInSection消息。我不知道這是不是最理想,但它確實有效。

   - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {NSString * message = @“”; NSInteger numberOfRowsInSection = [self tableView:self.tableView numberOfRowsInSection:section]; if(numberOfRowsInSection == 0){message = @“此列表現在為空”; } return message; }  
     
			
        

好戲,對我來說似乎很乾淨。這是一個單行:return tableView.numberOfRowsInSection(section)== 0?“這個列表現在是空的”:零 - TruMan1 2015年7月24日15:14

+60

因此,為了更安全的解決方案:

 擴展UITableView {func setEmptyMessage(_ message:String){guard self.numberOfRows()== 0 else {return} let messageLabel = UILabel(frame :CGRect(x:0,y:0,width:self.bounds.size.width,height:self.bounds.size.height))messageLabel.text = message messageLabel.textColor = .black messageLabel.numberOfLines = 0; messageLabel.textAlignment = .center; messageLabel.font = UIFont.systemFont(ofSize:14.0,weight:UIFontWeightMedium)messageLabel.sizeToFit()self.backgroundView = messageLabel; self.separatorStyle = .none; } func restore(){self.backgroundView = nil self.separatorStyle = .singleLine} public func numberOfRows() - &gt; Int {var section = 0 var rowCount = 0而section&lt; numberOfSections {rowCount + = numberOfRows(inSection:section)section + = 1} return rowCount}}   

以及 UICollectionView 以及:

 擴展名UICollectionView {func setEmptyMessage(_ message:String){guard self.numberOfItems()== 0 else {return} let messageLabel = UILabel(frame:CGRect(x:0,y:0,width:self。 bounds.size.width,height:self.bounds.size.height))messageLabel.text = message messageLabel.textColor = .black messageLabel.numberOfLines = 0; messageLabel.textAlignment = .center; messageLabel.font = UIFont.systemFont(ofSize:18.0,weight:UIFontWeightSemibold)messageLabel.sizeToFit()self.backgroundView = messageLabel; } func restore(){self。backgroundView = nil} public func numberOfItems() - &gt; Int {var section = 0 var itemsCount = 0而section&lt; self.numberOfSections {itemsCount + = numberOfItems(inSection:section)section + = 1} return itemsCount}}   

更多通用解決方案:

  protocol EmptyMessageViewType { mutating func setEmptyMessage(_ message:String)mutating func restore()} protocol ListViewType:EmptyMessageViewType where self:UIView {var backgroundView:UIView?{get set}}擴展名UITableView:ListViewType {}擴展名UICollectionView:ListViewType {}擴展名ListViewType {mutating func setEmptyMessage(_ message:String){let messageLabel = UILabel(frame:CGRect(x:0,
     
			
        
+50

我只能建議在單元格之後將一個UITextView拖放到TableView中。在適當的時候建立與ViewController的連接並隱藏/顯示它(例如,每當表重新加載時)。

這是最簡單的方法)! - moonvader 2016年5月5日9:28

這種痛苦的頭痛是蘋果的方式; 感謝這個想法 - Eenvincible 11年5月15日在18:17

+40

使用backgroundView很好,但它不像Mail.app那樣很好地滾動。

我做了類似 xtravar 做了。

我在 tableViewController 的視圖層次結構外添加了一個視圖。

然後我在 tableView中使用了以下代碼:numberOfRowsInSection:

  if someArray.count = = 0 {//顯示空狀態視圖self.tableView.addSubview(self.emptyStateView)self.emptyStateView.center = self.view。中心self.emptyStateView.center.y  -  = 60 //這裡粗略計算self.tableView.separatorColor = UIColor.clear}否則如果self.emptyStateView.superview!= nil {//空狀態視圖當前可見,但不應該self.emptyStateView.removeFromSuperview()self.tableView.separatorColor = nil} return someArray.count   

基本上我添加了 emptyStateView 作為的子視圖tableView 對象。由於分隔符與視圖重疊,我將其顏色設置為 clearColor 要返回默認分隔符顏色,只需將其設置為 nil superview!= nil {//空狀態視圖當前可見,但不應該是self.emptyStateView.removeFromSuperview()self.tableView.separatorColor = nil} return someArray.count

基本上我添加了 emptyStateView 作為 tableView 對象的子視圖。由於分隔符與視圖重疊,我將其顏色設置為 clearColor 要返回默認分隔符顏色,只需將其設置為 nil superview!= nil {//空狀態視圖當前可見,但不應該是self.emptyStateView.removeFromSuperview()self.tableView.separatorColor = nil} return someArray.count

基本上我添加了 emptyStateView 作為 tableView 對象的子視圖。由於分隔符與視圖重疊,我將其顏色設置為 clearColor 要返回默認分隔符顏色,只需將其設置為 nil 作為 tableView 對象的子視圖。由於分隔符與視圖重疊,我將其顏色設置為 clearColor 要返回默認分隔符顏色,只需將其設置為 nil 作為 tableView 對象的子視圖。由於分隔符與視圖重疊,我將其顏色設置為 clearColor 要返回默認分隔符顏色,只需將其設置為 nil

這很好用!但是如果你有拉動刷新的元素,例如,這不會滾動它們。我發現設置tableHeaderView更好,並確保它調整大小以適應。 - Hannele 2017年3月7日20:30

+40
<p>根據<a href =“https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html#//apple_ref/doc/使用容器視圖控制器是正確的方法。 uid / TP40007457-CH11-SW1“rel =”nofollow noreferrer“> Apple </a>。</ p> <p>我將所有空狀態視圖放在一個單獨的故事板中。每個都在它自己的UIViewController子類下。我直接在他們的根視圖下添加內容。如果需要任何動作/按鈕,你現在已經有了一個控制器來處理它。那麼它只是從該Storyboard實例化所需的視圖控制器,將其添加為子視圖控制器並將容器視圖添加到tableView的層次結構(子視圖)。您的空狀態視圖也可以滾動,感覺很好並允許你實現拉動刷新。</ p> <p> <a href =“https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html#//apple_ref/ doc / uid / TP40007457-CH11-SW1“rel =”nofollow noreferrer“>閱讀</a>章節<em>'將子視圖控制器添加到您的內容'</ em>以獲取有關如何實施的幫助。</ p > <p>請確保將子視圖框架設置為<code>(0,0,tableView.frame.width,tableView.frame.height)</ code>,並且事物將居中並正確對齊。</ p> frame.width,tableView.frame.height)</ code>,事物將居中並正確對齊。</ p> frame.width,tableView.frame.height)</ code>,事物將居中並正確對齊。</ p>
+30

首先,其他流行方法的問題。

BackgroundView

如果您使用簡單的情況,背景視圖並不能很好地集中在將其設置為UILabel。

顯示消息的單元格,頁眉或頁腳

這會干擾您的功能代碼並引入奇怪的邊緣情況。如果您希望完美地集中信息,則會增加另一種複雜程度。

滾動自己的表格視圖控制器

您丟失了內置功能,例如refreshControl,並重新發明輪子。堅持使用UITableViewController以獲得最佳的可維護性結果。

將UITableViewController添加為子視圖控制器

我有一種感覺,你最終會遇到iOS 7+中的contentInset問題 - 加上為什麼會讓事情複雜化?

我的解決方案

我提出的最佳解決方案(並且,授予,這不是理想的)是創建一個可以位於滾動視圖頂部並採取行動的特殊視圖因此。這顯然在iOS 7中因contentInset瘋狂而變得複雜,但它是可行的。

你需要注意的事項:

  • 表分隔符在某些時候被帶到了前面reloadData - 你需要防範
  • contentInset / contentOffset - 在特殊視圖上觀察這些鍵
  • 鍵盤 - 如果你不喜歡

你能詳細說明你的答案嗎?你如何判斷表是否為空?然後“相應地採取行動”。 - Michael Ozeryansky 2014年11月2日23:06

你知道你的桌子是空的,因為你是填充你的桌子的人。所以在你的視圖控制器中,你有一個異步加載回調。在該回調中,if(itemsToShow.count == 0){將您的視圖添加到滾動視圖}。棘手的部分是使頂視圖('屏蔽/消息視圖')定位為佔據滾動視圖的整個幀,減去contentInset等,以便消息垂直居中。 - xtravar 2014年11月3日20:43

如何在表格視圖的頂部添加視圖?self.view是表視圖,如果我使用addSubView,它會附加到表視圖,這總是會導致自動佈局出現問題。 - 測試2014年11月6日13:31

您放置在表視圖中的視圖不應使用autolayout,並且tableview本身不使用autolayout。 - xtravar 2014年11月6日21:23

你在那裡錯過了一個方法; 您可以使用UITableViewController並將其作為子視圖控制器添加到常規UIViewController - user1169629 2015年8月20日9:03

+20

這是最好和最簡單的解決方案。

  UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.view.frame.size.width,60) ]。UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,self.view.frame.size.width,60)]; label.text = @“此列表為空”; label.center = self.view.center; label.textAlignment = NSTextAlignmentCenter; [查看addSubview:label]; self.tableView.backgroundView = view;  
     
			
        
+20
<p>顯示空列表消息,其<strong> UITableView </ strong>或<strong> UICollectionView </ strong>。</ p> <pre> <code>擴展名UIScrollView {func showEmptyListMessage(_ message:String){let rect = CGRect(origin:CGPoint(x:0,y:0),size:CGSize(width:self.bounds。 size.width,height:self.bounds.size.height))let messageLabel = UILabel(frame:rect)messageLabel.text = message messageLabel.textColor = .black messageLabel.numberOfLines = 0 messageLabel.textAlignment = .center messageLabel.font = UIFont.systemFont(ofSize:15)messageLabel.sizeToFit()如果讓'self` = self as?UITableView {self.backgroundView = messageLabel self.separatorStyle =。沒有}如果讓'self` = self為?UICollectionView {self.backgroundView = messageLabel}}} </ code> </ pre> <p> <strong>用法:</ strong> </ p> <pre> <code> if cellsViewModels.count == 0 {self。 tableView.showEmptyListMessage(“列表中沒有產品!”)} </ code> </ pre> <p> <strong> OR:</ strong> </ p> <pre> <code> if cellsViewModels.count == 0 {self.collectionView?.showEmptyListMessage(“列表中沒有產品!”)} </ code> </ pre> <p> <strong>記住:</ strong>不要忘記刪除郵件標籤以防數據刷新後來。</ p>

我會添加if條件如果messages.count!= 0 {show} - eddwinpaz 18年10月27日19:16

+10

在故事板中選擇tableviewController場景

拖放UIView添加帶有消息的標籤(例如:無數據)

在TableViewController上創建UIView的插座(比如說,例如yournoDataView)。

和viewDidLoad

self.tableView.backgroundView = yourNoDataView

0

Swift版本,但更好更簡單的形式。** 3.0

我希望它服務於你的目的......

在你的UITableViewController中。

 覆蓋func tableView (_ tableView:UITableView,numberOfRowsInSection section:Int) - &gt; Int {if searchController.isActive&amp;&amp; searchController.searchBar.text!=“”{if filteredContacts.count&gt; 0 {self.tableView.backgroundView = .none; return filteredContacts.count} else {Helper.EmptyMessage(message:ConstantMap.NO_CONTACT_FOUND,viewController:self)return 0}} else {if contacts.count&gt; 0 {self.tableView.backgroundView = .none; 回复聯繫人。height))messageLabel.text = message let bubbleColor = UIColor(紅色:CGFloat(57)/ 255,綠色:CGFloat(81)/ 255,藍色:CGFloat(104)/ 255,alpha:1)messageLabel.textColor = bubbleColor messageLabel .nu??mberOfLines = 0; messageLabel.textAlignment = .center; messageLabel.font = UIFont(名稱:“TrebuchetMS”,大小:18)messageLabel.sizeToFit()viewController.tableView.backgroundView = messageLabel; viewController.tableView.separatorStyle = .none; }   messageLabel.textAlignment = .center; messageLabel.font = UIFont(名稱:“TrebuchetMS”,大小:18)messageLabel.sizeToFit()viewController.tableView.backgroundView = messageLabel; viewController.tableView.separatorStyle = .none; }   messageLabel.textAlignment = .center; messageLabel.font = UIFont(名稱:“TrebuchetMS”,大小:18)messageLabel.sizeToFit()viewController.tableView.backgroundView = messageLabel; viewController.tableView.separatorStyle = .none; }  
     
			
        
0

可能不是最好的解決方案,但我只是在表格的底部放一個標籤,如果行= 0,那麼我就給它分配了一些文字。非常簡單,只需幾行代碼即可實現您的目標。

我的表中有兩個部分(工作和學校)

  func tableView(_ tableView:UITableView,numberOfRowsInSection section:Int) - &gt; Int {if(jobs.count == 0&amp;&amp; schools.count == 0){emptyLbl.text =“No jobs or schools”} else {emptyLbl.text =“”}  
     
			
        

You could also replace the label with an empty imageview when count = 0 if you wanted.. – Zach Jul 5 '17 at 7:39

0

最簡單,最快捷的方法是將標籤拖到tableView下的側面板上。為標籤和tableView創建一個插座,並添加一個if語句來隱藏並根據需要顯示標籤和表格。或者你可以將tableView.tableFooterView = UIView(frame:CGRect.zero)這個添加到viewDidLoad()中,以便在表和背景視圖具有相同顏色的情況下為空表提供隱藏的感知。

(這篇文章似乎沒有為這個問題提供高質量的答案。請編輯你的答案並填寫更詳細的信息,或者只是將其作為對問題的評論發布)。 - sɐunıɔןɐqɐp18年8月16日11:52

0

使用Swift 4.2

  func numberOfSections(在tableView:UITableView中) - &gt; Int {var numOfSections:Int = 0 if self.medArray.count&gt; 0 {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 Medicine available.Press +添加新藥”noDataLabel.textColor = UIColor.black noDataLabel.textAlignment = .center tableView.backgroundView = noDataLabel tableView.separatorStyle = .none} return numOfSections}  
     
			
        
0
votes
answers
36 views
+10

Raspberry Pi服務器

0

我13歲了,我開始考慮爲我的學校開發一個應用程序,人們可以在其中討論內容併發布內容。我想知道是否可以將我的Raspberry Pi 3用作服務器,並且如果用戶發佈可能長達180個字符的消息(並非圖片),並且用戶還可以看到其他人的帖子,它會支持多少人。有任何想法嗎?Raspberry Pi服務器

+0

簡短的回答是可以的。 它可支持的數量將受到Raspberry Pi(Ram?CPU?有散熱器?)和您的Internet服務提供商的規格限制。 – JMichelB

+0

它有一個散熱器,我們有Xfinity互聯網。我認爲這是最新的一個。 –

+0

好的,你在Xfinity有哪些服務?從我可以看到他們可以從10mbps到350mbps(根據他們的互聯網服務頁面[https://www.xfinity.com/learn/internet-service]) – JMichelB

沙发
0
1

我不是專家。所做的計算是理論上的,很可能需要重新檢查。

我認爲消息最多可以有175個字符(附加控制字符,用戶標識,...),最多可以有1000個用戶(學校,家庭以外的朋友......)您的字符以4字節格式編碼。

Estimations of network load

從理論上講,你的網絡和樹莓派可以管理的操作。我只是建議對安全性進行額外的注意,並驗證您是否有靜態IP地址(否則會獲得靜態域名/ IP)。

0
votes
answers
29 views
+10

未在單元格內顯示JSON響應

-1

我正在創建Tableview並嘗試在單元格中包含一個通過API從JSON接收的信息。 信息(JSON)收到的很好,並在變量內正確記錄。 但是,我可以發現的是,由於收到的信息帶有一個小的「延遲」,因此不會在單元格創建時刻將單元格的標籤文本設置爲默認變量內容。 我想解決的辦法是在解析JSON內容的時刻更新標籤,對吧?我該怎麼做呢? (更新單元格的標籤後,它已被創建) 任何其他洞察力/解決方案非常感謝。未在單元格內顯示JSON響應

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, AddStock { 

    let operacoesAcoes = ListaOperacoes() 
    var todasAsOperacoes : [Operacao] = [] 

    @IBOutlet weak var acoesTableView: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     acoesTableView.delegate = self 
     acoesTableView.dataSource = self 
     acoesTableView.register(UINib(nibName: "StandardStockListCell", bundle: nil), forCellReuseIdentifier: "standardCell") 
     operacoesAcoes.consolidaAcoes() 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return operacoesAcoes.carteiraAcoes.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "standardCell", for: indexPath) as! StandardStockListCell 
     let informacaoCompletaAcao = operacoesAcoes.carteiraAcoes[indexPath.row] 

     cell.codigoTextField.text = informacaoCompletaAcao.codigoAcao 
     cell.nomeTextField.text = informacaoCompletaAcao.nomeAcao 
     cell.quantidadeTotal.text = String(informacaoCompletaAcao.quantidadeTotal) 
     cell.precoMedioLabel.text = String(format: "%.2f", informacaoCompletaAcao.precoMedio) 

     // 
     // This is the part of the code that should set one label with a value returned from "buscaCotacao" but it does not work 
     // because at the time the cell is displayed it is still not updated from JSON information: 
     // Note: the buscaCotacao func is working fine 

     cell.precoAtualLabel.text = buscaCotacao(ativo: informacaoCompletaAcao.codigoAcao) 

     return cell 
    } 
沙发
0
1

您需要在接收並解析JSON之後重新加載主線程上的表視圖。

self.acoesTableView.reloadData()

板凳
0
0

我做了一些研究和選拔賽,並在接收到請求的結果後能想出一個非常簡單的(和現在很明顯)解決方案來更新我的標籤: - 我把它檢索功能來自API的更新信息的信息(「buscaCotacao」),包括[cell row]信息 - 我從函數內部更新單元格的標籤,僅在收到回覆後纔會發生:

func tableView (_ tableView:UITableView,cellForRowAt indexPath:IndexPath) - > UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "standardCell", for: indexPath) as! StandardStockListCell 
    let informacaoCompletaAcao = operacoesAcoes.carteiraAcoes[indexPath.row] 

    cell.codigoTextField.text = informacaoCompletaAcao.codigoAcao 
    cell.nomeTextField.text = informacaoCompletaAcao.nomeAcao 
    cell.quantidadeTotal.text = String(informacaoCompletaAcao.quantidadeTotal) 
    cell.precoMedioLabel.text = "R$ "+String(format: "%.2f", informacaoCompletaAcao.precoMedio) 

    buscaCotacao(ativo: informacaoCompletaAcao.codigoAcao, for: cell, indexPath: indexPath) 

    return cell 
} 

而在功能:

FUNC buscaCotacao(ativo:字符串,用於細胞:StandardStockListCell,indexPath:IndexPath){

let finalURL = "https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&interval=1min&apikey=XXXXXXXXXXXXXX&outputsize=compact&symbol=" + ativo 

    Alamofire.request(finalURL, method: .get) 
     .responseJSON { response in 
      if response.result.isSuccess { 
       let resultadoJSON : JSON = JSON(response.result.value!) 
       let resultado = Float (self.parseResultado(json: resultadoJSON))! 
       cell.precoAtualLabel.text = "R$ "+String(format: "%.2f", resultado) 
       self.cotacoes[ativo] = resultado 

      } else { 
       cell.precoAtualLabel.text = "N/D" 
       print("Error: (response.result.error!)") 
      } 
    } 
} 
0
votes
answers
27 views
+10

Xcode UITableView單元格背景不起作用

2

我想爲單個TableViewCell着色,並且在開始時它可以正常工作,但隨後它只會弄髒並且顏色也會隨着其他隨機單元格着色。Xcode UITableView單元格背景不起作用

我要離開代碼和一些截圖,希望你能幫上忙。我正在使用Xcode 9和Swift 4.

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Linea", for: indexPath) 
    cell.textLabel?.text = ListaLineas[indexPath.row] 
    if (cell.textLabel?.text == "TifloInnova"){ 
     cell.textLabel?.textColor = UIColor(red: 100, green: 100, blue: 100, alpha: 1) 
     cell.contentView.backgroundColor = UIColor(red:100.0, green: 0.0, blue:0.0, alpha:0.8) 
    } 
    else{ 
     cell.textLabel?.textColor = UIColor(red: 0.0, green: 0.478, blue: 1, alpha: 1.0) 
    } 
    cell.textLabel?.numberOfLines = 6 
    cell.textLabel?.font.withSize(15) 
    cell.textLabel?.textAlignment = .center 
    cell.textLabel?.lineBreakMode = .byWordWrapping 

    tableView.estimatedRowHeight = 80 
    tableView.rowHeight = UITableViewAutomaticDimension 

    return cell; 
} 

非常感謝。 I want it to looks like this

But sometimes it looks like this

沙发
0
1

對你的情況的解決方案是確保如果單元格文本標籤不「TifloInnova」將顏色返回到默認值。你可以執行它如下:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Linea", for: indexPath) 
     cell.textLabel?.text = ListaLineas[indexPath.row] 

     if (cell.textLabel?.text == "TifloInnova"){ 
      cell.textLabel?.textColor = UIColor(red: 100, green: 100, blue: 100, alpha: 1) 
      cell.contentView.backgroundColor = UIColor(red:100.0, green: 0.0, blue:0.0, alpha:0.8) 
     }else{ 
      cell.textLabel?.textColor = UIColor(red: 0.0, green: 0.478, blue: 1, alpha: 1.0) 
      // here what you should add, for instance the default color should be white: 
      cell.contentView.backgroundColor = UIColor.white 
     } 
     cell.textLabel?.numberOfLines = 6 
     cell.textLabel?.font.withSize(15) 
     cell.textLabel?.textAlignment = .center 
     cell.textLabel?.lineBreakMode = .byWordWrapping 

     tableView.estimatedRowHeight = 80 
     tableView.rowHeight = UITableViewAutomaticDimension 

     // btw no need for the ";" :) 
     return cell 
} 
+0

是的,這是問題所在。我沒有想到這個解決方案。非常感謝! –

板凳
0
1

您可以重置背景顏色中的「其他」分支,這樣做:

if cell.textLabel?.text == "TifloInnova" { 
    cell.contentView.backgroundColor = UIColor.red 
} else { 
    cell.contentView.backgroundColor = UIColor.clear  
} 
0
votes
answers
31 views
+10

NSException當刪除UITableViewCell

0

我正在使用Github上的開源庫MGSwipeTableCellhttps://github.com/MortimerGoro/MGSwipeTableCell)用於在刷表的視圖的單元格時顯示按鈕。NSException當刪除UITableViewCell

當我點擊通過滑動顯示的按鈕時發生崩潰。我定義應該在這裏輕點按鈕時調用的關閉:

// This is in the library delegate method: 
// func swipeTableCell(_ cell: MGSwipeTableCell, swipeButtonsFor direction: MGSwipeDirection, swipeSettings: MGSwipeSettings, expansionSettings: MGSwipeExpansionSettings) -> [UIView]? 

// local variables: buttons, one of which is: 
let rejectFriendReqButton = MGSwipeButton(title: "", icon: UIImage(named: "X"), backgroundColor: RED) { (cell) -> Bool in 

    DispatchQueue.main.async(execute: { 
     self.friendListTableView.deleteRows(at: [self.friendListTableView.indexPath(for: cell)!], with: .fade) 
    }) 

    return FriendingCloudKitUtils.declineFriendRequest() 
} 

// In an if-else ladder: 
else if direction == MGSwipeDirection.rightToLeft { // reject friend request 

    if section == 2 { // friend requests 

     if direction == MGSwipeDirection.leftToRight { // accept friend request 
      return [acceptFriendReqButton] 
     } 

     else if direction == MGSwipeDirection.rightToLeft { // reject friend request 

      return [rejectFriendReqButton] 
     } 
    } 
    else if self.friendListTableView.indexPath(for: cell)?.section == 4 { // in friend section 
     return [unfriendButton] 
    } 
} 

墜機發生在那裏我稱之爲deleteRows行。我收到一個NSException。當我在LLDB執行po $arg1,我得到:

error: Couldn't materialize: couldn't read the value of register x0 
error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression 

我試過多種可能的解決方案比我可以跟蹤,其中存儲按鈕作爲全局變量,而不是本地的。

其他可能相關的注意事項:

當我進入調試模式下,該表確實存在:

<UITableView: 0x10186c000; frame = (0 0; 375 554); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x17425a760>; layer = <CALayer: 0x174236760>; contentOffset: {0, 0}; contentSize: {375, 357.5}> 

正在被解開同樣的indexPath不是零和具有正確的部分,行號:

lldb) po self.friendListTableView.indexPath(for: cell)! 
? 2 elements 
    - 0 : 2 
    - 1 : 0 

是什麼原因造成這種NSException任何想法和我怎麼可能解決呢?

沙发
0
1
self.friendListTableView.beginUpdates() 
    your_dataSource.remove(at: self.friendListTableView.indexPath(for: cell)!) 
    self.friendListTableView.deleteRows(at: [self.friendListTableView.indexPath(for: cell)!]) 
    self.tableView.endUpdates() 

爲了從帶有動畫的tableView中刪除該行,首先修改數據源,然後調用deleteRows。如果你想刪除的行只是單純地找到該行的indexPath的價值,並調用此方法

func tableView(_ tableView: UITableView, commit editingStyle: 
       UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {  

    if editingStyle == .delete { 
     print("Deleted") 
     your_dataSource.remove(at: indexPath.row) 
     self.tableView.deleteRows(at: [indexPath], with: .automatic) 
    } 
} 

這將處理您刪除行操作最後包裹在beginUpdatesendUpdates

板凳
0
0

刪除代碼。

+0

我不認爲這是圖書館的必要條件。該演示不使用典型的表視圖委託方法:https://github.com/MortimerGoro/MGSwipeTableCell/blob/master/demo/MailAppDemoSwift/MailAppDemoSwift/MailViewController.swift – mlecoz