如何创建可重用的iOS控件?

时间:2011-06-24 00:30:18

标签: objective-c ios xcode

作为一名新的iOS开发人员,我正在尝试确定在iOS4 +中创建可重用控件的最佳方法。例如,如果我想创建一个可以在多个其他视图中使用的自定义UIImageView,那么最好的方法是什么。

我创建了包含以下文件的控件:

  • MyImageViewController.h
  • MyImageViewController.m
  • MyImageViewController.nib

假设我想要一个使用.nib文件的控件。

我如何做以下事项:

  1. 以编程方式并通过IB在另一个视图中创建自定义控件的实例?
  2. 如何构建自定义控件以便它可以公开“事件”,例如ontouch?
  3. 如何构建自定义控件以便调用操作/方法,例如loadImage()?
  4. 任何见解或参考赞赏。 感谢

3 个答案:

答案 0 :(得分:6)

可能 不会使用nib / xib来创建可重复使用的视图“控件”。 iOS与您可能习惯的非常不同,比如Java或.NET。对于某些类型的视图,您将创建一个支持它的xib和控制器/类 - UITableViewCell就是一个例子。

我希望我可以一步一步地指导你如何实现你想要做的事情,但我不能,因为我没有足够的信息来确定你实际上要做什么。 Apple开发者网站上有几个很棒的指南让您熟悉View / Controller / Touch事件交互,但该网站目前没有响应(我假设因为发布了WWDC视频)。说起来,观看WWDC 2010中的视频将是学习一些你想要实现的目标的另一种好方法,尤其是UIKit会议。

您不会创建'控件',因为您可能已经习惯了它们,但是自定义UIView-后代对象和自定义UIViewController后代对象。在我的项目中,我发现非常非常几个场景,其中创建可重用的UIView有任何好处(UITableViewCells除外)。 iOS项目中绝大多数可重用代码是ViewControllers。您将通过使用委托来公开事件 - 您的控制器将定义另一个对象将实现的委托,并从您的控制器接收方法调用以处理委派的任何内容。同样,Apple指南和WWDC视频也很好地解释了这一点。

以下是可重用控制器及其用法的示例:

<强> MyEntityViewController.m

- (id)initWithEntity:(EntityFoo *)theEntity inEditMode:(BOOL)inEditMode {
  self = [super initWithNibNamed:@"EntityFooView" bundle:nil];
  if(self) {
    //retain entity somewhere
    //dont setup view in here!
  }
  return self;
}

- (void)viewDidLoad {
  //setup view in here. This ensures compatibility with standalone operation
}

<强> RootViewController.m

- (void)viewDidLoad {
  [super viewDidLoad];

  EntityViewController *evc = [[EntityViewController alloc] initWithEntity:self.someEntity inEditMode:NO];
  [self.view addSubview:evc.view];

  //You MUST call this method, the framework will not call it on sub-controllers
  [evc viewDidLoad];

  self.entityViewController = evc;
  [evc release];
}

这不是一个完整的实现,随着您的经验和框架的增长,您将找到一种在主视图控制器中通知(提示提示)子视图控制器事件的​​模式。如果您可以访问它们,我强烈建议您查看WWDC 2011视频,因为下一个操作系统中会出现与此主题相关的内容。

答案 1 :(得分:6)

Here's an article,描述了如何使用nib创建可重用控件。名为“可重复使用的子视图”的部分听起来像你想要的。

与@RyanR所说的相反,在iOS中创建可重用控件非常好。这不是我见过很多的模式,但你完全可以做到。

答案 2 :(得分:0)

这是我的故事板版本。

添加视图控制器ID:

enter image description here

<。>在.h文件中创建一个属性来保存控制器。否则它将从内存中删除:

@property (nonatomic, strong) TestViewController *timetableViewController;
在.m文件中

-(void)viewDidLoad{
    [super viewDidLoad];
    TestViewController *centerViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"VIEW_CONTROLLER_ID"];
    [self.view addSubview:centerViewController.view];
    [centerViewController viewDidLoad];
    self.timetableViewController = centerViewController;

}