微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用自定义组件:子类UIView或UIViewController?

如何解决使用自定义组件:子类UIView或UIViewController?

| 我正在研究UISegmentedControl的自定义实现。 我想创建一个能够接收配置数据并从中获得类似于UISegmentedControl的自定义视图的组件。 我开始对UIView进行子类化,并可以使用以下代码创建自定义UISegmentedControl:
CustomSegment *segment = [[CustomSegment alloc] 
                         initWithTitles:[NSArray arrayWithObjects:@\"one\",@\"two\",nil]];
[self.window addSubview:segment];
但是现在,我想改进我的课程,并向其中添加更多可自定义的参数。 例如,我想添加一个自定义的分隔符,定义按钮字体,等等...这是我的疑问: 在UIView子类上工作更好还是您建议我对UIViewController进行子类化,在该类中我可以使用-
(void)loadView
-(void)viewDidLoad
之类的方法管理View层次结构? 在一个简单的UIView子类中,当我启动自定义init方法时,我会立即设置子视图...使用UIViewController时,我可以调用自定义init并定义如何将我的子视图构建到-(void)loadView中。     

解决方法

不要使用UIViewController,只需像您一样扩展UIView类,并继续扩展其功能。 请记住将指针保存到您添加的每个子视图(即按钮),以便以后可以访问它们。 定义自定义设置器,例如,用于更改按钮标签标题的自定义设置器为:
- (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,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时必须使用很多视图,因此我经常使用它。 让我知道我是否感到困惑。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。