2014-07-15 198 views
0

我有一個UITableView,我有兩個數據源。Objective-C的雙指針。改變指針指向的位置。

@property(strong)NSArray* mediaItems; 
@property(strong)NSArray* likesItems; 

在很多情況下,我需要交換兩個源。因此,有很多if語句我檢查

if (self.activePage == kDrawingsPage) self.mediaItems = responseObject; 
else self.likesItems = responseObject; 

我想要做的是不需要像這樣繼續檢查。使用雙指針。我不能使用雙指針來做類似的事情嗎?在我需要訪問我可以簡單地做

- (NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section { 
NSArray* arr = *self.activeItems; 
return [arr count]; 
} 

而不是

- (NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section { 
if (self.activePage == kDrawingsPage) [self.mediaItems count]; 
else [self.likesItems count]; 
} 

不應在雙指針或數據的地方(這不起作用)

NSArray** activeItems = &self.mediaItems; 

然後在這種情況下類似的工作?如果它不能以其他方式工作,我可以最小化這些if語句。

回答

0

您可以使用計算財產

@interface

@property (readonly) NSArray* activeItems; 

@implementation

- (NSArray *)activeItems { 
    return self.activePage == kDrawingsPage ? self.mediaItems : self.likesItems 
} 

所以你可以做

- (NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section { 
    return [self.activeItems count]; 
} 

&self.mediaItems不會給你任何有意義的價值,因爲它與&[self mediaItems]相同,它給你一個返回的臨時對象的地址。

它應該是&_mediaItems,即潛在的伊娃的地址。

+0

一般來說,這將起作用,但值得注意的是,這段代碼很可能會導致崩潰。像這樣的派生數據源屬性的問題在於,它可以在集合視圖在數據源調用之間重新加載時更改,這可能會導致一些異常,通常是嘗試訪問不存在的數組索引的超出範圍的異常。理想情況下,將會有一個實際的支持ivar,並在觸發視圖重新加載的同時進行修改。 – Dima

+0

@Dima是的。更好的解決辦法是把它們分開。一個視圖/視圖控制器應該只負責一個頁面。 –

+0

迪馬說數據源可能會在你不知情的情況下改變是正確的。如果你想讓它們在同一個視圖控制器中,我會創建一個新的NSArray屬性作爲集合視圖的數據源,然後當你設置activePage(自定義setter或kvo)時,使用mediaItems或者likesItems設置NSArray屬性 – SomeGuy