【问题标题】:iOS: Simple UIVIew not getting added to another UIViewiOS:简单的 UIVIew 没有被添加到另一个 UIView
【发布时间】:2014-01-28 21:20:53
【问题描述】:

我有一个故事板驱动的 iOS 应用程序。 我的目标是将一个小方形视图(定义为其他 XIB)添加到主 ViewController 上的另一个 UIView。 *// 请注意,我已正确分配 Identity Inspector 中的类名*

在主ViewController上,我手动添加了一个UIView(myHolderView),并在ViewController界面中添加了一个UIView成员。

//.h
@interface ViewController : UIViewController
@property(nonatomic, strong) IBOutlet UIView *myHolderView;
@end

而且,我已经通过“BlueString”连接了这个 IBOutlet :)

现在,我添加了另一个具有单一视图的 XIB - 将其命名为 MySquare.xib 并在其上添加了一个标签。 并且,添加了一个带有 .h 和 .m 文件的 UIView 类。并且,建立了“BlueString”连接。

@interface MySquare : UIView
@property(nonatomic, strong) IBOutlet UILabel *myLabel;
@end

现在,在实现中:

@implementation ViewController
@synthesize myHolderView;
- (void)viewDidLoad
{
    [super viewDidLoad];
    MySquare *sq=[[MySqure alloc]init];
    // Do any additional setup after loading the view, typically from a nib.
    [self.myHolderView addSubview:sq];
}

当我在模拟器中运行它时,它只显示主视图,但方形视图没有出现。 我知道主视图已加载,因为...我更改了它的颜色以便我可以看到。 请帮忙。

【问题讨论】:

  • 嗨!你有没有成功解决这个问题?

标签: ios ios7


【解决方案1】:

您可能没有在您的 MySquare.m 文件中使用您的 xib 进行视图初始化。

- (id) initWithFrame:(CGRect)frame {
    NSLog(@"This is called if you add programatically this view");
    self = [super initWithFrame:frame];
    if (self) {
        [self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"MyIBView" owner:self options:nil] objectAtIndex:0]];
    }
    return self;
}

如果你打算使用 Interface Builder 添加你的 xib,你必须实现类似的 initWithCoder 方法:

-(id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super initWithCoder:aDecoder])) {
        [self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"MyIBView" owner:self options:nil] objectAtIndex:0]];
    }
    return self;
}

请仔细检查此清单,它也可能对其他人有所帮助:

使用 Interface Builder 布局 (xib) 添加自定义视图的清单:

1)新建一个xib(File->New->IOS/User Interface->View),命名(例如MyIBView)

2)新建一个类(File->New->IOS/Cocoa Touch->Objective-C类),确保它是UIView的子类!将其命名为 MyIBView。

现在您的项目中添加了 MyIBView.xib、MyIBView.h 和 MyIBView.m 文件

3) 编辑您的 MyIBView.xib:选择文件的所有者并使用身份检查器(第三个图标)选择您最近创建的类 MyIBView。

4) 选择顶层视图(如果它是一个新的 xib,则只有这个存在)并确保使用身份检查器该类是 UIView(灰色)并且未被覆盖

5) 现在您可以将 IBOutlets 和/或 IBActions 添加到您的 MyIBView.h 文件中,并且您可以使用 MyIBView.xib 中的 Interface Builder 进行连接

在另一个视图中以编程方式使用此视图:

6a) 如果您想以编程方式使用此自定义视图,请在 MyIBView.m 文件中创建上述第一个方法 (initWithFrame)

7a) 包含您希望以编程方式添加自定义视图的 MyIBView.h 文件

8a) 现在您可以添加视图了:

     MyIBView *myIBView = [[MyIBView alloc] initWithFrame:CGRectMake(0,0,100,100)];

在另一个视图中使用 Interface Builder 中的这个视图:

6b) 如果您想在 Interface Builder 中使用此自定义视图,请在您的 MyIBView.m 文件中创建上面的第二个方法 (initWithCoder)

7b) 在您的另一个视图中,将 UIView 拖放到您的视图画布上。使用 MyIBView 的身份检查器调整大小并修改 Class。

请注意,只有在尝试运行代码后,您才能看到自定义视图的设计时间。

希望对您有所帮助,您可以找到您的错误配置!

【讨论】:

  • 感谢 Codedad!第一个解决方案对我有用!但第二个实际上是我的场景!那应该工作。但是当我添加第二个解决方案时,循环在该语句处变得无限。你能在这个问题上加点东西吗?
  • 请对照此清单检查您的设置。是什么导致您的 xib 根据 Interface Builder 设置初始化并并行初始化并由代码添加为子视图,因此 Interface Builder 设置再次启动。如果此清单没有帮助,您可以将项目上传到 github所以我可以检查它。我在我的项目中使用了这个清单,所以它应该可以工作;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多