我想要做的事情是我知道在ASP.Net中是直截了当的,也许我只需要调整我的想法(我在iOS中自学开发),但我无法弄清楚如何使用XCode / Objective-C实现这一目标。
我想要做的是布局几个按钮,一个标签,并以可重用的格式编写一些代码,如ASP.Net中的用户控件。然后使用该“包”并在故事板的视图中的多个位置使用它。
我已经看到了很多子类化单个控件的示例,但我想要做的是将几个控件打包在一起然后能够将它拖动/添加到故事板。这可行吗?或者我是否需要创建类文件,但手动添加所有控件以将它们链接到类?或者更好/可能使用自定义类动态添加视图/故事板中的控件?
答案 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