4

我想使用 Interface Builder 设计一个 UIView 和一些子视图(UIWebView、UIToolbar、一些 UIBarButtonItems、进度指示器等等),但我认为传统上没有必要这样做,通过使用 UIViewController,使用presentViewController:animated等等

所以,我创建了一个自定义类, .h文件代码如下:

@interface FileInteractionManager : NSObject {

}

@property (nonatomic, retain) IBOutlet UIView *fileView;
@property (nonatomic, retain) IBOutlet UIWebView *fileWebView;

@property (nonatomic, retain) IBOutlet UIBarButtonItem *printButton;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *optionsButton;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *doneButton;

我的 .m 文件如下:

@implementation FileInteractionManager

@synthesize fileView, fileWebView, doneButton, optionsButton, printButton;

-(id)init {

    NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"FileInteractionView" owner:self options:nil];

    NSLog(@"Load success!");

    return self;
}

最后,我创建了一个名为“FileInteractionView.xib”的独立 xib 文件,将文件的所有者更改为我在上面创建的自定义类,然后连接 IBOutlets。

当我在我的类上调用该init方法时,我可以在调试器中看到我的所有 IBOutlet 对象都已正确实例化。

我的问题是:

  1. loadNibNamed:owner:options:方法是加载我的独立 .xib 文件的正确方法吗?我不喜欢这个方法返回一个我没有用的数组(返回的顶级对象与我的变量匹配fileView,但我已经通过 Interface Builder 链接了它们)。

  2. 我的一般方法在解决我的问题时是否正确?我执行上述步骤是因为我想要一个UIView可以添加到现有 UIViewController 的简单对象,而不是呈现和关闭一个全新的 UIViewController。

4

2 回答 2

6

我使用了一些不同的方法。我创建了 UIView (MyCustomView ie) 的子类,然后是带有视图 UI 的 xib,并更改了刚刚定义的(主)视图类。然后在 xib 中,您可以将插座链接到自定义视图本身(而不是文件所有者)。最后在类定义中,我创建了一个这样的函数:

+ (id) newFromNib
{
    NSArray *nibArray = [[UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil] instantiateWithOwner:nil options:nil];
    return nibArray[0];
}

只是几个注意事项:1)这是一个类方法,你可以将“self”用于“NSStringFromClass([self class])”之类的东西,但真正的对象是返回的变量2)这个例子假设xib有相同的类的名称(通过 NSStringFromClass([self class]) 所以我可以在不更改任何内容的情况下复制粘贴它;))并且您的视图是 xib(标准)中定义的第一个视图。如果您在一个 xib 中存储多个“主”视图,请选择正确的元素。

所以我需要 MyCustomView 我做类似的事情:

MyCustomView* mycv = [MyCustomView newFromNib];

然后设置框架/中心并添加到超级视图...如果您有一个复杂的 UI 元素“库”并希望通过 xib 设计它们然后在需要时添加,我认为这种方式非常有用。

于 2013-03-25T11:33:39.000 回答
1

il Malvagio Dottor Prosciutto 的回答很好。这是一个可能的替代方案。

在 NS_DESIGNATED_INITIALIZER 中加载 nib 并成为子视图的所有者

如果我们接受xib只持有一个子视图而不是视图本身,那么我们可以加载子视图initWithFrame:并在xib.

@interface MyCustomView ()
@property (strong, nonatomic) IBOutlet UIView *subview;
@end

@implementation MyCustomView
- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
    [self addSubview:self.subview];
    return self;
}
@end
于 2016-03-16T12:25:43.227 回答