2012-05-03 48 views
1

我已經實現了與自定義單元格的tableview。在iPhone中滾動UITableView的問題..滾動向上/向下數據更改/重新加載

1.Custom細胞 enter image description here

自定義帶有標記,以顯示日期和一個UI切換到設置警報細胞。

我的表視圖似乎喜歡這樣,當我們接通uiswitches, enter image description here

2。表視圖

When user scrolls down the table view the bottom switches are turned off

enter image description here

山姆滾動時出現問題。

enter image description here

爲什麼這個問題會發生什麼呢?以及如何預防它?在索引路徑方法

細胞用於行

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Note: I set the cell's Identifier property in Interface Builder to DemoTableViewCell. 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 

    //To display custom cell with label and switch 
    if(indexPath.row< [appDelegate.alarmsArray count]) 
    { 
     ReminderCell *cell = (ReminderCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName]; 
     if (!cell) 
     { 
      NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil]; 
      cell = [topLevelItems objectAtIndex:0]; 
     } 

     cell.reminderSwitch.tag = indexPath.row; 

     NSMutableDictionary *dict = [appDelegate.alarmsArray objectAtIndex:indexPath.row]; 
     cell.label.text = [dict objectForKey:@"string"]; 
//========================================= 
     cell.reminderSwitch.on = NO; 
//========================================= 
     return cell; 
    } 


    //Add + button on the last row of uitableview cell.. 
    if(indexPath.row == [appDelegate.alarmsArray count]) 
    { 
     UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd]; 
     button.frame = CGRectMake(114, 9.5, 33, 33); 
     [button addTarget:self action:@selector(AddNewRow:) forControlEvents:UIControlEventTouchUpInside]; 
     [cell.contentView addSubview:button ]; 
     return cell; 
    } 

    return cell; 
} 
+3

請附上您的cellForRowAtIndexPath方法,在其中設置開關打開或關閉。 – jrturton

+1

您是否正在存儲交換機的值?你在重複使用單元格嗎?你在使用UITableViewCell的子類嗎?您是否在該子類中正確使用prepareForReuse方法? – EmilioPelaez

+1

請張貼您的代碼如何維護開關的開/關狀態? –

回答

1
In CustomCell Class Write function like this 

-(void)SetSwitchStatus:(NSInteger)stat 
{ 
    if(stat == 0) 
     //Set Switch off 
    else 
    //Set Switch on 
} 


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

    StoresCustomCell *cell =(StoresCustomCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     [[NSBundle mainBundle] loadNibNamed:@"StoresCustomCell" owner:self options:nil]; 
     cell = StoreCell; 
    } 
    [cell SetSwitchStatus:[StatusArr objectAtIndex:indexPath.row]; 
} 

In ViewdidLoad Function Set 0 elements to all statusArr,, StatusArr count = TableView rows Count 

- (void)tableView:(UITableView *)sender didSelectRowAtIndexPath:(NSIndexPath *)path { 

if([[StatusArr objectAtIndex:path.row] isEqualToString:@"0"]) 
    [StatusArr replaceObjectAtIndex:path.row withObject:@"1"] 
else 
    [StatusArr replaceObjectAtIndex:path.row withObject:@"0"] 
} 
+0

對不起,先生,我沒有得到它在我的單元格在索引路徑方法行的問題? – Ranga

+0

是的,現在我寫這樣 – Ranga

+0

[email protected] – Ranga

1

大多數certanly你不重新使用的細胞,則開關被創建的每個被顯示的單元的時間(和所有的單元含量太)。 但要小心,因爲雖然您重複使用了單元格視圖,但您需要根據所需的值設置開關的開/關屬性。 所以你的方法:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) 
    { 
     /** THIS SHOULD BE REPLACED BY YOUR CONSTRUCTOR FROM NIB FILE **/ 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease]; 
    } 

    UISwitch *switch = (UISwitch *)[cell viewWithTag:SWITCH_TAG]; 
    switch.on = *is_on*; 

    return cell; 
} 
+0

我重用了單元格..cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];問題在哪裏 – Ranga

+0

對不起,先生,我沒有得到它在我的單元格中的索引路徑方法行的問題? – Ranga

+0

這不是重複使用單元格。這正在準備它能夠被重用。 如果你看看我的代碼(或任何其他tableview示例代碼),你會看到該單元格首先嚐試使用tableview中的dequeueReusableCellWithIdentifier:消息進行「提取」。這將要求已經分配但尚未使用的單元。如果返回的單元格爲零,那麼您需要按照您的方式創建一個新單元格。如果已返回一個已經存在的單元格,它將顯示爲上次配置,這就是爲什麼您需要爲新的或重新使用的實例定製它。 –

1

的問題將在的cellForRowAtIndexPath:數據源的方法。請記住,單元格是在表格滾動時創建和重用的,因此每個單元格的邏輯都不能對其狀態做出任何假設。

你可能(你應該)保持有報警它隨着時間的推移和一個布爾值,表示它們是否設置陣列...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"AlarmCell"; // your cell identifier goes here 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 
    CustomAlarmCell *alarmCell = (CustomAlarmCell *)cell; 
    Alarm *alarm = [self.alarmArray objectAtIndex:indexPath.row]; 

    BOOL alarmIsSet = [alarm.isSet intValue];  // you should have an NSNumber 0 or 1 to indicate the alarm is set 
    NSString *alarmTimeString = [alarm timeString]; // assume it has a date formatter and can render alarm time as string 

    alarmCell.timeLabel.text = alarmTimeString; 
    alarmCell.isSetSwitch.on = alarmIsSet; 

    return (UITableViewCell *)alarmCell; 
} 
+0

reused the cell .. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];但問題在哪裏 – Ranga

+0

@Ranga,我認爲你誤解了重複使用單元格的意思。這意味着表格不必在每次滾動時都創建一個新的單元格,但這並不意味着它會在該單元格中保留相同的數據 - 您必須在此答案指出時提供該單元格。 – rdelmar

+0

對不起,先生,我沒有得到它在我的單元格中的行索引路徑方法的問題? – Ranga

相關問題