2011-03-10 81 views
0

我正在學習如何處理子視圖,並且我正在很難操縱其中一個子視圖的位置。每個子視圖都有一個唯一的標籤。值得注意的是,我在UITableCell中搜索子視圖,UITableView有大約5行。UIView子視圖沒有響應變化

如果我做任何這樣的:

UIView *mike = [self.view viewWithTag:6]; 
mike.frame = CGRectMake(250, 5, 25, 20); 
mike.backgroundColor = [UIColor redColor]; 
NSLog(@"mike=%@ tag=%d",[[mike class] description], [mike tag]); 

或:

UILabel *label = (UILabel *)[self.view viewWithTag:6]; 
label.frame = CGRectMake(250, 5, 25, 20); 
label.backgroundColor = [UIColor redColor]; 
NSLog(@"label=%@ tag=%d",[label text], [label tag]); 

子視圖不改變位置,但是如果我使用下面的代碼,它的工作搜索。

for (UIView *subview0 in [self.view subviews]) 
{ 
    for (UIView *subview1 in [subview0 subviews]) 
    { 
    for (UIView *subview2 in [subview1 subviews]) 
    { 
     if ([[[subview2 class] description] isEqualToString: @"UILabel"]) 
     { 
     [subview2 setText:@"mike"]; 
     subview2.frame = CGRectMake(250, 5, 25, 20); 
     subview2.backgroundColor = [UIColor redColor]; 
     } 
    } 
    } 
} 

任何幫助非常感謝。

麥克

編輯:從控制檯上執行

2011-03-10 19:53:42.344麥克=的UILabel標籤= 6 0x4b59610
2011-03-10 19:53:42.344標記= 842標記= 6 0x4b59610
2011-03-10 19:53:42.345 0-子視圖= PerformAnalysisCustomCell標籤= 0
2011-03-10 19:53:42.345 1-子視圖= UIGroupTableViewCellBackground標籤= 0
2011-03-10 19:53:42.346 2-subview = UIView tag = 0 0x4d62910
2011-03-10 19:53:42.349 1-subview = UITableViewCellContentView tag = 0
2011-03-10 19:53 :42.349 2-subview = UILabel tag = 0 0x4b51320
2011-03-10 19:53:42.350 2-subview = UILabel tag = 1 0x4b59290
2011-03-10 19:53:42.350 2-subview = UILabel標籤= 2 0x4b59370
2011-03-10 19:53:42.358 2-子視圖=的UILabel標籤= 3 0x4b59410
2011-03-10 19:53:42.359 2-子視圖=的UILabel標籤= 4 0x4b594b0
2011-03 -10 19:53:42.360 2-subview = UILabel tag = 5 0x4b59560
2011-03-10 19:53:42.360 2-subview = UILabel標記= 6 0x4b59610

將%p放入NSLog後,您可以將內存地址地址設置爲相同。其他標籤= 6行有不同的地址,所以我應該期望至少該單元格移動。

+1

是self.view一個tableView?即使在所有表格單元中,標籤都是唯一的嗎?你在哪裏設置標籤的標籤? – GendoIkari 2011-03-10 19:32:28

+0

是的。每個標籤對單元格都是唯一的,但是不會重複表格單元格中的整個表格。我在IB中設置標籤。 – hydev 2011-03-10 19:56:11

+0

啊...那麼你需要在1個單元格上做viewWithTag,而不是在整個tableView上。如果您在tableView上執行viewWithTag,則只會獲得該標籤的第一個實例。 – GendoIkari 2011-03-10 19:59:36

回答

0

您需要在每個單元上運行viewWithTag語句,而不是在整個tableView上運行。這應該很可能在cellForRowAtIndexPath中設置,然後您將重新加載在需要時更改的行。

0

我更喜歡UITableViewCell的子類,然後我可以通過屬性訪問我想要的東西。我不喜歡-viewWithTag:,它給我以前的問題,並使代碼難以管理。

0

你的前兩個例子完全一樣。在這種情況下,靜態類型(UIView * vs UILabel *)不會更改編譯器生成的代碼。

第三個例子應NSLog每個它操作的視圖。也許標籤沒有設置。

檢查諸如if (subview2.tag == 6)之類的東西,看看是否有多個具有相同標籤的視圖(聽起來像是有),也是有意義的。

您的日誌消息也可以打印視圖描述(或簡單地以「%p」格式顯示視圖的地址),以查看您使用的視圖是否相同。

+0

謝謝!我在上面添加了一些輸出,您可以在其中看到地址,並且至少有一個子視圖顯示爲相同的地址。因此,這應該改變 - 不是嗎? – hydev 2011-03-10 20:02:00

+1

至少有一個子視圖具有相同的地址,但它可能不是您看到的變化之一。您最初斷言「每個子視圖都有一個唯一標記」對於您正在調用的視圖而言是錯誤的--viewWithTag:on(您是在表視圖中而不是在單元格中調用它)? – 2011-03-11 19:16:35