访问视图超级视图的方法 – 什么是UIViewControllerWrapperView?

我的问题是以下

我有一个UIViewController子类,它拥有一个UISegmentedController和四个我在界面生成器中放置的表格。

@interface MultiTableHoldingView : UIViewController{ } @property (strong, nonatomic) IBOutlet DataTV *dsDataTV; @property (strong, nonatomic) IBOutlet EnviroTV *dsEnvironmentTV; @property (strong, nonatomic) IBOutlet LocationTV *dsLocationTV; @property (strong, nonatomic) IBOutlet Note_AnimalTV *dsNoteAnimal; @property (strong, nonatomic) IBOutlet UISegmentedControl *diveElementSegmentController; @property (strong, nonatomic) DiveSite* currentSite; - (IBAction)diveElementSegmentControllerDidChange:(UISegmentedControl *)sender; -(void) setFreshWaterColor; -(void) setSaltwaterColor; @end 

setFreshWaterColor和setSaltWaterColour只是设置MultiTableHoldingView实例UIView和它包含的四个表格的背景颜色属性。 从MultiTableHoldingView的viewDidLoad方法中调用这两种方法都可以正常工作。 这是其中之一

 -(void) setSaltwaterColor{ DLog(@"in set salt water colour"); self.view.backgroundColor= SaltWaterColor; _dsLocationTV.backgroundColor=SaltWaterColor; _dsDataTV.backgroundColor=SaltWaterColor; _dsEnvironmentTV.backgroundColor=SaltWaterColor; _dsNoteAnimal.backgroundColor=SaltWaterColor; 

}

另一个是相同的,除了设置为FreshWaterColor – 都是#define我已经成立。

我使用segmentedController打开和closures各种表视图的隐藏属性。 所有漂亮和简单。 桌面浏览器正在提取他们的数据。 工作正常。

当select我的tableview单元格中的一个tableView时,我想改变我的tableview(实际上我所有的tableviews)和超级视图的UIView的背景颜色

 self.superview.backgroundColor = FreshWaterColor; 

可以很好地回溯和更改MultiTableHoldingView视图背景属性的实例,但我想调用MultiTableHoldingView的setFreshWaterColor和setSaltwaterColor方法的实例。

我已经导入MultiTableHoldingViews头到相关的tableview(EnviroTV),所以它知道它的superviews方法。 但是,如果我尝试调用self.superview上的两个方法中的任何一个方法不显示,如果我完全键入它们,我得到一个以下错误

'UIView'没有可见的接口显示select器'setFreshWaterColor'

所以我查了一下superview是什么types的对象,它是一个“superview UIViewControllerWrapperView类”

我search这个,它显然是“

这是框架使用的私人视图。 你不应该修改它或什么。“

我显然在这里失去了一些东西 – 我应该如何调用MultiTableHoldingView的实例上的方法?

提前致谢

西蒙

呃 – 它的公正代表团作为danypata在评论中提到 – 我已经贴出了我是如何做到这一点作为下面的答案。 试图使代表团如何工作尽可能清楚

解决scheme

第一步 – 在编码之前多睡一会。

这真的是一个基本的目标-c的东西 – 我刚刚离开了一切,寻找别的办法,一路上我发现UIViewControllerWrapperView感到困惑。

正如danypata在评论中正确地提出的那样,解决scheme就是使用委托(Objective-C中的一个通用devise模式),就像你使用另一个类来提供tableview数据一样

由于我已经是一个数字,今天浪费了我的时间,所以我会尽量让其他相对的新手或者有一天rest时间的人不要直视。

在我的情况下,我设置如下

在我的subview类的接口文件EnviroTV.h中,我在@interface声明之前定义了以下协议

 @protocol EnviroTVProtocol <NSObject> -(void) setFreshWaterColor; -(void) setSaltwaterColor; @end 

然后在同一个文件的@interface部分添加一个idtypes的属性,它必须符合我刚刚声明的协议。

 @property (nonatomic, strong ) id<EnviroTVProtocol> colorChangeDelegate; 

你让types成为一个id–一个通用对象 – 因为你真的不关心什么样的对象将作为你的委托,只是它实现了你需要它运行的方法。 当一个对象声明自己实现一个协议,它只是承诺实现协议所需的方法

所以,当我想运行superviews类的方法,我打电话

[self.colorChangeDelegate setFreshWaterColor];

要么

[self.colorChangeDelegate setSaltWaterColor];

委托模式的最后一部分是进入将成为委托的类(在这种情况下,我的MultiTableHoldingView类),并声明它符合协议

我在MultiTableHoldingView.h文件中这样做

改变这一行:

 @interface MultiTableHoldingView : UIViewController 

进入这一行:

 @interface MultiTableHoldingView : UIViewController <EnviroTVProtocol> 

意味着这个类承诺实现EnviroTVProtocol的所有必需的方法。

幸运的是我已经写了两种方法。 所以当我编译它运行正确

新手 – 不要害怕授权 – 它真棒,不像你第一次想象的那么复杂

同时,如果有人可以解释一下UIViewControllerWrapperView是什么…..