2014-03-29 178 views
1

我很難過在我的代碼中創建一個UIViews數組。我創建了一個棋盤,每個方塊都是一個UIView。在我的UIViewController類的聲明,我有以下 -創建一個UIViews數組

@interface ChessViewController : UIViewController 
{ 
    ChessSquareView *squares[64]; 
} 

在我創建爲每個64個方格的意見,一個for循環這樣的.m文件 -

for (int i=0; i<64; i++) 
    squares[i] = [ [ChessSquareView alloc] initWithFrame:sq]; 

哪裏sq是該廣場的位置和尺寸(CGRect)。在ChessSquareView.m文件中,我將CGRect存儲在一個變量中。我將它們打印在initWithFrame函數中,以確保我添加了正確的值。

後來在代碼中(例如touchEnded函數)我循環查看視圖數組並查找對象都是錯誤的。什麼是創建UIViews數組的正確方法?

編輯:

爲了澄清在touchEnded功能我通過意見循環推測用戶敲擊的位置。在該函數中,我使用NSStringFromCGRect函數打印出每個視圖的frame,它們都是錯誤的。

for (int i=0; i<25; i++) 
{ 
    NSLog(@"Checking Square %@", NSStringFromCGRect([squares[i] frame])); 

} 
+0

1.請將UIViews正確放置?嘗試將一些隨機顏色添加到UIView的backgroundColor屬性中,當你添加它們並首先看到它。 2.您需要首先將位置轉換爲UIView的座標系。 – nsuinteger

+0

@nsuinteger - UIViews被正確放置。我已經改變了這個問題,因爲我現在確信它是一個數組創建問題。 – user220201

+1

使用NSArray,而不是C數組。 NSArray用於對象;它具有訪問和操作的有用方法,並且內存管理正確。 – matt

回答

0

在.H:

@property (nonatomic, strong) NSMutableArray *squares; 

在.M

self.squares = [[NSMutableArray alloc] init]; 

for(int i = 0; i < 64; i++) 
{ 
    ChessSquareView *v = [[ChessSquareView alloc] initWithFrame:sq]; 
    [self.squares addObject:v]; 
} 
+0

使用屬性創建一個變量並直接聲明它與我一樣(假設我也創建了一個NSMutableArray)有什麼區別?另外我會閱讀文檔並找出如何釋放它。 – user220201

+0

這只是創建數組的目標c方式。我嘗試了c方式,它似乎沒有響應任何與NSMutableArray(或NSArray)相同的方法。我認爲在這種情況下使用一個objective-c對象是'最安全的',特別是如果你將它設置爲一個屬性 - 在這種情況下,所有的內存管理將爲你處理,只要你使用ARC。 – jancakes

+0

啊,所以如果我將它創建爲屬性,內存管理是自動完成的? – user220201

0

和其他人一樣,我會建議使用一個NSMutableArray,而不是C數組。即使如此,C數組也應該可以工作。

但是,您發佈的代碼對每個視圖的框架使用相同的值。它們都應該重疊。 (除非你遺漏了計算你的sq矩形的代碼嗎?如果你這樣做了,那麼就顯示這個代碼,因爲解決這個問題無疑很重要。)

爲什麼不爲每個視圖指定一個標記,用我?這可以幫助你看到這些觀點是否以某種方式被炒得沸沸揚揚。

+0

我改變了代碼使用NSMutableArray像其他人建議和它的工作。我沒有爲所有視圖添加相同的CGRect。另外,我看到電路板渲染正確。所以問題出在陣列創建中。爲什麼我不能爲對象創建一個C數組?更重要的是,有沒有辦法創建一個對象數組而不使用NSArray或NSMutableArray? – user220201