我的问题是以下
我有一个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在评论中提到的那样 - 我已经准确地说明了我是如何做到这一点作为下面的答案。试图尽可能清楚地表明代表团的工作方式
答案 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是什么......