2011-06-20 74 views
11

我想在點擊時使用UITableViewCell上的默認高光。但是,我不希望自定義子視圖(及其子視圖)接收消息來更新其突出顯示的狀態,因此會中斷backgroundColor屬性。如何在iOS SDK中禁用UIView/UIViewController的「highlight subviews」消息?

編輯
通過 「子視圖」 我的意思是任何UIView子類,而不僅僅是UITableViewCell秒。

也許這個假設的情況會更好地表達什麼,我正在尋找:我有一個的UITableViewCell。叫它c。然後我添加一個UIView(稱爲v)作爲子視圖c。當我點擊Ç,我想Ç成爲高亮(標準的藍色背景,白色字體顏色),但我不希望v變得突出。我如何做到這一點?

+1

** bump **我真的很想知道一種方法來做到這一點! – jasongregori

+0

對於那些已經或將要回答/回答有關將UITableViewCellSelectionStyle設置爲「UITableViewCellSelectionStyleNone」的人的問題,*這是行不通的!*請仔細閱讀這個問題。謝謝。 –

+1

這個問題的標題應該是:如何禁用UITableViewCell子選項的自動高亮選擇。目前的標題具有誤導性。 – orj

回答

6

首先,UITableView將激發所有子視圖,並向它們發送突出顯示消息。

所以,即使你把的UILabel在您看來,不管它有多深,它遍歷所有視圖(通過使用子視圖屬性)。

一個解決方案可以是(這是IOS4 +),覆蓋子視圖財產,和作弊tableview的突出顯示功能,我們沒有任何子視圖。要做到這一點,我們需要確定調用者,如果它是tableview的高亮方法,我們應該根本不返回任何子視圖。

我們可以創建一個簡單的UIView子類並覆蓋子視圖像下面。

- (NSArray *)subviews{ 
    NSString* backtrace = [NSString stringWithFormat: @"%@",[NSThread callStackSymbols]]; 
    if ([backtrace rangeOfString:@"_updateHighlightColorsForView"].location!=NSNotFound) 
     return [super subviews]; 

    return [[NSArray new] autorelease]; 
} 
  • callStackSymbols後即可獲得IOS4 +
  • _updateHighlightColorsForView是的UITableView的方法,負責凸顯所有兒童
+2

哇,這很瘋狂。我不知道你能做到這一點。聽起來太hacky,但。 – jasongregori

+0

傑森,是的它是一個作弊:)當tableview分析所有視圖層次結構,併發送每個視圖的消息,我想這是唯一的方式 –

+1

肯定會打破如果內部的UITableView改變 - 雖然我把它算作一個極高的不可能性,當然是解決您的問題的快速解決方案,儘管 – bshirley

3

在表格單元格中使用UITableViewCellSelectionStyleNone。

請參閱the apple API documentation

+0

這是在選擇表格單元格時關閉子視圖自動高亮顯示的正確方法。你顯然現在必須做你自己的行選擇樣式。但這很容易。 – orj

+0

但這不是問題提供者想要的答案。他們想要幾乎默認的選擇/突出顯示行爲。 – orj

1

最近我正在尋找相同的方法,說實話我找不到一種方法來編程這樣做,所以我有點欺騙我的出路。

由於突出方面的圖像我結束了使用UIImageView提交我UIView的整個框架,並分配一個空白圖像到並繪製UIImageView上述觀點的其餘部分。 您的UIView仍將突出顯示,但您將無法看到它,因爲上面會出現空白圖片!

我希望這可以幫助,我知道這可能不是最好的辦法,但讓我,結果我需要

0

可能是我們可以改變子視圖的聚焦狀態,以滿足他們的默認視圖。

這種方式即使它改變爲突出顯示狀態,它會看起來處於默認狀態。

不確定它是否有效,你能否更詳細地描述子視圖。

0

我認爲你需要禁用子視圖(可能不合需要)或子視圖子類覆蓋此行爲。

0

也許如果你繼承你的子視圖,並覆蓋setHighlighted方法什麼都不做或覆蓋突出顯示的方法以始終返回NO。

但UIView沒有突出顯示的狀態,你添加到你的單元格是什麼樣的UIView孩子?

+0

只是簡單的UIViews :) –

0

所以也許有種這樣的:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

m_colors = [[NSMutableArray alloc] init]; 

for (UIView *view in [cell.contentView subviews]) { 
    [m_colors addObject:view.backgroundColor]; 
} 

return indexPath; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

for (int x = 0; x < [m_colors count]; ++x) { 
    [[[cell.contentView subviews] objectAtIndex:x] setBackgroundColor:[m_colors objectAtIndex:x]]; 
} 

[m_colors release]; 
m_colors = nil; 
} 
3

我通過重寫-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated這樣解決了這個問題(如果子視圖是UIControl的子類只適用):

-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 

    BOOL subviewWasEnabled = mySubview.enabled; //check if the view is enabled 
    mySubview.enabled = NO; //disable it anyways 

    [super setHighlighted:highlighted animated:animated]; 

    mySubview.enabled = subviewWasEnabled; //enable it again (if it was enabled) 
} 
+0

這是一個很好的解決方案。謝謝。 – titaniumdecoy

1

覆蓋-(void)setHighlighted:(BOOL)highlight;方法在你的UIControl子類中,所以它什麼都不做。在UIButton子的情況下,你可以這樣做:

- (void)setHighlighted:(BOOL)highlighted { 
    return; 
} 
+0

請注意,您應該也可以重寫setHighlighted:animated:以及。 –

6

我從UITableViewCell繼承的類,所以我固定它覆蓋setSelected:animated這樣的:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
    { 
     [super setSelected:selected animated:animated]; 
     //Reset highlighted status to all the childs that i care for. 
     [self.someChild setHighlighted:NO]; 
     [self.someOtherChild setHighlighted:NO]; 
    } 
+0

這是一個合理的解決方案,如果您沒有對單元格做很多自定義操作,並且需要默認的UITableViewCellSelectionStyle行爲(除少數關鍵子視圖外)。 – orj

+0

這是提問者想要的東西。 – orj

+0

我和@orj在這裏。 – Jessedc

1

我不想任何的子視圖將被突出顯示。我的解決辦法是把selectionstyle設置爲UITableViewCellSelectionStyleNone和如下模仿默認選擇行爲(覆蓋的setSelected上的自定義子類的UITableViewCell的):

- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 

    int backgroundViewTag = 888; 
    UIView *backgroundView = [self viewWithTag:backgroundViewTag]; 

    if (selected) { 
     if (!backgroundView) { 
      backgroundView = [[[UIView alloc] initWithFrame:self.bounds] autorelease]; 
      backgroundView.tag = backgroundViewTag; 
      backgroundView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
      backgroundView.backgroundColor = [UIColor blueColor]; 
      backgroundView.alpha = 0.0; 
      [self insertSubview:backgroundView atIndex:0]; 
     } 

     if (animated) { 
      [UIView animateWithDuration:0.5 animations:^{ 
       backgroundView.alpha = 1.0; 
      }]; 
     } else { 
      backgroundView.alpha = 1.0; 
     } 
    } else if (backgroundView) { 
     if (animated) { 
      [UIView animateWithDuration:0.5 animations:^{ 
       backgroundView.alpha = 0.0; 
      } completion:^(BOOL finished) { 
      }]; 
     } else { 
      backgroundView.alpha = 0.0; 
     } 
    } 
    [super setSelected:selected animated:animated]; 
} 
0

只要把你的一個的UIButton內部的看法和他們AREN」更新突出顯示。你只能在運行時間上使用故事板的xib。

UIButton *button = [[UIButton alloc] initWithFrame:0, 0, cellWidth, cellHeight]; 
[button addSubview:anyView]; // This view don't change his background color 
[cell addSubview:button];