【问题标题】:Adding a custom subview (created in a xib) to a view controller's view - What am I doing wrong将自定义子视图(在 xib 中创建)添加到视图控制器的视图 - 我在做什么错
【发布时间】:2011-07-18 07:12:18
【问题描述】:

我在 xib 中创建了一个视图(带有活动指示器、进度视图和标签)。 然后我创建了 .h/.m 文件:

#import <UIKit/UIKit.h>

@interface MyCustomView : UIView {
    IBOutlet UIActivityIndicatorView *actIndicator;
    IBOutlet UIProgressView *progressBar;
    IBOutlet UILabel *statusMsg;
}

@end

#import "MyCustomView.h"

@implementation MyCustomView    

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

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

@end

在 IB 中,我将文件的所有者和视图标识设置为 MyCustomView,并将 IBOutlet 连接到文件的所有者

在 MyViewController.m 中,我:

- (void)viewDidLoad {

    [super viewDidLoad];   

    UIView *subView = [[MyCustomView alloc] initWithFrame:myTableView.frame];
    [subView setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]];

    [myTableView addSubview:subView];
    [subView release];
}

当我运行应用程序时,添加了视图,但我看不到标签、进度条和活动指示器。

我做错了什么?

【问题讨论】:

    标签: objective-c ios xib addsubview


    【解决方案1】:

    您需要使用-loadNibNamed 方法加载它。 -initWithNibName 仅适用于 UIViewControllers。

    将以下代码添加到您的 MyCustomView 初始化方法中:

    NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil];
    UIView *mainView = [subviewArray objectAtIndex:0];
    [self addSubview:mainView];
    

    请记住,如果您从 nib 初始化对象,它会调用 - (id)initWithCoder:(NSCoder *)aDecoder 进行初始化,因此如果您在 nib 中创建 MyCustomView 对象,则必须覆盖它。如果您只是使用initWithFrame: 进行操作,那么只需覆盖它并添加上面的代码。此外,在您的 nib 中,确保您有一个顶级 UIView,并将所有其他元素放在其中(确保您的 subviewArray 只有一个条目)。

    这将从笔尖加载视图并将它们添加到对象中,并且应该可以解决问题。

    【讨论】:

    • 我在 initWithFrame 中使用了您的代码,现在我可以看到 MyCustomView 及其所有元素,但有一件事不起作用。在 MyViewController 的 viewDidLoad 中,我有: UIView *subView = [[MyCustomView alloc] initWithFrame:myTableView.frame]; [subView setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]]; [myTableView addSubview:subView]; [子视图发布];这样我就可以看到它下面的桌子了。有什么想法吗?
    • 如果我在 initWithFrame 中设置它,它可以工作。现在我要了解如何支持此视图的横向模式 :) 谢谢
    • 我找到了另一种解决景观问题的解决方案。我在 MyViewController 中使用 loadNibNamed 代码(当我必须显示子视图时),我在 MyCustomView.m 的 awakeFromNib 方法中放置了任何其他自定义项
    • 嘿,方法[self addSubview:mainView] 只是将你在IB 中创建的视图添加到MyCustomView。我尝试了您的方法,然后尝试为 MyCustomView 设置框架。结果是框架发生了变化,但在 .xib 中制作的视图的框架没有改变。如何通过 MyCustomView 更改 IB 视图的框架?
    • 只要做 mainView.frame = newFrame.因此,如果您希望 IB 视图的框架占据整个 MyCustomView 框架,请执行“mainView.frame = self.bounds”。
    【解决方案2】:

    正如 hocker 所说,您必须使用传递 XIB 名称(不带扩展名)的方法。

    那么你必须控制这个列表:

    • 在 IB 中打开 .xib 文件
    • 单击文件所有者并选择正确的类(在您的情况下为 MyCustomView)
    • 按住控制并从文件所有者拖动到视图(现在视图的出口就可以了)

    希望它有效。干杯。

    【讨论】:

    • 什么都没有。如果文件所有者是 MyCustomView,我无法从文件所有者拖动到视图。所以我将 File Owner 设置为 MyViewController,将 View 设置为 MyCustomView,然后从 View 拖到 IBOutlets,但它不起作用。
    【解决方案3】:

    我觉得你需要用这个方法:

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
    

    这是因为您需要将“nibNameOrNil”中的 .xib 文件名传递给它。

    【讨论】:

    • 在 IB 中指定文件所有者的身份并将视图作为 MyCustomView 还不够吗?
    • 如果我使用 initWithNibName,我会收到警告:'UIView' may not respond to '-initWithNibName:bundle:'
    猜你喜欢
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多