【问题标题】:Calling parent method from a UIView从 UIView 调用父方法
【发布时间】:2012-07-20 03:08:00
【问题描述】:

(这应该很简单。但它已经让我发疯了好几个小时。) 我只是想从 UIView 内部调用 ViewController 方法。

myViewController 声明并创建一个 UIView:

myUIView = [[viewCreator alloc] init…];

而我的 myViewController 也有一个方法:

-(void)inABottle{
    NSLog(@"Hello.");
}

在 UIView 内部,创建了一个 UIButton。这个按钮有一个方法的“选择器”——在 UIView 中——然后尝试调用 ViewController 中的“inABottle”方法。 UIView 内部:

...
[myButton addTarget:self action:@selector(isPressed) forControlEvents:UIControlEventTouchUpInside];

-(void)isPressed{
    [myViewController inABottle];// <<< This is where I have spent my day.
}

(ViewController 头文件是 UIView 中的 #import 。)

非常感谢一些帮助。当然这应该很简单!

【问题讨论】:

  • 你在哪里设置 myViewController 在你的 UIView 中?
  • 就在 UIView 标头中:#import "myViewController.h"

标签: iphone ios xcode ios5


【解决方案1】:

这就是协议和委托的用途。想想UITableView 是如何处理这个问题的。

@class MyView;
@protocol MyViewDelegate
- (void)myViewIsInABottle:(MyView *)view;
@end

@interface MyView : UIView
@property (weak) id<MyViewDelegate> delegate;
@end

@implementation MyView
-(void)isPressed{
  [self.delegate myViewIsInABottle:self];
}
...
@end

【讨论】:

  • 谢谢 Rob,是的,我会仔细研究这种方法。 (不过真的不应该这么难!)
  • 这种解耦是MVC的核心。如果您愿意,您可以像@DanF 注释那样将一个指向其视图控制器的直接指针传递给视图(尽管您需要使其变得弱,而不是强),但是随后您创建了一个硬耦合,使代码难以重用。跨度>
  • 更新:学习如何使用委托/协议一直是一个真正的挑战,那里很少有好的、完整的例子。但我找到了这个,它有很大帮助:timneill.net/2010/11/modal-view-controller-example-part-2
【解决方案2】:

在视图中创建一个属性,并在创建时将其设置为当前视图控制器:

viewcontroller.m:

myUIView = [[viewCreator alloc] init...];
myUIView.myViewController = self;

view.h:

@property (weak) ViewController *myViewController;//weak or assign depending if you are using ARC or not, and ViewController should be the class of your view controller

view.m:

@synthesize myViewController;

然后就像在问题中的代码中一样调用方法。

您还应该研究如何使用委托,这是您何时应该使用委托的完美示例。

【讨论】:

  • 感谢 Dan F,我认为这会奏效。但你是对的,我将仔细研究如何使用委托。
  • 这里的属性必须是weak。否则你会创建一个保留循环并且会泄漏视图和视图控制器。
  • @RobNapier 非常好,只是习惯的力量这样打字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 2017-06-26
  • 2019-03-22
相关资源
最近更新 更多