Ios 创建自定义视图的不同方式/从对象库创建时无法与之交互的自定义视图

Ios 创建自定义视图的不同方式/从对象库创建时无法与之交互的自定义视图,ios,ios6,uiview,Ios,Ios6,Uiview,编辑#1 -(void)setup { UIView *myView=[[[NSBundle mainBundle] loadNibNamed:@"testview" owner:nil options:nil] lastObject]; [self addSubview:myView]; } - (id)initWithFrame:(CGRect)frame { NSLog(@"at top of initWithFrame"); self = [

编辑#1

-(void)setup
{
       UIView *myView=[[[NSBundle mainBundle] loadNibNamed:@"testview" owner:nil options:nil] lastObject];
      [self addSubview:myView];
}


- (id)initWithFrame:(CGRect)frame
{
    NSLog(@"at top of initWithFrame");
    self = [super initWithFrame:frame];
    if (self) {
      [self setup];
    }
    return self;
}
请阅读问题底部的编辑#1;我试图找出所有的方法来创建自定义视图,这样所有的例子都可以处理nib文件

结束

我一直在尝试找出创建在控制器中使用NIB的自定义视图的所有技术。我已经在这个问题的底部列出了方法

下面是我的TRtestview的代码(我如何进行此设置的一个含义是总是调用initWithCoder):

编辑1

-(void)setup
{
       UIView *myView=[[[NSBundle mainBundle] loadNibNamed:@"testview" owner:nil options:nil] lastObject];
      [self addSubview:myView];
}


- (id)initWithFrame:(CGRect)frame
{
    NSLog(@"at top of initWithFrame");
    self = [super initWithFrame:frame];
    if (self) {
      [self setup];
    }
    return self;
}
在TRViewController.m中,我尝试将此视图设置为userInteractionEnabled,但没有改变:

- (void)viewDidLoad
{
  [super viewDidLoad];
  self.thisView.userInteractionEnabled=YES;
这在调用initWithFrame(技术1)和loadNibNamed(技术2)的场景中起到了作用。它将通过从对象检查器中拖出视图,然后在自定义类属性检查器中设置类来加载视图(技术#3)。但是,该按钮不起作用,因此这种方式不起作用

如何使用技巧#3创建带有nib的自定义视图并允许用户交互

thx

编辑1

-(void)setup
{
       UIView *myView=[[[NSBundle mainBundle] loadNibNamed:@"testview" owner:nil options:nil] lastObject];
      [self addSubview:myView];
}


- (id)initWithFrame:(CGRect)frame
{
    NSLog(@"at top of initWithFrame");
    self = [super initWithFrame:frame];
    if (self) {
      [self setup];
    }
    return self;
}
我很想了解创建和实例化自定义视图的所有方法。理想情况下,我希望能够拥有自定义视图,这些视图可以通过initWithFrame、loadNibNamed创建,也可以从对象库中拖动

看起来情况是:

  • 从ViewController初始化WithFrame;如果与nib一起使用,我在initWithFrame中调用loadNibNamed-我需要防止递归加载
  • LoadNibName来自ViewController(将调用initWithCoder),并且只希望加载一次
  • 拖动UIView的实例,然后将自定义类设置为my custom UIView(本例中为TRtestview)。这将调用initWithCoder

  • 看起来您是从testview类初始化器内部加载testview,并对子视图进行了一次黑客检查,以防止它成为递归的。因为外部的代码可能也会加载nib,所以这里实际要做的是加载nib两次,一次加载到另一个内部。如果设置了所有者,则内部所有者将在外部所有者上设置插座

    这只是一个猜测,因为这里没有足够的信息可以确定-但是如果您要在视图类中为其中的一些子视图设置outlet,那么您必须向
    loadNibNamed:owner:options:
    提供一个
    owner
    对象,该对象具有类的类型。因此,您可以在代码中以所有者身份传递
    self
    ,这可能会起作用。然而,在单视图中使用NIB确实是错误的

    nib文件中的单个视图不是
    TRtestView
    类,而是将单个视图作为其他内部视图的支架,并将“文件所有者”占位符对象设置为具有类
    TRtestView
    。为支架创建一个插座并分配,然后执行以下操作:

    TRtestview* testview = [[TRtestview alloc] initWithFrame:desiredFrame];
    [[NSBundle mainBundle] loadNibNamed:@"testview" owner:testview options:nil];
    
    + (MyCustomView*)newCustomView
    {
        MyCustomView* view = [[NSBundle mainBundle] loadNibNamed:@"testview" owner:nil options:nil][0];
        // Do custom setup things to view here...
        // Perhaps based on additional inputs to this method.
        view.doStuff;
        return view;
    }
    
    现在,加载nib时,
    testview
    中的所有插座都将被设置,包括您可以添加为子视图的支架

    另外,如果您想在不同的nib中使用TRtestview(例如
    TestViewController
    ),您可以通过在视图中拖动并将该对象的类设置为
    TRtestview
    -这将创建一个
    TRtestview
    ,并调用其
    initWithCoder
    ,您可以将其分配给
    TestViewController
    中名为
    testview
    的插座。然后在
    TestViewController
    awakeFromNib
    中,您将放置上面的第二行代码,作为所有者对象传入
    testview
    出口

    编辑: 要准确地了解您要做什么是很困难的,但是从视图的任何init方法内部加载nib是错误的(加载nib会创建视图对象,而不是相反)。我想我一开始误解了您要设置的
    IBOutlet
    s的位置,可能您要寻找的答案实际上是您可以加载nib,但可以从如下类构造函数方法加载:

    TRtestview* testview = [[TRtestview alloc] initWithFrame:desiredFrame];
    [[NSBundle mainBundle] loadNibNamed:@"testview" owner:testview options:nil];
    
    + (MyCustomView*)newCustomView
    {
        MyCustomView* view = [[NSBundle mainBundle] loadNibNamed:@"testview" owner:nil options:nil][0];
        // Do custom setup things to view here...
        // Perhaps based on additional inputs to this method.
        view.doStuff;
        return view;
    }
    

    谢谢,@jhabbott,我真的很感激。您提供的示例代码将在视图控制器中完成,对吗?或者同时在视图控制器和自定义视图中?我添加了一些编辑,以添加更多源代码,并试图使其更清晰。lmk如果我的问题或我所写的内容不好或过时(或两者兼而有之)。只是想找出正确的方法,并感谢我能得到的任何帮助。像您那样使用
    loadNibNamed
    加载nib很好-但不是从视图本身的初始化器中加载。很难看出你想做什么。您可以从类方法构造函数加载nib—我将添加一些代码来演示。