如何从超级视图控制器写入子视图控制器的插座

时间:2014-04-17 21:04:48

标签: ios objective-c uiview uiviewcontroller

我的应用程序包含非常相似的相册页面,用于从Web服务器中绘制图片。每个页面都有一个专辑标题和一个显示图片的表格。页面之间的唯一区别是http请求参数。 我将常见的行为(和数据)收集到一个超类“CommonViewController”中,然后创建了继承自CommonViewController的子类(FoodsViewController,BeveragesViewController)。我将从菜单中使用“story board id”调用子视图控制器,然后将http请求参数传递给超类CommonViewController。

我将子视图控制器放到故事板上,并使用鼠标(cntrl +左键单击)为每个子视图控制器创建标签和表视图的插座。

子视图控制器将其请求参数填充到CommonViewController中定义的结构中,然后从服务器获取图片。

出口位于子视图控制器中,但数据是在超级类中生成的。 CommonViewController不知道将写入哪个插座。我怎样才能将数据写入位于超类的子视图控制器中的出口?

1 个答案:

答案 0 :(得分:1)

CommonViewController中收集数据后,请调用[self processData:receivedData];这样的方法,其中receivedData是您要在孩子中处理的结构 - 我将使用{{1这个例子的实例。

您可以通过NSData commonViewController processData实施中的以下内容模拟抽象方法:

CommonViewController.m:

-(void) processData:(NSData *)receivedData
{
   NSAssert(NO,@"Override processData in your subclass");
}

然后在每个子类中,重写方法以执行所需的任何操作:

FoodsViewController.m:

-(void) processData:(NSData *)receivedData
   {
       //TODO put the data into the right controls
   }

<强>更新

如果数据到可视控件的映射是相同的(例如,总是有“标题标签”和“项目图片”,但它们在屏幕上的位置发生了变化,那么您可以在中定义控件属性你的superclass.h -

@property (weak,nonatomic)  IBOutlet UILabel *titleLabel;
@property (weak,nonatomic)  IBOutlet UIImageView *itemPicture;

然后,当您在InterfaceBuilder中创建使用子类作为UIViewController时,您只需将连接从控件拖到IBOutlet即可。如果您以编程方式而不是IB方式创建控件,那么您可以将它们分配给子类中的属性 -

  [self.view addSubView:myTitleLabel];
  self.titleLabel=myTitleLabel;

在这种情况下,您可以省略IBOutlet