【问题标题】:Accessing a method on a views superview - What is UIViewControllerWrapperView?访问视图超级视图上的方法 - 什么是 UIViewControllerWrapperView?
【发布时间】: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 中,以便我可以对其进行强制转换,但这会导致使用 M​​ultiTableHoldingView.h 编译时出现 2 个问题上面下面一行的文件列表 @property (strong, nonatomic) IBOutlet EnviroTV *dsEnvironmentTV;它首先告诉我存在未知类型名称“enviroTV”的解析问题,并且具有保留或强属性的语义问题属性必须是对象类型。有任何想法吗?这是两个类相互引用的问题吗?
  • 首先,我认为您应该编辑整个问题并使用正确的命名,因为我认为您在 UIView 和 UIViewController 之间产生了混淆,并且我认为我误解了您的问题。请编辑您的问题,当它准备好时我会再看一遍;)
  • 我想我知道您在尝试什么,您想使用您的 tableView 超级视图访问视图控制器的方法。好吧,这是不可能的,至少以这种方式,您需要的是delegates。查看 SO 或 google 以获取委托教程。

标签: ios uiviewcontroller


【解决方案1】:

解决方案

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

这确实是基本的 Objective-c 内容 - 我只是走神,寻找其他方法来做这件事,一路上发现 UIViewControllerWrapperView 让我感到困惑。

正如 danypata 在 cmets 中正确建议的那样,解决方案是使用委托 - 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 是什么.....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    相关资源
    最近更新 更多