引用添加子视图的类

时间:2011-08-15 16:19:58

标签: iphone objective-c ios uiviewcontroller subview

我正在为我的主iPad UIViewController添加一个子视图,在该子视图中我需要引用所述视图控制器以便使用该控制器播放视频。

任何人都可以帮助我完成应该完成的方式,可能还有一个代码示例吗?

提前谢谢。

此致

编辑(一点点更多信息):

此子视图是来自为iPhone设计的uiviewcontroller类的视图。这是一个在按下行时加载视频的表。电影播放器​​在引用的viewcontroller中加载视频(这就是我想从子视图中引用iPad视图控制器的原因)。该视图基本上在iPad应用程序中以相同的形式使用。

4 个答案:

答案 0 :(得分:2)

这听起来像是一个架构问题。你不应该告诉某些事情发出声音。这是控制器的工作。您可以根据自己的观点告诉“某人”它被触摸,滑动或用户所做的任何事情。 “某人”(正在观看的人)将对此做出正确的回应。

要做到这一点,您的视图通常应该采取目标,可能还需要采取行动。查看UIControl(例如,UIButton)如何通知其他对象已激活它。然后观察者(控制者)做出相应的反应。

修改

视图不应加载视频。视图控制器应加载视频并将其安装到正确的视图中。视图唯一的工作是告诉它的视图控制器它已被按下。 UITableView使用UITableViewDelegate方法tableView:didSelectRowAtIndexPath:自动处理此问题。如果您没有使用UITableView,则仍应遵循此模式。视图接受具有委托并告知委托(控制器)已选择某些内容。然后控制器使用新数据更新视图。

答案 1 :(得分:1)

您可能已经将主视图存放在应用程序委托的属性中(它通常通过应用程序的.xib文件分配,查看应用程序委托的applicationDidFinishLaunching:方法,其中将主视图作为子视图添加到窗口,如:

[window addSubview:primaryController.view];
[window makeKeyAndVisible];

)。

因此,您需要访问主视图的应用中的任何位置都可以执行以下操作:

[(MyAppDelegateType*)([UIApplication sharedApplication].delegate).primaryController somePrimaryControllerMethod];

编辑:虽然这会有效,但我同意Rob Napier的说法,这不是最好的方式,建筑方面。

答案 2 :(得分:0)

您可以使用[yourSubview superview]来获取超级视图。

答案 3 :(得分:0)

你不能像这样在视图中添加一个属性:

@property (nonatomic, assign) UIViewController *parentViewController;

在初始化视图时(从UIViewController中),设置属性:

UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 460.0f)];
customView.parentViewController = self;

从那时起,您应该能够在视图中调用parentViewController。

编辑:Rob Napier有一个很好的观点,从视图中设置目标和选择器而不是视图控制器可能更好。这样您就可以直接将方法与视图挂钩。属性如下所示:

@property (nonatomic assign) id target;
@property (nonatmic, assign) SEL selector;

并且可能会在您的视图中添加指定的初始值设定项:

- (id)initWithFrame:(CGRect)aFrame target:(id)aTarget selector:(SEL)aSelector
{
   self = [super initWithFrame:aFrame];
   if (self)
   {
      self.target = aTarget;
      self.selector = aSelector;
   }
   return self;
}