繁体   English   中英

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

[英]How to write to child view controller's outlet from super view controller

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

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

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

出口位于子视图控制器中,但数据在超类中生成。 CommonViewController不知道将写入哪个插座。 如何将数据写入超类的子视图控制器中的插座?

CommonViewController收集数据后,请调用诸如[self processData:receivedData]; 其中receivedData是您要在子级中处理的结构-在此示例中,我将仅使用NSData实例。

您可以通过在processDatacommonViewController实现中包含以下内容来模拟抽象方法:

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
   }

更新

如果数据到可视控件的映射是相同的(例如,始终有一个“标题标签”和一个“项目图片”,但是它们在屏幕上的位置发生了变化),则可以在超类中定义控件属性。 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM