我有我的應用程序中的自定義單元格的tableview和每個單元格包含兩個複選框按鈕。自定義單元格的表視圖
問題是,當一個滾動事件觸發(向上或向下)時,它正在重新加載tableview。因此,複選框按鈕變爲初始狀態。
請給我一個解決方案。
謝謝你
我有我的應用程序中的自定義單元格的tableview和每個單元格包含兩個複選框按鈕。自定義單元格的表視圖
問題是,當一個滾動事件觸發(向上或向下)時,它正在重新加載tableview。因此,複選框按鈕變爲初始狀態。
請給我一個解決方案。
謝謝你
您應該在數據源中設置按鈕的狀態,並在創建單元格時加載此狀態。我寫了一個small Xcode project來證明這一點。
那麼你不應該使用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;
}
可以爲您節省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];
}
}
我認爲這個答案需要更多的信息纔能有用。你能否添加更多細節,例如「我要添加目標?」或者可能是「如何在設置後使用這些信息?」。基本上,我認爲你使用的是基於這個問題的高級概念,可能超出了OP的Obj-C技能(沒有進一步的解釋)。 – mbm29414
你將不得不自己維護一個列表來確定哪些小區應檢查與否。請記住,在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
非常感謝您的幫助,我使用單獨的類來定製單元格。我的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
是否使用cellForRowAtIndexPath
。如果是的話,而不是
static NSString [email protected]"CellIdentifier"
使用
NSString *CellIdentifier=[NSString string[email protected]"CellIdentifier%d",indexPath.row];
可以採取另一種方法是指定標籤checkboxbuttons和採取的appDelegate文件中的一個字典和複選框設定值tag.initially你可以通過設置是或者選中或取消選中,然後在cellforrowatindexpath方法中設置值。根據appdelegate dictionary設置複選框的值。當用戶選擇或取消選擇按鈕時,更新appdelegate字典中的狀態。
你對你的單元格使用'dequeueReusableCellWithIdentifier'方法嗎? – beryllium
是的,我正在使用dequeueReusableCellWithIdentifier。是這樣嗎? – sajaz