2011-09-19 50 views
1

我在執行段控制時遇到了一些問題。因爲我想這是一個固定的頭,所以當我滾動我總能看到它,我已經在UISegmentControl在放置在tableView標題中時表現不尋常

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

一切都很好,直到在這裏實現它,會出現分段控制。問題是點擊段的時候。儘管具有選擇器實現的功能被調用,該段控制具有正確selectedSegmentIndex,區段不突出顯示不同的是最初在viewForHeaderInSection設置與

sortControl.selectedSegmentIndex = 0;之一。此細分受衆羣突出顯示且未突出顯示(再次按下時)。另一個奇怪的是,當我按其他片段,在0的片段變得突出顯示。

下面是viewForHeaderInSection的完整代碼:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 

    UIColor *tintColor = [UIColor colorWithRed:241.0/255 green:78.0/255 blue:35.0/255 alpha:1]; 



    sortControl = [[UISegmentedControl alloc] initWithItems: 
        [NSArray arrayWithObjects:@"Distance", @"Rating", @"Name", nil]]; 
    sortControl.segmentedControlStyle = UISegmentedControlStyleBar; 

     sortControl.tintColor = tintColor; 
    sortControl.frame = CGRectMake(20, 20, 280, 35); 
    sortControl.selectedSegmentIndex = 0; 
    [sortControl addTarget:self action:@selector(sortChanged) forControlEvents:UIControlEventValueChanged]; 

     UIView *view=[UIView new]; 
     view.frame = CGRectMake(0, 0, 320, 70); 
     view.backgroundColor =[UIColor blueColor]; 
     [sortControl setEnabled:YES forSegmentAtIndex:0]; 
     [sortControl setEnabled:YES forSegmentAtIndex:1]; 
     [sortControl setEnabled:YES forSegmentAtIndex:2]; 


     view.userInteractionEnabled = YES; 

     [view addSubview:sortControl]; 




     return view; 

    } 

回答

2

您在這裏有兩種問題: 第一個問題是AliSoftware在他之前的迴應中出現的:您必須將瞬時屬性設置爲NO以避免閃爍問題。

但主要問題在於您使用

tableView:viewForHeaderInSection:
委託方法的方式。在這種方法中,您每次都重新創建相同的視圖,其中有兩個不好的效果: - 第一個在您的應用中可見:分段控件重新初始化,選定按鈕設置爲第一個(索引0) - 第二個是每次由表視圖調用該方法時添加內存泄漏。考慮一下,這個方法被表視圖調用了多次,並且不受控制:基本上每次頁眉在屏幕外滾動然後重新進入時,表需要重新生成視圖並再次調用該方法。在你的代碼段創建,但從來沒有泄漏。

此問題的解決方案是爲標題定義單個實例,將其初始設置爲零,然後檢查它是否爲零。如果沒有創建它,則不使用先前生成的實例。 另一種可能的方法是在下面的代碼中。因此,創建一個靜態實例,並使用GCD的dispatch_once僅在第一次創建分段控件。在這種情況下,您將永遠不會失去當前的控制狀態,因爲它將在每次標題調用時重新使用。您還可以通過在dispatch_once塊內移動整個標題UIView來提高性能,因此每次都要避免額外的分配。



static UISegmentedControl *sortControl; 

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 

    UIColor *tintColor = [UIColor colorWithRed:241.0/255 green:78.0/255 blue:35.0/255 alpha:1]; 


    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sortControl = [[UISegmentedControl alloc] initWithItems: 
         [NSArray arrayWithObjects:@"Distance", @"Rating", @"Name", nil]]; 
     sortControl.segmentedControlStyle = UISegmentedControlStyleBar; 

     sortControl.tintColor = tintColor; 
     sortControl.frame = CGRectMake(20, 20, 280, 35); 
     sortControl.selectedSegmentIndex = 0; 

    }); 

    [sortControl addTarget:self action:@selector(sortChanged) forControlEvents:UIControlEventValueChanged]; 

    UIView *view=[UIView new]; 
    view.frame = CGRectMake(0, 0, 320, 70); 
    view.backgroundColor =[UIColor blueColor]; 
    sortControl.momentary = NO; 
    [sortControl setEnabled:YES forSegmentAtIndex:0]; 
    [sortControl setEnabled:YES forSegmentAtIndex:1]; 
    [sortControl setEnabled:YES forSegmentAtIndex:2]; 


    view.userInteractionEnabled = YES; 

    [view addSubview:sortControl]; 




    return view; 

} 
+0

感謝您的回覆,作爲AliSoftware,您一直非常樂於助人! – Alex

+0

我之前也在評論中添加了相同的評論(即每次都重新創建了分段的片段),並建議使用ivar ......但使用GCD和displatch_once的好解決方案不會有這樣的效果:)還請注意,如果ARC沒有打開,那麼您在代碼中所說的泄漏只會出現。 – AliSoftware

2

這是因爲你設置sortControl.momentary = YES;

此屬性使SegmentedControl的每個段的行爲類似於「瞬時按鈕」,這意味着當觸摸某個段時,該段將突出顯示,然後觸發該事件,並且當您停止觸摸時它會回到其原始狀態。

刪除此行(或將此屬性設置爲NO)應該可以解決您的問題。

+0

我已將該屬性設置爲NO,但它仍然無效。該函數仍然被調用,並且.selectedSegmentIndex也是正確的,但除了第一個被永久高亮顯示的段以外,段不突出顯示。 – Alex

+0

如果不使用tintColor,該怎麼辦? _(可能是因爲使用了tintColor,突出顯示狀態的顏色與正常狀態下的顏色沒有什麼不同?)_ – AliSoftware

+0

試過了,仍然不起作用:( – Alex

相關問題