2011-05-30 60 views
4

我使用CALayerCATextLayers在iPhone上的數獨網格上佈置數字。清除CALayer

我有一個tableView列出了一些sudokus。當我點擊一個表格單元格時,它會顯示推向導航控制器的另一個viewController中的數獨。

在我的- (void)viewWillAppear ...方法,我打電話給我的- (void)loadSudoku方法,我會告訴你下面。

問題是,當你看一個數獨,回到使用導航欄中的「後退」按鈕的表視圖,然後點擊另一個數獨。然後舊的數獨仍然在那裏,而新的數獨則被繪製在舊的數獨之上。

我想我需要以某種方式清除舊的。有任何想法嗎? 我確實有一個背景圖像通過實際的數獨網格的界面生成器設置。我不想刪除這個。

,吸引了數獨的方法是這樣的:

- (void)loadSudoku 
{ 
    mainLayer = [[self view] layer]; 
    [mainLayer setRasterizationScale:[[UIScreen mainScreen] scale]]; 

    int col=0; 
    int row=0; 
    for(NSNumber *nr in [[self sudoku] sudoku]) 
    { 
     if([nr intValue] != 0) 
     { 
      //Print numbers on grid 
      CATextLayer *messageLayer = [CATextLayer layer]; 
      [messageLayer setForegroundColor:[[UIColor blackColor] CGColor]]; 
      [messageLayer setContentsScale:[[UIScreen mainScreen] scale]]; 

      [messageLayer setFrame:CGRectMake(col*36+5, row*42, 30, 30)]; 
      [messageLayer setString:(id)[nr stringValue]]; 

      [mainLayer addSublayer:messageLayer]; 
     } 

     if(col==8) 
     { 
      col=0; row++; 
     }else 
     { 
     col++; 
     } 
    } 
    [mainLayer setShouldRasterize:YES]; 
} 

回答

8

要僅刪除文字圖層,你可以做到這一點 -

NSIndexSet *indexSet = [mainLayer.sublayers indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
    return [obj isMemberOfClass:[CATextLayer class]]; 
}]; 

NSArray *textLayers = [mainLayer.sublayers objectsAtIndexes:indexSet]; 
for (CATextLayer *textLayer in textLayers) { 
    [textLayer removeFromSuperlayer]; 
} 

概括地說,第一條語句得到所有的指標文本圖層是超過根層的子圖層。然後在第二條語句中,我們將所有這些圖層放在一個單獨的數組中,然後將它們從它們的超級圖層(它們是我們的根層)中移除。

原來的答案

嘗試這樣做,

mainLayer.sublayers = nil; 
+0

@Deepak謝謝。我通過實際的數獨網格的界面生成器設置了背景圖像。這樣做也會消失。 – Linus 2011-05-30 10:36:34

+0

更新了答案。 – 2011-05-30 10:48:24

+0

@Deepak再次感謝你。我在我的「viewWillDisappear」方法中測試了它,以在離開視圖時清除所有內容。我不能讓它工作。我也覺得有一個小錯字?我'indexesOfObjectsPassingTest:*(id obj'應該是'indexesOfObjectsPassingTest:^(id obj'正確?但是,這個:'返回[[obj類] isMemberOfClass:[CATextLayer類]];'在每個對象上返回false ... – Linus 2011-05-30 11:07:14