在我的主视图控制器中,我有一个调用弹出窗口的按钮。由于popover有它自己的视图控制器,它的按钮调用popover的视图控制器中的方法。但是我如何从主视图控制器调用方法?
我试过这个。在popover视图控制器中,我在.h
中添加了一个属性@class ViewController;
@interface PopoverContent : UIViewController <UITextFieldDelegate>
...
@property (strong, nonatomic) ViewController *parentView;
在我的popover实现中,我在viewDidLoad中执行了此操作:
self.parentView = [[ViewController alloc] initWithNibName:nil bundle:nil];
在ViewController中,我有一个名为generateHash的方法,所以我尝试了
[parentView generateHash];
但我收到错误:
No visible @interface for 'ViewController' declares selector 'generateHash'
知道我做错了什么吗?感谢
答案 0 :(得分:1)
删除此行,不想创建视图控制器的新实例
self.parentView = [[ViewController alloc] initWithNibName:nil bundle:nil];
更改此行
@property (strong, nonatomic) ViewController *parentView;
,因此您的父视图指针属于正确的类类型
@property (weak) ParentView *parentView;
现在在父视图中.m文件
- (void) createPopup
{
PopoverView *popoverV = [[PopoverView alloc] init];
popoverV.parentView = self;
//And some command to show your popup, addSubview, or presentModal, or whatever
}
然后在PopoverView.m文件中,您可以像这样调用parentView的方法
[self.parentView SomeMethod];
答案 1 :(得分:1)
这是使用委托协议的好地方。在PopoverContent.h中,添加如下内容:
@protocol PopoverContentDelegate : NSObject
- (void) method1;
@end
当然,您可以拥有多个方法,并且方法可以返回值并像任何其他方法一样获取参数。此外,在同一文件中,添加名为delegate
的属性。 (从技术上讲,它可以被称为任何东西,但是如果你将代码称为委托,那么查看代码的每个人都会知道你正在做什么。)
@interface PopoverContent
@property (weak) id<PopoverContentDelegate > delegate;
//other properties and methods
@end
最后,在“main”视图控制器的.m文件中,导入PopoverContent.h文件并将委托设置为self。还要实现method1来做你需要做的任何事情。
//Create the view controller
myPopoverContentController.delegate = self;
//Create the popover with the view controller.
现在,在PopoverContent控制器中,您可以根据需要在委托上调用method1。
[delegate method1];
答案 2 :(得分:0)
首先,要回答您的问题,您可能需要在ViewController.h文件中定义generateHash方法。
其次,我建议你的设计方法不是最优的。 generateHash方法可能需要在另一个可以从ViewController和Popover内容控制器中调用的文件中。例如,考虑另一个目标-c .h / .m对“MyHashMethods”:
MyHashMethods.h
+ (void)generateHash;
MyHashMethods.m
+ (void) generateHash
{
// hash code
}
这将允许您在您需要的任何视图控制器中包含MyHashMethods.h然后调用
[MyHashMethods generateHash];
当你需要它时。