4

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

我有一个从 Interface Builder 派生的自定义 UIView。我想将设置大小设置为 200w x 200h 并将背景颜色设置为绿色。当我创建时,我做了以下事情:

  1. 通过 File -> New -> Objective-C Class 创建了一个新的自定义 UIView,名为 Tview
  2. 通过 File -> New -> User Interface -> View 创建了一个新视图并将其命名为 tnib
  3. 在画布中,我删除了视图并从对象检查器中添加了一个新视图,并将类名设置为 Tview。此外,在属性检查器中,我将大小设置为自由形式,将背景颜色设置为绿色。在 Size Inspector 中,我将宽度设置为 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;

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

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

直到它最终崩溃。

我在这里做错了什么?

提前谢谢

4

2 回答 2

4

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

您不应该在读取相同 NIB 时调用的代码中访问 NIB。您应该在包含对象的代码中阅读 NIB,而不是在Tview对象本身的代码中。否则,你会得到一个无限循环。

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

[self addSubview:mainView];

但是,它不应该在Tview's 代码中:它需要移动到具有该myTview属性的父控制器,并且应该修改为

[self.view addSubview:_myTview];

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

于 2013-03-04T15:31:56.197 回答
0

实际上,我对这个问题的解决方案是,在我的 CustonViewController 中的 viewDidLoad 中加载视图,我想在其中使用这样的视图:

myAccessoryView = NSBundle.mainBundle().loadNibNamed("MyAccessoryView", owner: self, options: nil)[0] as! MyAccessoryView

不要在loadView()方法中加载视图!loadView 方法用于为您的自定义 ViewController 加载视图。

于 2016-02-05T09:36:27.127 回答