我有UIViewController
个UIView
作为子视图。我希望UIViewController
通知(或听取)UIView
中的某些操作。 这样做的标准方法是什么?
答案 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
或者,如果您谈到调用父视图控制器的视图控制器,您可以使用UIViewController
的presentingViewController
属性来访问“父”视图控制器:
UIViewController *parentVC = [self presentingViewController];
[parentVC setSomething:self.withSomething];
presentingViewController
- 显示此视图控制器的视图控制器。 (只读)
@property(nonatomic, readonly) UIViewController *presentingViewController
<强>讨论强>
此属性的默认实现向上查看 层次结构,从此视图控制器开始。第一个观点 控制器发现收到了presentViewController:animated:completion:
方法,或者有方法 设置为definesPresentationContext
的{{1}}属性将作为返回 财产的价值。它一直向上走,直到它 找到要返回的值或者它到达根视图控制器。
或UIView
的YES
属性:
superview
[self.view.superview doSomething];
- 接收方的超级视图,如果没有,则为零。 (只读)
superview
答案 1 :(得分:2)
根据您对上述评论的回答,这是按下按钮,“标准”方式是使用UIControl中的机制。所以,以编程方式,如果你这样做
[myButton addTarget:myViewController action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
按“myButton”将导致在myViewController上执行“buttonPressed:”方法。您还可以使用Interface Builder进行连接。
这段代码可以放在许多不同的地方(在UIView中,在UIViewController中),因此,变量的确切名称会改变,但是,为了处理按下的按钮,这可能是最简单的方法。