0

我有一个自定义 UIView 用于显示弹出框(在 iPhone 上)。在弹出窗口中有一些 UIButtons,我需要从 ViewController 的类(不是 UIView 的类,而是显示 UIView 的视图)中调用方法。

我该如何正确设置?

位于自定义 UIView 类中的 UIView 按钮代码:

    UIButton *logoutButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [logoutButton setTitle:@"Logout" forState:UIControlStateNormal];
    [logoutButton setFrame:CGRectMake(0, 0, content.frame.size.width, 44)];
    [logoutButton addTarget:self.superview.superview action:@selector(logout) forControlEvents:UIControlEventTouchUpInside];
    [logoutButton setBackgroundImage:redImage forState:UIControlStateNormal];
    [logoutButton setBackgroundImage:redImageHighlight forState:UIControlStateHighlighted];
    [logoutButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [content addSubview:logoutButton];
4

3 回答 3

2

最好的方法是在你的 UIView 子类中使用委托模式来在你的注销按钮被按下时通知所有者。在视图控制器中创建视图实例时,将委托设置为 self。

在http://enroyed.com/ios/delegation-pattern-in-objective-c-and-writing-custom-delegates/中查看“编写自定义代表”

无法以您在上面的代码中尝试执行的方式访问连接到超级视图的 ViewController。

或者,您可以发布通知。例如,发送一条应用程序范围的消息,表明应该执行注销。查看 NSNotificationCenter 了解如何执行此操作。

就像是:

[[NSNotificationCenter defaultCenter] postNotificationName:kShouldLogOutNotification object:nil];

编辑:您肯定希望在您的用例中使用委托。

于 2012-09-13T17:02:08.617 回答
0

Ok so I do believe that creating a custom delegate is the PROPER way to handle this problem. However, I did discover that this method works correctly (not sure if it is "proper" though)

[logoutButton addTarget:self.superview action:@selector(logout) forControlEvents:UIControlEventTouchUpInside];

This seems to tell the button to use the class (ViewController) of it's superview (UIView). Again, not sure if this is the proper/correct way to call a method from the main view controller, but it works without a problem so it seems useable.

于 2012-09-13T17:10:13.943 回答
0

这类事情通常是通过委托来完成的,这是 UIKit 中大量使用的设计模式。请参阅:iOS 委托的目的是什么?

于 2012-09-13T17:06:44.153 回答