我有一个自定义的UIView,我用它来显示一个popover(在iPhone上)。在popover中有一些UIButtons,我需要从ViewController的类中调用方法(不是UIView的类,而是显示UIView的View)。
如何正确设置?
UIView按钮代码位于Custom 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];
答案 0 :(得分:2)
执行此操作的最佳方法是使用UIView子类中的委托模式在按下注销按钮时通知所有者。在viewcontroller中创建视图实例时,请将委托设置为self。
在http://enroyed.com/ios/delegation-pattern-in-objective-c-and-writing-custom-delegates/
中结帐'撰写自定义代表'你无法以上述代码中尝试的方式访问连接到超级视图的ViewController。
或者,您可以发布通知。例如。发送应用程序范围的消息,指出应该执行注销。查看NSNotificationCenter了解如何执行此操作。
类似的东西:
[[NSNotificationCenter defaultCenter] postNotificationName:kShouldLogOutNotification object:nil];
编辑:您肯定希望在您的用例中使用委托。
答案 1 :(得分:0)
这种事情通常是通过委托完成的,这是UIKit中使用频繁的设计模式。请参阅:What is the purpose of an iOS delegate?
答案 2 :(得分:0)
好的,我确实相信创建自定义委托是处理此问题的正确方法。 但是,我确实发现这种方法正常工作(不确定它是否“正确”)
[logoutButton addTarget:self.superview action:@selector(logout) forControlEvents:UIControlEventTouchUpInside];
这似乎告诉按钮使用它的superview(UIView)的类(ViewController)。 再次,不确定这是否是从主视图控制器调用方法的正确/正确方法,但它没有问题,因此它似乎可用。