在iOS框架中创建类似ASP.Net的用户控件

时间:2011-11-13 18:54:43

标签: asp.net objective-c ios interface-builder user-controls

我想要做的事情是我知道在ASP.Net中是直截了当的,也许我只需要调整我的想法(我在iOS中自学开发),但我无法弄清楚如何使用XCode / Objective-C实现这一目标。

我想要做的是布局几个按钮,一个标签,并以可重用的格式编写一些代码,如ASP.Net中的用户控件。然后使用该“包”并在故事板的视图中的多个位置使用它。

我已经看到了很多子类化单个控件的示例,但我想要做的是将几个控件打包在一起然后能够将它拖动/添加到故事板。这可行吗?或者我是否需要创建类文件,但手动添加所有控件以将它们链接到类?或者更好/可能使用自定义类动态添加视图/故事板中的控件?

1 个答案:

答案 0 :(得分:0)

因此,如果你想在IB中进行设计,你需要做更多的腿部工作。

首先,我们需要一些内容来包含我们的控件并充当控制器,因此我们需要一个NSObject的子类并将其称为合理的东西。 (比MyWidget好)

@interface MyWidget : UIView

对于我们用于放置组件的基本起始画布,我们需要一个UIView,IB可以获得并使用它。将其添加到标题

@property (nonatomic, retain) IBOutlet UIView *view;

然后给这个ivar一个getter / setter并在.m

中进行内存管理
@synthesize view = _view;

...

- (void)dealloc;
{
    [_view release];
    [super dealloc];
}

现在创建一个带有单个视图的笔尖,然后将File's Owner设置为MyWidget。您现在应该可以ctrl + click并从File's Owner拖动到UIView对象并选择view。所以此时我们的nib知道如何连接到我们的MyWidget类,但我们的MyWidget类不知道nib。

MyWidget.m中,我们需要告诉班级在- (id)initWithFrame:(CGRect)frame;- (id)initWithCoder:(NSCoder *)aDecoder;中使用nib,这样我们就可以在代码中实例化类或使用IB。

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self loadView];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder;
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self loadView];
    }
    return self;
}

- (void)loadView;
{
    [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
    [self addSubview:self.view];
}

现在当实例化类时,它会将自己挂钩到nib。此时,您将回到正常使用标准UIViewController的方式,例如在xib中添加一些内容然后将其连接到控制器并使用它。

在一个好的起点看起来像......

<强> MyWidget.h

#import <UIKit/UIKit.h>

@interface MyWidget : UIView

@property (nonatomic, retain) IBOutlet UIView *view;

@end

<强> MyWidget.m

#import "MyWidget.h"

@interface MyWidget ()

- (void)loadView;

@end

@implementation MyWidget

@synthesize view = _view;

- (void)dealloc
{
    [_view release];
    [super dealloc];
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self loadView];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder;
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self loadView];
    }
    return self;
}

- (void)loadView;
{
    // MyWidget is the name of the xib as well
    [[NSBundle mainBundle] loadNibNamed:@"MyWidget" owner:self options:nil];
    [self addSubview:self.view];
}

@end