2017-06-20 22 views
1

我用一個NSString *類型屬性添加到UIButton,但是今天,我想一個BOOL type屬性isScrolling添加到UIScrollView指示滾動視圖是否以同樣的方式滾動但表現有些不對勁,這裏是我的代碼:我可以使用類別和運行時將一個BOOL類型屬性「isScrolling」添加到UIScrollView嗎?

#import <UIKit/UIKit.h> 

@interface UIScrollView (Util) 

@property (nonatomic,assign) BOOL isScrolling; 

@end 




#import <objc/objc-runtime.h> 

@interface UIScrollView()<UIScrollViewDelegate> 

@end 

@implementation UIScrollView (Util) 

static void *strKey = &strKey; 

- (void)setIsScrolling:(BOOL)isScrolling{ 
objc_setAssociatedObject(self, & strKey, isScrolling, OBJC_ASSOCIATION_ASSIGN); 
} 

- (BOOL)isScrolling{ 
    return objc_getAssociatedObject(self, &strKey); 
} 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ 
    self.isScrolling = YES; 
} 

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{ 
    self.isScrolling = NO; 
} 

@end 

和錯誤是: enter image description here

有什麼辦法對付thses錯誤,我們可以使用類別和運行時,實現添加BOOL屬性UIScrollView的目標指示whethe滾動視圖滾動?

希望有人能給我一些建議,非常感謝。

+0

後的代碼,因爲它是。請不要截圖。 –

+0

objc_getAssociatedObject用於對象類型。 BOOL不是對象類型。這就是爲什麼你得到了錯誤 –

+0

@Lkrishna是的,我編輯過。 –

回答

-1

由於錯誤顯示BOOL爲ID的隱式轉換,你需要發送一個對象,而不是原始類型。

爲objc_setAssociatedObject方法簽名爲

/** 
* Sets an associated value for a given object using a given key and association policy. 
* 
* @param object The source object for the association. 
* @param key The key for the association. 
* @param value The value to associate with the key key for object. Pass nil to clear an existing association. 
* @param policy The policy for the association. For possible values, see 「Associative Object Behaviors.」 
* 
* @see objc_setAssociatedObject 
* @see objc_removeAssociatedObjects 
*/ 

OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy) 
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0); 

上面可以看到該值應爲對象。

代碼 @property (assign, nonatomic) BOOL isScrolling;更改爲@property (strong, nonatomic) NSNumber *scrolling;

對你來說objc_setAssociatedObject(self, &strkey, scrolling, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

改變OBJC_ASSOCIATION_ASSIGNOBJC_ASSOCIATION_RETAIN_NONATOMIC而使用[_scrolling boolValue]檢查。

+0

是的,你是對的。但是我們可以在類別中處理UIScrollView委託,以便我們可以將值設置爲「滾動」屬性。我剛剛嘗試過,它是無效的。您有任何想法嗎? –

+0

您可以覆蓋類別中的委託方法。我可以試着幫你發佈你的代碼。 – Tabz

0

試試這個:

嘗試將boolean轉換爲nsnumber。

-(void)setIsScrolling:(BOOL)isScrolling{ 
     objc_setAssociatedObject(self, & strkey), [NSNumber numberWithBool:isScrolling], OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    } 
-1

不能將原始數據類型設置爲AssociatedObject,它是一個對象。當您保存數據時,將bool轉換爲NSNumber。讀取數據時將NSNumber轉換爲bool

OBJC_ASSOCIATION_ASSIGN - 指定對關聯對象的弱引用。 OBJC_ASSOCIATION_RETAIN_NONATOMIC - 指定對關聯對象的強引用,並且關聯不是自動創建的。

.h文件中:

#import <UIKit/UIKit.h> 

@interface UIScrollView (ScrollViewCategory) 

@property (nonatomic, strong)NSNumber *isScrolling; 

@end 

.m文件

@interface UIScrollView() 

@end 

#import <objc/runtime.h> 

@implementation UIScrollView (ScrollViewCategory) 

@dynamic isScrolling; 

- (void)setAssociatedObject:(id)object { 
    objc_setAssociatedObject(self, @selector(associatedObject), object, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

- (id)associatedObject { 
    return objc_getAssociatedObject(self, @selector(associatedObject)); 
} 
1

一種相關聯的對象必須只是,一個對象,並且因此非對象BOOL類型的值將不工作,除非包裝成一個對象。幸運的是很容易的:

  • 在調用objc_setAssociatedObject變化isScrolling@(isScrolling)和更改OBJC_ASSOCIATION_ASSIGNOBJC_ASSOCIATION_RETAIN_NONATOMIC。這將創建並傳遞一個NSNumber對象,第二個更改請求將此對象的生命週期與第一個參數self的生命週期綁定在一起。
  • isScrolling變更objc_getAssociatedObject(self, &strKey)變爲[objc_getAssociatedObject(self, &strKey) boolValue]。這將從存儲的NSNumber對象中提取BOOL值。

HTH

相關問題