访问视图superview上的方法 - 什么是UIViewControllerWrapperView?

时间:2013-06-12 19:37:09

标签: ios uiviewcontroller

我的问题是以下

我有一个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的背景颜色属性及其包含的四个tableview。从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来打开和关闭各种表视图的隐藏属性。一切都很好,很简单。 tableviews正在提取他们的数据。工作正常。

当我在其中一个tableViews上选择我的一个tableview单元格时,我想要更改我的tableview(实际上是所有的tableview)和作为superview的UIView的背景颜色

self.superview.backgroundColor = FreshWaterColor;

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

我已将MultiTableHoldingViews标头导入相关的tableview(EnviroTV),因此它知道它的超级视图方法。但是,如果我尝试在self.superview上调用这两个方法中的任何一个,那么这些方法就不会显示出来,如果我完全输入它们,我会得到以下错误

'UIView'的可见界面没有显示选择器'setFreshWaterColor'

所以我检查了superview是什么类型的对象,以及它的“superview UIViewControllerWrapperView类”

我搜索这个及其显然是“

这是框架使用的私有视图。你不应该修改它或任何东西。“

我显然在这里遗漏了一些东西 - 我应该如何在MultiTableHoldingView实例上调用该方法?

提前致谢

西蒙

Doh - 它的正式代表团就像danypata在评论中提到的那样 - 我已经准确地说明了我是如何做到这一点作为下面的答案。试图尽可能清楚地表明代表团的工作方式

1 个答案:

答案 0 :(得分:3)

解决方案

第一步 - 在编码之前获得更多睡眠。

这真的是基本的目标-c东西 - 我只是在切线,寻找其他方面去做,因为我发现UIViewControllerWrapperView一路上感到困惑。

正如danypata在评论中正确建议的那样,解决方案是使用委托 - Objective-C中的常见设计模式 - 就像你一样,例如,当你使用另一个类来提供tableview数据时

因为我今天的时间非常浪费时间,所以我会尝试为其他相关新手或有休息日的人做出“如何”的清晰,而不是直接思考。

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

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

@protocol EnviroTVProtocol <NSObject>


-(void) setFreshWaterColor;
-(void) setSaltwaterColor;


@end

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

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

您将类型设置为id - 一个通用对象 - 因为您实际上并不关心什么类型的对象将作为您的委托,只是它实现了您需要它运行的方法。当一个对象声明自己实现一个协议时,它只是承诺实现协议所需的方法

所以,当我想在superviews类上运行方法时,我调用

[self.colorChangeDelegate setFreshWaterColor];

[self.colorChangeDelegate setSaltWaterColor];

委托模式的最后一部分是进入将成为委托的类(在本例中是我的MultiTableHoldingView类)并声明它符合协议

我在MultiTableHoldingView.h文件中执行此操作

更改此行:

@interface MultiTableHoldingView : UIViewController

进入这一行:

@interface MultiTableHoldingView : UIViewController <EnviroTVProtocol>

表示此类承诺实现EnviroTVProtocol所需的所有方法。

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

新手 - 不要害怕代表团 - 它太棒了,而不是你想象的那么复杂

同时,如果有人能解释UIViewControllerWrapperView是什么......