2011-02-04 104 views
1

我正在創建一個UIView子類(我稱之爲MarqueeLabel),該子類在UILabel文本太長時間內以字幕方式動畫顯示子視圖UILabel ivar包含的視圖。將實例變量的setter/getters傳遞給一個類

我希望有一個乾淨的執行,而無需編寫我MarqueeLabel類只是方法來設置/檢索所有標準的UILabel(文本,字體,顏色等)實例的UILabel伊娃的變量。我找到了一種方法來處理郵件轉發 - 發送到MarqueeLabel的所有無法識別的方法都傳遞給UILabel ivar。在我的情況下,MarqueeLabel無法識別的方法是通常與UILabel一起使用的方法。

有一些問題,這種方法雖然:
你必須使用[marqueeLabel setText:@"Label here"],而不是marqueeLabel.text
2.編譯器給出了上面這行的警告,這是因爲:

'MarqueeLabel'可能不會響應'-setText:'

我想知道該忽略但會惹惱其他人。

爲了避免這些問題,有沒有什麼辦法可以「提出」一個伊娃的方法,以便他們在使用這個類的時候可以訪問某些東西,同時仍然作用於伊娃爾對象?

謝謝!

注意:我設置它的方式可能不是最好的方法。也許繼承UILabel的子類或類會更好,但我無法理解動畫+裁剪(當文本滾動離開包含UIView並消失時)可以使用這些方法完成。

注2:我知道你可以使用marqueeLabel.subLabel.text其中subLabel是子視圖UILabel。這可能是我採取的方向,但也可以看看是否有更好的解決方案!

回答

1

對於屬性,您可以在接口中定義一個屬性,並在實現中使用@dynamic,以便您不必創建存根實現。確保您也覆蓋valueForUndefinedKey:setValue:forUndefinedKey:並轉發到您的標籤。

對於不屬於屬性一部分的任何方法,可以使用類別聲明方法而不實現它。這將擺脫警告,但仍然使用內置轉發。

//MarqueeLabel.h 
#import <UIKit/UIKit.h> 
@interface MarqueeLabel : UIView {} 
@property (nonatomic, copy) NSString *text; 
@end 
@interface MarqueeLabel (UILabelWrapper) 
- (void)methodToOverride; 
@end 

//MarqueeLabel.m 
#import "MarqueeLabel.h" 
@implementation MarqueeLabel 
@dynamic text; 
- (id)valueForUndefinedKey:(NSString *)key { 
    return [theLabel valueForKey:key]; 
} 
- (void)setValue:(id)value forUndefinedKey:(NSString *)key { 
    [theLabel setValue:value forKey:key]; 
} 
@end 
+0

完全按照我的想法工作,謝謝!我在想``動態`將需要以某種方式使用,但我沒有遇到forUndefinedKey方法,只有forwardInvocation。我想可能你的意思是`[theLabel setValue:value forKey:key];`儘管如此。 – Chuck 2011-02-04 04:56:58

相關問題