【发布时间】:2013-06-12 19:37:08
【问题描述】:
我的问题是关注
我有一个 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(实际上是我所有的 tableviews)和作为超级视图的 UIView 的背景颜色
self.superview.backgroundColor = FreshWaterColor;
可以很好地返回并更改 MultiTableHoldingView 的实例视图背景属性,但我想调用 MultiTableHoldingView 的 setFreshWaterColor 和 setSaltwaterColor 方法的实例。
我已将 MultiTableHoldingViews 标头导入相关的 tableview (EnviroTV),因此它知道它的 superviews 方法。但是,如果我尝试在 self.superview 上调用这两种方法中的任何一种,这些方法都不会显示,如果我完整输入它们,我会收到以下错误
“UIView”没有可见界面显示选择器“setFreshWaterColor”
所以我检查了 superview 是什么类型的对象以及它的“superview UIViewControllerWrapperView 类”
我搜索这个,它显然是“
这是框架使用的私有视图。你不应该修改它或任何东西。”
我显然在这里遗漏了一些东西 - 我应该如何调用 MultiTableHoldingView 实例上的方法?
提前致谢
西蒙
Doh - 正如 danypata 在 cmets 中提到的那样,它只是委托 - 我已经在下面发布了我是如何做到这一点的答案。试图尽可能清楚地说明委派的工作原理
【问题讨论】:
-
将
superview返回的视图投射到您的 MultiTableHoldingView 类中。像这样MultiTableHoldingView *custom view = (MultiTableHoldingView *) aView.superview;这只有在 aView.superview 返回的视图是MultiTableHoldingView类型时才有效@ -
我认为你的评论没有完成:))
-
干杯 danypata - 为此,我显然需要将 MultiTableHoldingView.h 导入我正在使用的 tableClass 中,以便我可以对其进行强制转换,但这会导致使用 MultiTableHoldingView.h 编译时出现 2 个问题上面下面一行的文件列表 @property (strong, nonatomic) IBOutlet EnviroTV *dsEnvironmentTV;它首先告诉我存在未知类型名称“enviroTV”的解析问题,并且具有保留或强属性的语义问题属性必须是对象类型。有任何想法吗?这是两个类相互引用的问题吗?
-
首先,我认为您应该编辑整个问题并使用正确的命名,因为我认为您在 UIView 和 UIViewController 之间产生了混淆,并且我认为我误解了您的问题。请编辑您的问题,当它准备好时我会再看一遍;)
-
我想我知道您在尝试什么,您想使用您的 tableView 超级视图访问视图控制器的方法。好吧,这是不可能的,至少以这种方式,您需要的是
delegates。查看 SO 或 google 以获取委托教程。
标签: ios uiviewcontroller