访问视图超级视图的方法 – 什么是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是什么…..
- 在LSApplicationQueriesSchemes下的Info.plist中缺lessfbauth2,并且是iOS 9.0所必需的
- 调用NSURLConnectionDataDelegate方法来下载图像只偶尔工作
- 使用Speech kit ios时,由于未被捕获的应用程序崩溃而终止应用程序
- iPhone:HOWTO用平移手势移动状态栏
- 如何识别出现为空括号的空NSData对象?
- 对于两个匹配的用户,在Firebase / Swift上创build聊天室的首选方式是什么?
- 隐藏/显示Spritekit中的iAds
- 什么导致我的SKAction计时器行为奇怪?
- Xcode和CI中的秘密变量可带来乐趣和收益💌