2011-09-01 209 views
1

我有我的應用程序中的自定義單元格的tableview和每個單元格包含兩個複選框按鈕。自定義單元格的表視圖

問題是,當一個滾動事件觸發(向上或向下)時,它正在重新加載tableview。因此,複選框按鈕變爲初始狀態。

請給我一個解決方案。

謝謝你

+0

你對你的單元格使用'dequeueReusableCellWithIdentifier'方法嗎? – beryllium

+0

是的,我正在使用dequeueReusableCellWithIdentifier。是這樣嗎? – sajaz

回答

0

您應該在數據源中設置按鈕的狀態,並在創建單元格時加載此狀態。我寫了一個small Xcode project來證明這一點。

0

那麼你不應該使用TableView作爲數據源。

每當單元格進入視圖時,UITableViewDataSource都會被要求提供UITableViewCell作爲indexpath。

- (void) tableView:(UITableView *)tableView setImage:(UIImage *)image forCellAtIndexPath:(NSIndexPath *)indexPath 

在爲方法,你應該設置複選框的狀態,因爲它是反映在您的數據源。 當複選框被更改時,將其保存在數據源中並且處於選定狀態。

例子:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *cellIdentifier = @"CheckedTableViewCell"; 

    CheckedTableViewCell *cell = (CheckedTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (!cell) { 
     [[NSBundle mainBundle] loadNibNamed:cellIdentifier owner:self options:nil]; 
     cell = (CheckedTableViewCell *)self.nibCell; 
     self.nibCell = nil; 
    } 

    item *item = [self objectAtIndexPath:indexPath]; 

    cell.titleLabel.text = item.title; 
    cell.switch.on = item.selected; 

    return cell; 
} 
+0

感謝您的幫助。但在使用if(!cell)時存在問題{[NSBundle mainBundle] loadNibNamed:cellIdentifier owner:self options:nil]; cell =(CheckedTableViewCell *)self.nibCell; self.nibCell = nil; },因爲每次滾動tabelview時,它都會創建一個類似於已選中單元格的新單元格。 – sajaz

+0

您是否在nib中爲「UITableViewCell」設置了cellIdentifier。 – rckoenes

0

可以爲您節省NSUserDefaults的中的狀態時,右鍵單擊它。只需添加一個目標與@selector(changedOne:)並添加無效聲明:

- (void)changedOne: (id)sender { 
    NSUserDefaults *df = [NSUserDefaults standardUserDefaults]; 
    NSString *row = [NSString initWithFormat:@"toggleOneRow%i",indexPath.row]; 
    if (sender.on) { 
     [df setBool:YES forKey:row]; 
    } 
    else { 
     [df setBool:NO forKey:row]; 
    } 
} 
+0

我認爲這個答案需要更多的信息纔能有用。你能否添加更多細節,例如「我要添加目標?」或者可能是「如何在設置後使用這些信息?」。基本上,我認爲你使用的是基於這個問題的高級概念,可能超出了OP的Obj-C技能(沒有進一步的解釋)。 – mbm29414

1

你將不得不自己維護一個列表來確定哪些小區應檢查與否。請記住,在tableView:cellForRowAtIndexPath:中,正確的實現將回收單元,以便永遠不會有超過10-15個單元實例化。如果你沒有正確處理,這可能會導致一些時髦的結果。當我做了一個糟糕的實現時,我發現某些單元特性「從一個單元傳遞到另一個單元」。

總之,這裏是我建議(基於我想你問):
1.創建一個類來支持每個UITableViewCell的
2.創建一個屬性在類,以確定哪些應該檢查兩個複選框(或兩者都不)。
3.在您的ViewController/TableViewController中,維護一個NSMutableArray/NSArray,其中UITableView中array = 1單元格中的1項。
4.在您的tableView:cellForRowAtIndexPath:方法中,獲取對陣列中相應項目的引用。
5.然後,檢查該實例的屬性並適當設置複選框值。


示例代碼:

TableView.h

@interface TableView : UITableViewController 

@property (strong, nonatomic) NSMutableArray *itemArray; 

@end 

TableView.m

@implementation TableView 

@synthesize itemArray; 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Assume you get a valid, custom UITableViewCell at this point (named "cell") 

    // Configure the cell... 
    NSObject *classItem = [[self itemArray] objectAtIndex:[indexPath row]]; 
    [[cell checkBox1] setChecked:[classItem checkbox1Checked]]; 
    [[cell checkBox2] setChecked:[classItem checkbox2Checked]]; 

    return cell; 
} 

@end 
+0

非常感謝您的幫助,我使用單獨的類來定製單元格。我的cellForRowAtIndexPath:(NSIndexPath *)indexPath方法是這樣的。 NSString * CustomCellIdentifier = @「CustomCellIdentifier」; CustomCell * cell =(CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier]; \t \t 如果(細胞==無){ \t \t的NSArray *筆尖= [[一個NSBundle mainBundle] loadNibNamed:@ 「CustomCell」 所有者:自選項:無]; \t \t爲(在筆尖ID oneObject)如果([oneObject isKindOfClass:[CustomCell類]]) \t \t \t細胞=(CustomCell *)oneObject; \t} – sajaz

0

是否使用cellForRowAtIndexPath。如果是的話,而不是

static NSString [email protected]"CellIdentifier" 

使用

NSString *CellIdentifier=[NSString string[email protected]"CellIdentifier%d",indexPath.row]; 

可以採取另一種方法是指定標籤checkboxbuttons和採取的appDelegate文件中的一個字典和複選框設定值tag.initially你可以通過設置是或者選中或取消選中,然後在cellforrowatindexpath方法中設置值。根據appdelegate dictionary設置複選框的值。當用戶選擇或取消選擇按鈕時,更新appdelegate字典中的狀態。

+0

嗨,我不明白什麼是使用這個效果,請告訴我。非常感謝 – sajaz

+0

你不應該這樣做,這將使TableView反應非常緩慢,滾動會滯後。 – rckoenes

+0

如果你使用靜態CellIdentifier,那麼這個標識符將被用於下一行。但是如果你創建%d,那麼將爲每一行創建不同的標識符,但是由於rckoess表示滾動將會變慢。 – Bhoomi

相關問題