告诉UIViewController关于子视图中发生的事情

时间:2011-10-20 00:34:44

标签: ios uiview uiviewcontroller

我有UIViewControllerUIView作为子视图。我希望UIViewController通知(或听取)UIView中的某些操作。 这样做的标准方法是什么?

2 个答案:

答案 0 :(得分:2)

如果您只想拥有一个动作处理程序:

- (void)viewDidLoad {
    [super viewDidLoad];
    // ......
    UIButton *myButton = [[UIButton alloc] init]; // or initWithSOMETHING
    [myButton addTarget:self action:@selector(someMethod:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:myButton];
    [myButton release];
    // ......
}

- (void)someMethod:(id)sender {
    if (![sender isKindOfClass:[UIButton class]]) return;
    // Do something about the action here...
}

有关详细信息,请参阅UIControl Documentation

  

准备和发送行动讯息

– sendAction:to:forEvent:
– sendActionsForControlEvents:
– addTarget:action:forControlEvents:
– removeTarget:action:forControlEvents:
– actionsForTarget:forControlEvent:
– allTargets
– allControlEvents

或者,如果您谈到调用父视图控制器的视图控制器,您可以使用UIViewControllerpresentingViewController属性来访问“父”视图控制器:

UIViewController *parentVC = [self presentingViewController];
[parentVC setSomething:self.withSomething];
  

presentingViewController - 显示此视图控制器的视图控制器。 (只读)

     

@property(nonatomic, readonly) UIViewController *presentingViewController

     

<强>讨论
  此属性的默认实现向上查看   层次结构,从此视图控制器开始。第一个观点   控制器发现收到了   presentViewController:animated:completion:方法,或者有方法   设置为definesPresentationContext的{​​{1}}属性将作为返回   财产的价值。它一直向上走,直到它   找到要返回的值或者它到达根视图控制器。


UIViewYES属性:

superview
  

[self.view.superview doSomething]; - 接收方的超级视图,如果没有,则为零。 (只读)
  superview

答案 1 :(得分:2)

根据您对上述评论的回答,这是按下按钮,“标准”方式是使用UIControl中的机制。所以,以编程方式,如果你这样做

[myButton addTarget:myViewController action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

按“myButton”将导致在myViewController上执行“buttonPressed:”方法。您还可以使用Interface Builder进行连接。

这段代码可以放在许多不同的地方(在UIView中,在UIViewController中),因此,变量的确切名称会改变,但是,为了处理按下的按钮,这可能是最简单的方法。