2014-01-28 35 views
1

我有一個NSMutableArray中,我想用來存儲一些CGRect S:的iOS:@encode和使用直接訪問子類的屬性 - >

所以,我嘗試使用以下(舉例):

UIView *view = [[UIView alloc] initWithFrame:(CGRect){{0, 0}, 50, 50}]; 

[array1 addObject:[NSValue value:&view->frame withObjCType:@encode(CGRect)]]; 

但是這是導致警告:&view->frame

這是一個屬性,但我想直接訪問它,這樣我可以用上面的語法和使用它像上面的value:參數。

我知道我可以訪問&self->_view(如果我想將視圖添加到陣列,這是不是這裏的情況),所以我嘗試&view->frame(甚至&view->_frame),但它造成的警告並不起作用。

會,除非我所以下面的第一:

CGRect tempRect = view.frame; 
[array1 addObject:[NSValue value:&tempRect withObjCType:@encode(CGRect)]]; 

所以我的問題是,我做了什麼錯在這裏與&view->frame(或甚至:&view->_frame)?

是有辦法做到這一點,而不必首先做到這一點:

CGRect tempRect = view.frame; 
[array1 addObject:[NSValue value:&view->frame withObjCType:@encode(CGRect)]]; 

換句話說,我可以簡單地使用強制這裏,而無需首先創建一個CGRect(tempRect) ?

附錄:

如果我沒有記錯,我想用C鑄造上&是無效的。我不確定,請讓我知道我的記憶是否正確。

+1

這看起來真的很邪惡。爲什麼不使用NSValue的CGRect類別? https://developer.apple.com/library/ios/documentation/uikit/reference/NSValue_UIKit_Additions/Reference/Reference.html –

+0

你不能使用'view-> frame'或'view - > _frame',因爲'UIView'沒有實例變量框架或_frame在其公共接口中! - 如Stefan所說,使用'valueWithCGRect:'是最好的解決方案。 –

+0

@StefanFisk你能解釋它的邪惡嗎? – Unheilig

回答

2
[array1 addObject:[NSValue valueWithCGRect:view.frame]]; 

CGRect rect = [[array1 lastObject] CGRectValue]; 

文檔:NSValue UIKit Additions Reference

+0

但是,我的方法(雖然像其他人聲稱的那樣邪惡,它會以某種方式點燃我的好奇心)仍然有可能嗎?請您詳細說明我的方法的好處(如果有的話)和不好的,以及它有什麼問題?提前致謝。 – Unheilig

+0

你的方法是不可能的,因爲'UIView'沒有存儲其框架的實例變量。有關詳細信息,請參閱[此答案](http://stackoverflow.com/a/13980286/77567)。 –

+1

你能來最接近的是'[NSValue valueWithBytes:(的CGRect){view.frame.origin,view.frame.size} objCType:@encode(的CGRect)]',這是令人困惑的,並調用'view.frame'兩次。 –