2011-04-14 92 views
1

我正在處理UISegmentedControl的自定義實現。 我想創建一個組件,能夠接收配置數據,並從中獲得類似於UISegmentedControl的自定義視圖。處理自定義組件:子類UIView或UIViewController?

我開始繼承一個UIView,我可以創建自定義UISegmentedControl與此代碼:

CustomSegment *segment = [[CustomSegment alloc] 
         initWithTitles:[NSArray arrayWithObjects:@"one",@"two",nil]]; 
[self.window addSubview:segment]; 

但現在我想提高我的階級和一些自定義的參數添加到它。 例如,我想添加一個自定義分隔符,定義按鈕字體等...在這裏我的疑問: 是在UIView子類上工作還是建議我繼承一個UIViewController,我可以在其中管理View像-和-(void)viewDidLoad這樣的方法的層次結構?在我使用UIViewController的同時,我可以調用自定義的init並定義如何將我的子視圖組裝到 - (void)loadView中。在一個簡單的UIView子類中,當我啓動自定義init方法時,我立即設置了子視圖。

+0

也考慮繼承UIControl – Felix 2011-04-14 19:06:22

回答

4

不要使用UIViewController,只需像你一樣擴展UIView類並繼續擴展它的功能。

請記住保存一個指向您添加的每個子視圖(即按鈕)的指針,以便稍後能夠訪問它們。

定義自定義setter方法,例如,改變按鈕標籤標題定製的setter是:

- (void) setButton1Title:(NSString*)str forState:(UIControlState)state{ 
    //You can add some control here 
    if ([str length] > 20) return; 
    [_button1 setTitle:str forState:state]; //_button1 is my reference to the button 
} 

等。不要直接訪問你的子視圖,而要使用方法。

此外,您可以使用「layoutSubviews」方法來定義您的視圖將如何顯示在您的自定義視圖中。

希望它可以幫助你。


編輯:在你的情況,我沒有,但爲什麼用lauoutSubviews方法我想告訴你什麼,我想說的。

可以說,例如我需要創建一個UIView類來表示我的應用程序中的「Contact」對象。

這是我會做什麼:

@interface ContactView : UIView{ 
    UILabel* _nameLabel; 
    UILabel* _ageLabel; 
    Contact* _contact; 
} 
@property (retain) Contact* contact; 

@end 

@implementation ContactView 

@synthetize contact = _contact; 

-(id)initWithContact:(Contact*)c{ 
    self = [super init]; 
    if (self) { 
     _nameLabel = [[UILabel alloc] init]; 
     _nameLabel.frame = CGRectZero; 
     [self addSubview:_nameLabel]; 
     [_nameLabel release]; 

     _ageLabel = [[UILabel alloc] init]; 
     _ageLabel.frame = CGRectZero; 
     [self addSubview:_ageLabel]; 
     [_ageLabel release]; 

     self.contact = c; 
    } 
} 

- (void) layoutSubviews{ 
    [super layoutSubviews]; 

    _nameLabel.frame = CGRectMake(0.0f, 0.0f, 200.0f, 25.0f); 
    _ageLabel.frame = CGRectMake(0.0f, 25.0f, 200.0f, 25.0f); 

    if (self.contact){ 
     _nameLabel.text = self.contact.name; 
     _ageLabel.text = self.contact.age; 
    }else{ 
     _nameLabel.text = @"Unavailable"; 
     _ageLabel.text = @"Unavailable"; 
    } 
} 

- (void) setContact:(Contact*)c{ 
    self.contact = c; 
    [self layoutSubviews]; 
} 

@end 

時退房「layoutSubiews」如何來設置正確的框架和數據的標籤。 通常,我在創建自定義UITableViewCells時需要重複使用視圖。

讓我知道我是否感到困惑。

+0

謝謝你的回答,我曾經與layoutSubviews進行交互,只是爲了方向管理。你是否建議以類似的方式使用這個函數drawRect?你能否提供更多關於這方面的細節? – MatterGoal 2011-04-14 19:42:10

+0

我編輯了我原來的評論。 – macnico 2011-04-14 21:00:08

+0

我確定你不必直接調用layoutSubview,而應該調用setNeedLayout,但我明白你的代碼的其餘部分是什麼意思。 – MatterGoal 2011-04-14 21:23:08

相關問題