2012-08-26 119 views
4

當前我試圖自定義UITableViewCell中的delte按鈕。 現在我有類似的東西:現在

enter image description here更改UITableViewCell中的UITableViewCellDeleteConfirmationControl(刪除按鈕)的顏色

,所有我需要的是改變這個按鈕的顏色,我不想去改變,或者使其absolutelly定製。我相信這是可能的,而無需創建自己的控件來刪除UITableView中的行。

這是我的代碼:

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    for (UIView *subview in self.subviews) { 
     if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) { 
      UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0]; 
      deleteButtonView.backgroundColor = [UIColor greenColor]; 
     } 
    } 
} 

我怎麼能這樣做?

在此先感謝!

+0

我不認爲這是可能的沒有自定義的UITableViewCell子類。你爲什麼確定這有可能? – DrummerB

+0

@DrummerB我讀了很多關於這個按鈕的定製,顯然我的單元格是自定義的,我已經繼承了UITableViewCell,但我不知道如何簡單地改變顏色,大多數時候人們想要改變動畫或整體這個按鈕的視圖。 –

+0

@DrummerB我不想改變任何行爲,只是顏色。 –

回答

1

這是解決方案:

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    for (UIView *subview in self.subviews) { 
     if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) { 
      UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0]; 
      UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Background"]]; 
      [deleteButtonView addSubview:image]; 
     } 
    } 
} 
+0

這種方法需要在iOS 7中進行修改。請參閱上面的我的回答,以及http://stackoverflow.com/a/22350817/1758337 – timothykc

5

UITableViewCellDeleteConfirmationControl不是公共類,您不能輕易更改其外觀。

爲了做到這一點,我相信你必須通過細胞的子視圖進行迭代,並改變其屬性:

for (UIView *subview in self.subviews) { 
    if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl") { 
     // Set the background using an image. 
    } 
} 

當然,你應該警惕做這樣的事情,因爲它的相當脆弱。我建議你自己滾動。

我向Apple建議submitting a bug report要求能夠更容易地進行編輯。

+0

我會立即更新帖子,以便您能看到我所做的。 –

+0

但我沒有看到任何結果,即使我嘗試添加子視圖(如按鈕)時,也不會執行此操作,但UILabel完美適用。 –

+0

噢,我終於找到了解決方案,現在我會發布代碼) –

1

IOS7兼容的答案(不是創建一個自定義類,但延長的UITableViewCell:

@implementation UITableViewCell (customdelete) 
- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
    for (UIView *subview in self.subviews) { 
     for(UIView *subview2 in subview.subviews){ 
      if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { 
       ((UIView*)[subview2.subviews firstObject]).backgroundColor=COLOR_RED; 
//YOU FOUND THE VIEW, DO WHATEVER YOU WANT, I JUST RECOLOURED IT 
      } 
     } 
    } 
} 
@end 
+0

這個方法的作品。您可能需要將此添加到UITableViewController,以便自定義顏色顯示,但是... - (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath {self.yourTableView reloadData]; } – timothykc

+0

它不起作用後ios 7.1.2 – yatanadam

+0

不適用於我 – Ans

2

下面是如何:

激活滑動時刪除按鈕

//請確保您有以下幾種方法中的UITableViewController

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return YES; 
} 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"You hit the delete button."); 
} 

組自定義文本標籤,而不是刪除。對於按鍵部分1個

-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return @"Your Label"; 
} 

組自定義顏色 - 警告,這在技術上涉及在私人蘋果API戳。但是,您無法使用作爲UIKIT一部分的公共方法搜索來修改子視圖。

創建一個UITableViewCell類(也https://stackoverflow.com/a/22350817/1758337見)

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 
    for (UIView *subview in self.subviews) { 
     //iterate through subviews until you find the right one... 
     for(UIView *subview2 in subview.subviews){ 
      if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { 
       //your color 
       ((UIView*)[subview2.subviews firstObject]).backgroundColor=[UIColor blueColor]; 
      } 
     } 
    }  
} 

另注:也不能保證這種做法將在未來的更新工作。另外請注意,提及或使用專用UITableViewCellDeleteConfirmationView類可能會導致AppStore拒絕。對於按鍵部分2

回到你的UITableViewController

組自定義顏色

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [YourTableView reloadData]; 
} 

(備用顏色不會被下一次調用layoutSubviews被稱爲在TableCell的,直到,所以我們)

4

在UITableViewCell子類中:

- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view 
{ 
    for(UIView *subview in view.subviews) { 
     if([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) return subview; 
     UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview]; 
     if(recursiveResult) return recursiveResult; 
    } 
    return nil; 
} 

-(void)overrideConfirmationButtonColor 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self]; 
     if(confirmationButton) confirmationButton.backgroundColor = [UIColor orangeColor]; 
    }); 
} 

然後在的UITableViewDelegate:

-(void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    <#Your cell class#> *cell = (<#Your cell class#>*)[self.tableView cellForRowAtIndexPath:indexPath]; 
    [cell overrideConfirmationButtonColor]; 
} 

這個工程在IOS 7.1.2

+0

太棒了!對我很好。 – marmor

2

silyevsk的例子是極好的......可是,半年過去了,iOS 8的來了一起,並且它不」再也無法正常工作了。

現在,您需要尋找名爲「_UITableViewCellActionButton」的子視圖並設置其背景顏色。

下面是我在我的應用程序中使用的silyevsk代碼的修改版本。

一些UITableView細胞的,我不想讓用戶能夠刷卡到刪除,但我沒有想要的東西(掛鎖圖標),當他們刷卡出現。

enter image description here

要做到這一點,我添加了一個bReadOnly變量,以我的UITableViewCell類,

@interface NoteTableViewCell : UITableViewCell 

. . . 

@property (nonatomic) bool bReadOnly; 

-(void)overrideConfirmationButtonColor; 

@end 

和我說silyevsk的代碼,以我的.m文件:

- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view 
{ 
    for(UIView *subview in view.subviews) { 

     if([NSStringFromClass([subview class]) rangeOfString:@"UITableViewCellActionButton"].location != NSNotFound) 
      return subview; 

     UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview]; 
     if(recursiveResult) 
      return recursiveResult; 
    } 
    return nil; 
} 

-(void)overrideConfirmationButtonColor 
{ 
    if (!bReadOnly) 
     return; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self]; 
     if(confirmationButton) 
     { 
      confirmationButton.backgroundColor = [UIColor lightGrayColor]; 

      UIImageView* imgPadLock = [[UIImageView alloc] initWithFrame:confirmationButton.frame]; 
      imgPadLock.image = [UIImage imageNamed:@"icnPadlockBlack.png"]; 
      imgPadLock.contentMode = UIViewContentModeCenter;  // Don't stretch the UIImage in our UIImageView 

      // Add this new UIImageView in the UIView which contains our Delete button 
      UIView* parent = [confirmationButton superview]; 
      [parent addSubview:imgPadLock]; 
     } 
    }); 
} 

另外,我需要更改填充UITableView的代碼,否則將出現「刪除」標籤以及掛鎖圖標:

-(NSString*)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    Note* note = [listOfNotes objectAtIndex:indexPath.row]; 
    if (/* Is the user is allowed to delete this cell..? */) 
     return @"Delete"; 

    return @"  "; 
} 

它仍然是醜陋的,並且依賴於iOS 9出現時不會全部改變的假設。