2012-08-28 54 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]; 

當你需要它時。

相關問題