Ios 创建自定义视图的不同方式/从对象库创建时无法与之交互的自定义视图
编辑#1Ios 创建自定义视图的不同方式/从对象库创建时无法与之交互的自定义视图,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 = [
-(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创建,也可以从对象库中拖动
看起来情况是:
看起来您是从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—我将添加一些代码来演示。