从XIB创建多个自定义视图并以编程方式将它们添加到ViewController中

时间:2016-02-06 06:29:56

标签: ios objective-c uiview uiviewcontroller interface-builder

我将从描述我想要完成的事情开始,然后描述我已经尝试过的事情。我很确定我所尝试的并不是最好的方法,所以请根据需要纠正我的方法!

我有一个ViewController.m和一个自定义视图,它在CustomView.xib中列出。自定义视图包含UIButtonsUILabels,这些视图是从自定义对象数组中填充的。

用户流程应该如此:ViewController开始显示CustomView,其标签填充

CustomObjectArray[0] - >用户按下按钮 - > CustomView的另一个“副本”在之前的版本中滑入视图。

它的标签和按钮由CustomObjectArray[1]填充 - >用户按下按钮 - >重复直到数组结束。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ < / p>

到目前为止,我制作了一个ViewController.m/h,一个CustomView.m/h和一个CustomView.xib文件。我使用界面构建器来进行布局。

在XIB文件中顶级视图的“自定义类”选项卡上,输入“CustomView”。我还将IBOutlets从XIB文件拖到CustomView HEADER (.h)文件中。

ViewController, - (instancetypeinit方法下,我使用普通initWithNib方法创建自定义视图。然后我做:

self.view = CustomViewVariableName; 

当我运行程序时,视图显示正常。但是,当我尝试选择器时,没有任何东西被按钮识别出来:

[currentCustomView.continueButton addTarget:self action:@selector(continueButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

我在这里做错了什么?

更重要的是,鉴于我描述的目标最高,我甚至做到了这一点吗?我需要CustomView.m/h个文件吗?或者我可以只使用XIB和ViewController文件执行相同的操作。请记住,我需要“多个副本”并将它们相互叠加,直到我的自定义对象数组结束。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 根据要求提供更多代码。

ViewController

- (instancetype)init
{
    currentCustomView = [[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil] objectAtIndex:0];
    self.view = currentQuizQuestionView;

    .......

    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    [currentCustomView.continueButton addTarget:self action:@selector(continuePressed:) forControlEvents:UIControlEventTouchUpInside];
}

-(void)continuePressed:(id)sender{

    NSLog(@"Current position");
    //[self moveInQuestion];
}

CustomView.h

#import <UIKit/UIKit.h>

@interface CustomView : UIView
@property (weak, nonatomic) IBOutlet UIButton *continueButton;
@end

CustomView.m

这只是默认页面,我在此文件中没有添加任何内容。

CustomView.xib

XIB first view

XIB second view

1 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解您的要求。假设您希望将几个CustomView作为ViewController的子视图,并且可以在按下自己的按钮后逐个显示这些子视图。

添加子视图的第一件事:

self.view = CustomViewVariableName; 

由于根据我的假设,海关视图将是子视图,因此上面的行是错误的。你可能想要这样的东西。

for (NSInteger i = 0; i < 5; i++) {
    CustomView *v = [[CustomView alloc] initWithNib];
    [v.button addTarget:self
                 action:@selector(continuePressed:)
       forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:v];
}

其次,我注意到您希望将数组作为处理程序来引用所有子视图。我们可以通过在上面的for循环中再插入一行来将上面的CustomView添加到一个可变数组中。

[_customObjectArray addObject:v.button];

最后,我创建了一个简单的项目并尝试实现您提到的内容。也许你可以把它作为参考。 https://db.tt/Och2tzyG