2014-09-11 74 views
1

我有一個包含按鈕的表格視圖。我想要做的是,我想保持點擊按鈕(s)在選定狀態,直到他們再次輕敲(這應該取消選擇它們)。這就像一個複選框說實話。簡單,對嗎?
但問題是,由於使用單個布爾標誌來查看按鈕是第一次還是第二次按下,事情變得混亂。例如我點擊按鈕一,然後我點擊按鈕二,現在我想取消選擇按鈕一,所以我再次點擊它,但它不取消選擇,因爲標誌設置爲是(雖然它取消選擇一次再次)。當你有多個按鈕時如何保持在UITableView中選擇UIButton狀態?

有沒有辦法避免這種情況,只需點擊一下就能達到預期效果? 截圖:http://i60.tinypic.com/1z51653.png 這是我在做什麼:

-(void) btnStateChanged: (UIButton *) btnProblem 
{ 
    static BOOL btnPressedFirstTime=YES; 
    if(btnProblem.selected==YES || btnProblem.highlighted==YES) 
    { 
     if(btnPressedFirstTime==YES) 
     { 
      [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button_hover"] forState: UIControlStateNormal]; 
      btnPressedFirstTime=NO; 
     } 
     else if(btnPressedFirstTime==NO) 
     { 
      [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button"] forState: UIControlStateNormal]; 
      btnPressedFirstTime=YES; 
     } 
    } 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
+0

創建另一個數組有值0,1和基於點擊此數組的值,並重新加載的tableview和放映按鈕按這個數組... – 2014-09-11 11:29:22

+0

嘿@NSNoob檢查我的答案.. ,, – 2014-09-11 11:32:00

回答

0

感謝您的回覆傢伙。我嘗試了幾個你的答案,但idk也許是因爲我不明白這是正確的,它不適合我。這是我想出來的,對於給定的問題它工作得很好。我之前應該想到它,對我來說太愚蠢了。標籤!那是我需要的。

-(void) btnStateChanged: (UIButton *) btnProblem 
{ 
    if (btnProblem.tag == 1000) { 
     [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button_hover"] forState: UIControlStateNormal]; 
     btnProblem.tag = 1001; 

    }else if(btnProblem.tag == 1001) { 
     [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button"] forState: UIControlStateNormal]; 
     btnProblem.tag = 1000; 

    } 
+1

標記是在TableView中執行此操作的一個非常麻煩的方法,因爲滾動時單元格重用。 – 2014-09-11 12:37:49

+0

我需要8個按鈕。所以我做了8個部分,每個部分包含一個單元格。現在在iPad橫向(默認和唯一的方向爲我的應用程序),所有8個按鈕都在視圖中(或正在使用,因爲它是我的理解)。你認爲在這種特定情況下它是安全的嗎? – NSNoob 2014-09-11 12:46:56

+1

如果您從不滾動或者所有單元格都有不同的重用ID,並且您從不在桌面視圖上執行任何類型的reloadData或動畫,則重用不會觸及您。但是,這是一個很長的名單,如果...... – 2014-09-11 18:19:25

1

啓動與對象描述每個按鈕狀態的陣列。因此,可以說你有10個按鈕:

NSMutableArray *buttonStates = [NSMutableArray new]; 

for (int i = 0; i < 10; i++) 
{ 
    [buttonStates addObject:[NSNumber numberWithBool:NO]]; 
} 

現在,當你點擊按鈕2號(注意,您必須用它的行的索引標籤上的按鈕):

- (void)btnStateChanged:(UIButton *)btnProblem 
{ 
    int buttonIndex = btnProblem.tag; 
    BOOL state = [[buttonStates objectAtIndex:buttonIndex] boolValue]; 
    [buttonStates replaceObjectAtIndex:buttonIndex withObject:[NSNumber numberWithBool:!state]]; 
} 

這樣,你總是知道每個按鈕具有哪個狀態。

+0

討厭的代碼是當你想查詢數組來設置任意按鈕的狀態時 - 你需要檢查每個元素。 – 2014-09-11 11:25:22

0

使用數組存儲的對象中選擇,或者你可以說抽頭按鈕...在呼籲自來水檢查的功能,如果該按鈕是在陣列或不..並更改圖像相應EG-

NSMutableArray *selectedBtnArr = [[NSMutableArray alloc]init]; 

    if ([selectedBtnArr containsObject:btnProblem]) { 
     [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button"] forState: UIControlStateNormal]; 
     [selectedBtnArr removeObject:btnProblem]; 
    }else{ 
     [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button_hover"] forState: UIControlStateNormal]; 
     [selectedBtnArr addObject:btnProblem]; 
    } 

或者,如果你不想使用數組的任務比使用標籤..設置按鈕標籤像1,2,3..10我假設你有10個按鈕。並使用此代碼,如果選擇或沒有按鍵識別 -

if (btnProblem.tag < 100) { 
    [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button_hover"] forState: UIControlStateNormal]; 
    btnProblem.tag = btnProblem.tag+100; 
}else{ 
    [btnProblem setBackgroundImage:[UIImage imageNamed:@"sc123_button"] forState: UIControlStateNormal]; 
    btnProblem.tag = btnProblem.tag-100; 
} 
+0

這是在UITableViewCell內部使用的一個可怕的解決方案,tableView滾動tableView的重用機制的那一刻將很難打你。 (在視圖重用環境之外,可能工作得很好) – 2014-09-11 12:05:45

0

這正是NSMutableIndexSet是。它實際上是一個稀疏的bool標誌數組。

您可以通過調用addIndex:來設置或取消設置任何標誌,並且removeIndex:可以取消設置。您使用NSIndexSetcontainsIndex:測試其中一個標誌的值。

這段代碼看起來很像@greshking的NSMutableArray代碼,但是你會少得多boolValue和numberWithBool:faffing。

0

爲什麼不只是子類UIButton具有你想要的視覺行爲?
畢竟,一個按鈕是已經跟蹤其狀態的東西。

@interface CBBCheckBoxLikeButton : UIButton 
@end 
@implementation CBBCheckBoxLikeButton 
- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    [self communInit]; 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    [self communInit]; 
    return self; 
} 

- (void)communInit 
{ 
    // The image setting could be done from the outside ot the class 
    [self setBackgroundImage:[[UIImage imageNamed:@"grayPixel"] resizableImageWithCapInsets:UIEdgeInsetsZero] forState:UIControlStateNormal]; 
    [self setBackgroundImage:[[UIImage imageNamed:@"greenPixel"] resizableImageWithCapInsets:UIEdgeInsetsZero] forState:UIControlStateSelected]; 
    self.selected = NO; 
} 

- (void)setHighlighted:(BOOL)highlighted 
{ 
    [self updateSelectedStateForHighlighted:highlighted]; 
    [super setHighlighted:highlighted]; 
} 

- (void)updateSelectedStateForHighlighted:(BOOL)highlighted 
{ 
    if (highlighted) 
     self.selected = !self.selected; 
} 

@end 

但是,您仍然有處理TableView重複使用機制的問題,以保持您的視覺與您的按鈕同步。 但這可能反映在您的數據模型中。

因此,在您- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法,你只需要做到:
cell.button.selected = dataForCell.wasButtonSelected;

注意,按鈕將需要一個「自定義」按鈕,「系統」按鈕將運行異常。您可以/應該提供一種避免客戶端代碼陷阱的創建方法。

相關問題