2014-06-20 79 views
5

我的UITableView有2個定製單元:小區1小區2 &的UITableViewCell重排序控制表時滾動消失

我的UITableView顯示的一個或另一個根據枚舉值。

如果enumValue == 0,小區1所示,並表不應該允許重新排序 如果enumValue> 0,顯示小區2和表應該允許重新排序

所有這一切工作正常。重排序控件在枚舉值更改時適當地顯示。

我的問題:當重排序控件出現在單元格上時,當行滾動出視圖時它們將消失。這是爲什麼發生?

對不起,關於格式和粗略的代碼。我沒有問題的網站。任何明顯突出的東西都可能導致這種情況?

> // enum 
> 
> -(void)setScorePhase:(phase)scorePhase { 
> 
>  _scorePhase = scorePhase; 
>  
>  if (scorePhase > score) { 
>   self.btnPrevious.hidden = NO; 
>   [self.tableCorps setEditing:YES animated:YES]; 
>  } else { 
>   self.btnPrevious.hidden = YES; 
>   [self.tableCorps setEditing:NO animated:YES]; 
>  } 
>  
>  switch (scorePhase) { 
>   case score: 
>    self.lblInstructions.text = @"Give your scores"; 
>    self.btnNext.titleLabel.text = @"Next"; 
>    break; 
>   case bestdrums: 
>    self.lblInstructions.text = @"Order the corps by best percussion"; 
>    self.btnNext.titleLabel.text = @"Next"; 
>    break; 
>   case besthornline: 
>    self.lblInstructions.text = @"Order the corps by best hornline"; 
>    self.btnNext.titleLabel.text = @"Next"; 
>    break; 
>   case bestguard: 
>    self.lblInstructions.text = @"Order the corps by best colorguard"; 
>    self.btnNext.titleLabel.text = @"Next"; 
>    break; 
>   case loudesthornline: 
>    self.lblInstructions.text = @"Order the corps by loudest hornline"; 
>    self.btnNext.titleLabel.text = @"Next"; 
>    break; 
>   case favorite: 
>    self.lblInstructions.text = @"Order the corps by your favorite"; 
>    self.btnNext.titleLabel.text = @"Submit"; 
>    break; 
>    
>   default: 
>    self.lblInstructions.text = @"Error"; 
>    break; 
>  } 
>  [self.tableCorps reloadData]; 
} 




> 

     -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    >   
    >   return 2; 
    >  } 
    >  
    >  -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    >   
    >   switch (section) { 
    >    case 0: return @"World Class"; 
    >    case 1: return @"Open Class"; 
    >    default: return @"Error"; 
    >   } 
    >  } 
    >  
    >  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    >   
    >   if ([self.arrayOfPerformingCorps count]) { 
    >    switch (section) { 
    >     case 0: return [self.arrayOfWorldClass count]; 
    >     case 1: return [self.arrayOfOpenClass count]; 
    >     default: return 0; 
    >    } 
    >   } else { 
    >    return 0; 
    >   } 
    >  } 
    >  
    >  -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    >   
    >   UITableViewCell *cell; 
    >   if (self.scorePhase == score) { 
    >    cell = [self.tableCorps dequeueReusableCellWithIdentifier:@"cell1"]; 
>cell.showsReorderControl = NO; 
    >    
    >   } else { 
    >    cell = [self.tableCorps dequeueReusableCellWithIdentifier:@"cell2"]; 
>cell.showsReorderControl = YES; 
    >    
    >   } 
    >   
    >   
    >   PFObject *corps; 
    >   if ([self.arrayOfPerformingCorps count]) { 
    >    if ((int)[indexPath section] == 0) { 
    >     corps = [self.arrayOfWorldClass objectAtIndex:[indexPath row]]; 
    >    } else { 
    >     corps = [self.arrayOfOpenClass objectAtIndex:[indexPath row]]; 
    >    } 
    >    
    >    UILabel *corpsNameLabel = (UILabel *)[cell viewWithTag:0]; 
    >    corpsNameLabel.text = corps[@"corpsName"]; 
    >    
    >    
    >   } else { 
    >    //cell.textLabel.text = @""; 
    >    //cell.detailTextLabel.text = @""; 
    >   } 
    >   
    >   return cell; 
    >  } 
    >  
    >  #pragma mark - Table Reordering 
    >  - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
    >   if (self.scorePhase > score) return YES; 
    >   else return NO; 
    >  } 
    >  - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { 
    >   return UITableViewCellEditingStyleNone; 
    >  } 
    >  - (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath { 
    >   return NO; 
    >  } 
    >  - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
    >   return YES; 
    >  } 
    >  - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath 
    > toIndexPath:(NSIndexPath *)destinationIndexPath{ 
    >   
    >  } 
    >  
    >  - (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath 
    > *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath 
    >  { 
    >   if (sourceIndexPath.section != proposedDestinationIndexPath.section) { 
    >    NSInteger row = 0; 
    >    if (sourceIndexPath.section < proposedDestinationIndexPath.section) { 
    >     row = [tableView numberOfRowsInSection:sourceIndexPath.section] - 1; 
    >    } 
    >    return [NSIndexPath indexPathForRow:row inSection:sourceIndexPath.section]; 
    >   } 
    >   
    >   return proposedDestinationIndexPath; 
    >  } 
+0

經過進一步測試,我認爲這是一個iOS 8測試版問題。 –

+0

我也面臨同樣的問題。我傾向於相信它與iOS 8測試版的問題。 – cybervedaa

回答

18

這是iOS 8的錯誤。一個簡單的解決方法是在UITableViewCell子像這樣覆蓋prepareForReuse

- (void)prepareForReuse 
{ 
    [super prepareForReuse]; 
    [self setEditing:NO animated:NO]; 
} 
+0

+1。這似乎解決了這個問題。謝謝。 – Mustafa

+1

非常感謝!順便說一句,這也發生在iOS 8.1以及似乎不是測試版問題 – kacho

+1

我也看到這在8.1中,只是一個筆記,如果你不使用UITableViewCell子類,你可以'cell.editing = NO '在'tableView:cellForRowAtIndexPath:'調用中 – Javawag

-1

iOS 8 beta版問題。不是代碼問題。

+0

好的。但這不是解決方案! – alternatiph

0

我面臨與iOS 8 beta版本相同的問題。

我想出了當表處於編輯模式時,有兩個視圖是UITableViewCell的一部分,它們負責表編輯;這些是,UITableViewCellEditControl和UITableViewCellReorderControl。 這些視圖都是第一次創建表並且一切正常,但隨着表重新加載/滾動,這些視圖消失。

我認爲這個問題是與Beta版本,我試着用iOS 8 Beta 2版本,問題仍然存在。我們可能不得不等待下一個版本。

+3

iOS 8版本 –

0

我一直有同樣的問題... IOS 8 Beta 2中

我已經想通了,這個問題是某處細胞「dequeueReusableCellWithIdentifier」區域。只要單元格滾動並使用可重用單元格,所有刪除和移動圖像就會消失。

作爲一種變通方法(此代碼尚處於測試),我拿出了代碼重用和註冊細胞...

tableViewFromNib.registerClass(myViewControllerCell.self, forCellReuseIdentifier: cellReuseID) 
    . 
    . 
let cell = tableView!.dequeueReusableCellWithIdentifier(cellReuseID, forIndexPath: indexPath) as myViewControllerCell 

,並用此代替它(在的cellForRowAtIndexPath).....

let cell = UITableViewCell() 

....它都有效。我知道這不是一個真正的解決方案(大量未使用的細胞在飛行),但它讓我在進一步編碼時遇到了問題。問題解決後,我會回來並添加出隊代碼。

PS ...這可能是一個評論,但我只是開始stackoverflow,並沒有足夠的評論點。

2

我在表視圖中有可重新定購單元不能重新定購單元的問題。 我嘗試了一些解決方案(不同的可重複使用的標識符,...)我找到的解決方案是在我的setter中將屬性showsReorderControl設置爲YES。

self.showsReorderControl = reorderable; 
[self setEditing:reorderable animated:NO]; 

希望幫助

+1

+1仍然存在。這似乎解決了問題,如果您在UITableViewCell子類中使用它,或者在willDisplayCell UITableView委託方法中將此代碼用於單元格。 – Mustafa

+0

@Mustafa我希望我對你的評論進行投票會給你一些聲望。 ;)在'willDisplayCell'方法中使用它是一個很棒的建議:) – alternatiph

0

沒有足夠的信譽分,直接發表評論的帖子,但我已經在iOS的10碰上一個相關的問題是瓦迪姆Yelagin的解決方案解決。

如果一個UITableViewCell子類處於編輯狀態,並且同時顯示重新排序控件和詳細按鈕(包圍的i),例如, UITableViewCellAccessoryDe​​tailDisclosureButton,當重用時,細節按鈕將出現在兩個地方:1)預期位於單元格的右側,2)單元格的左上角。

點擊這兩個按鈕中的任意一個都會正確調用accessoryButtonTapped:方法,但是,自然只需要一個按鈕。 :)

重寫prepareForReuse爲Vadim Yelagin提議也解決此問題。

-1

只要確保你們不會浪費像我這樣的6h調試....我設置了一個糟糕的佈局,使重新排序控制超出了視圖屏幕(就像我遇到的here)。因此,請確保您的自動佈局不會中斷您的應用程序

相關問題