2012-08-28 59 views
0

在我的主视图控制器中,我有一个调用弹出窗口的按钮。由于popover有它自己的视图控制器,它的按钮调用popover视图控制器中的方法。但是,我将如何从主视图控制器调用一个方法?iOS:从单独的视图控制器调用方法

我试过了。在酥料饼的视图控制器我在.H

@class ViewController; 

@interface PopoverContent : UIViewController <UITextFieldDelegate> 
... 
@property (strong, nonatomic) ViewController *parentView; 

添加的属性在我酥料饼的实现我这样做在viewDidLoad中:

self.parentView = [[ViewController alloc] initWithNibName:nil bundle:nil]; 

在视图控制器我有一个名为generateHash方法,所以我尝试

[parentView generateHash]; 

但我得到的错误:

No visible @interface for 'ViewController' declares selector 'generateHash' 

任何想法我做错了什么?由于

回答

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

如果你使用这种方法,对'parentView'的引用应该很弱。如果它很强大,那么最终可能会有一个强大的引用周期,并且这些对象将永远不会在ARC下解除分配。 (是的,我意识到这取决于父母是否强烈地引用了“孩子”PopoverContent实例 - 它现在可能会发生,或者很可能会在将来修改代码时使用)。 –

+0

很有用,谢谢。建议如上所述更改它。 – Augie

+0

我有点困惑,我注意到当我在弹出窗口视图控制器中声明按钮时,对于目标我可以添加'self.parentViewController',但没有任何方法被调用。似乎这是最简单的方法(但似乎并不奏效) – inorganik

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。还可以实现方法1来完成您需要的任何操作。

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

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

[delegate method1]; 
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]; 

当你需要它时。

相关问题