0

在我的主视图控制器中,我有一个调用弹出框的按钮。由于弹出框有它自己的视图控制器,它的按钮调用弹出框视图控制器中的方法。但是我如何从主视图控制器调用方法呢?

我试过这个。在弹出视图控制器中,我在 .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'

知道我做错了什么吗?谢谢

4

3 回答 3

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];
于 2012-08-28T16:54:19.437 回答
1

这是使用委托协议的好地方。在 PopoverContent.h 中,添加如下内容:

@protocol PopoverContentDelegate : NSObject
    - (void) method1;
@end

自然,您可以拥有多个方法,并且这些方法可以像任何其他方法一样返回值并接受参数。此外,在同一个文件中,添加名为delegate. (从技术上讲,它可以被称为任何东西,但是如果您将其称为委托,那么查看您的代码的每个人都会确切地知道您在做什么。)

@interface PopoverContent

@property (weak) id<PopoverContentDelegate > delegate;
//other properties and methods
@end

最后,在“主”视图控制器的 .m 文件中,导入 PopoverContent.h 文件并将委托设置为 self。还要实现 method1 来做任何你需要做的事情。

//Create the view controller
myPopoverContentController.delegate = self;
//Create the popover with the view controller.

现在,在 PopoverContent 控制器中,您可以在任何需要的地方调用委托的 method1。

[delegate method1];
于 2012-08-28T16:59:35.617 回答
0

首先,要回答您的问题,您可能必须在 ViewController.h 文件中定义 generateHash 方法。

其次,我建议您的设计方法不是最佳的。generateHash 方法可能需要位于另一个可以从 ViewController 和 Popover 内容控制器调用的文件中。例如,考虑另一个objective-c .h/.m 对“MyHashMethods”:

    MyHashMethods.h

    + (void)generateHash;

    MyHashMethods.m

    + (void) generateHash
    {
         // hash code
    }

这将允许您将 MyHashMethods.h 包含在您需要的任何视图控制器中,然后调用

    [MyHashMethods generateHash];

当你需要它的时候。

于 2012-08-28T17:06:02.850 回答