gpt4 book ai didi

ios - 无限循环试图从 IB 中的 xib 创建自定义 View

转载 作者:可可西里 更新时间:2023-11-01 05:41:42 24 4
gpt4 key购买 nike

这是这个问题 (custom UIView how-to with IB / Xcode 4.5.1 and iOS Simulator 6.0) 的后续问题,但没有必要阅读 - 这是我第一次尝试创建自定义 UIView 并且显然有些事情我没有提前获得任何帮助您可以提供。

我有一个派生自 Interface Builder 的自定义 UIView。我想将尺寸设置为 200w x 200h,将背景颜色设置为绿色。创建时,我执行了以下操作:

  1. 通过文件 -> 新建 -> 名为 Tview 的 Objective-C 类创建了一个新的自定义 UIView
  2. 通过"file"->“新建”->“用户界面”->“ View ”创建了一个新 View 并将其命名为 tnib
  3. 在 Canvas 中,我删除了 View 并从对象检查器添加了一个新 View 并将类名设置为 Tview。此外,在属性检查器中,我将大小设置为自由形式,将背景颜色设置为绿色。在尺寸检查器中,我将宽度设置为 200,将高度设置为 200。

在我的 Tview.m 中,我设置了以下内容(我根据其他 SO 问题进行了一些更新,但不清楚这些是否仍然是最新的或准确的):

@implementation Tview

-(id) initWithCoder:(NSCoder *)aDecoder
{
NSLog(@"in initWithCoder");
if((self = [super initWithCoder:aDecoder])) {
[self setUpView];
}
return self;
}

-(void)awakeFromNib
{
NSLog(@"in awakeFromNib");
[self setUpView];
}

-(void)setUpView
{
NSLog(@"I am in setUpView");
NSArray *subviewArray=[[NSBundle mainBundle] loadNibNamed:@"tnib" owner:self options:nil];
UIView *mainView = [subviewArray objectAtIndex:0];
[self addSubview:mainView];
}

@end

在我的 ViewController.xib 中,我拖出一个 UIView 并将自定义类名称设置为 Tview。我 #import Tview.h 文件并从 ViewController.xib 拖到 Tview.h 并创建以下属性:

@property (strong, nonatomic) IBOutlet Tview *myTview;

我构建并运行并获得以下无限循环:

2013-03-04 06:49:05.452 Nibtest2[44524:11303] in initWithCoder
2013-03-04 06:49:05.455 Nibtest2[44524:11303] I am in setUpView
2013-03-04 06:49:05.456 Nibtest2[44524:11303] in initWithCoder
2013-03-04 06:49:05.458 Nibtest2[44524:11303] I am in setUpView
2013-03-04 06:49:05.459 Nibtest2[44524:11303] in initWithCoder
2013-03-04 06:49:05.460 Nibtest2[44524:11303] I am in setUpView

直到它最终崩溃。

我在这里做错了什么?

提前谢谢

最佳答案

您的代码设置了一个无限递归:initWithCoder: 调用 setUpView,它从一个包中实例化一个新的 UIView,从而调用 initWithCoder: 间接完成循环。

您不应在读​​取同一 Nib 时调用的代码中访问 Nib 。您应该在包含对象的代码中读取 NIB,而不是在 Tview 对象本身的代码中。否则,您将陷入无限循环。

您需要完全远程控制 setUpView,以及来自 awakeFromNibinitWithCoder: 的调用。您通过从对象检查器中拖出而在界面构建器中建立的连接似乎已经导致 NIB 文件正确加载,正如 initWithCoder: 的调用所证明的那样。您可能需要的唯一一行是:

[self addSubview:mainView];

但是,它不应该在 Tview 的代码中:它需要移动到具有 myTview 属性的父 Controller 中,它应该是修改为

[self.view addSubview:_myTview];

将此行添加到 viewDidLoad。它应该可以解决这个问题。

关于ios - 无限循环试图从 IB 中的 xib 创建自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15204547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com