2011-05-07 42 views
10

我試圖從Popover中的按鈕解僱UIPopoverViewControler。另外,我希望它將數據傳回主視圖。我有一個modalViewController,但不適用於Popover。有誰知道我能做到這一點?如何從Popover中的按鈕中解除UIPopover

//酥料餅

- (IBAction) save:(id)sender 
{ 
    if ([self startDateIsValid] && [self endDateIsValid]) 
    { 

     [[self parentViewController] setDatesForEvent:startDate eventEndDate:endDate allDay:[allDaySwitch isOn]]; 
     [self dismissModalViewControllerAnimated:YES]; 

    } 

} 

// AddEventViewController_iPad

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 
#import "dateViewPopOverViewController_iPad.h" 
@interface AddEventViewController_iPad : UIViewController <UITableViewDelegate,UITableViewDataSource, MFMailComposeViewControllerDelegate, UITextFieldDelegate, UIAlertViewDelegate,UIPopoverControllerDelegate,UINavigationControllerDelegate,UIPopoverControllerDelegate,ABPeoplePickerNavigationControllerDelegate, ABNewPersonViewControllerDelegate,DismissPopoverDelegate> { 

// datePopover

#import <UIKit/UIKit.h> 
#import "AddEventViewController_iPad.h" 
@protocol DismissPopoverDelegate <NSObject> 

- (void) dismissWithData:(NSString *)data; 

@end 

@interface dateViewPopOverViewController_iPad : UIViewController<UIPopoverControllerDelegate> { 

回答

23

思想是簡單的。 YourViewController - 它是UIPopoverController的viewController。 MainViewController - 控制器,你在YourViewControllerMainViewController

  • 創建UIPopoverController

    1. 申報協議與駁回方法
    2. 聲明id<DismissDelegateProtocol>類型的屬性在YourViewController
    3. 申報支持的DismissDelegateProtocol實施MainViewController
    4. 駁回的 DismissDelegateProtocol方法
    5. 當您在MainViewController中創建YourViewController s等代表屬性(yourViewController.delegate = self;
    6. 在動作,即響應於按鈕觸摸呼叫委託方法:[self.delegate dismissWithData:dataToTransfer];

    在代碼應該是這樣的:

    在MainViewController.h

    #import "YourViewController.h" 
    @class MainViewController: UIViewController <DismissPopoverDelegate> 
    

    In MainViewController.m

    - (void) dismissPopover:(NSObject *)yourDataToTransfer 
    { /* Dismiss you popover here and process data */ } 
    
    ... 
    // Some method, when you create popover 
    { 
        YourViewController *vc = ... ; 
        vc.delegate = self; // this delegate property should be declared as assign 
    } 
    

    在YourViewController.h

    @protocol DismissPopoverDelegate 
    - (void) dismissPopover:(NSObject *)yourDataToTransfer; 
    @end 
    
    @class YourViewController : UIViewController 
    { 
        id<DismissPopoverDelegate> delegate; 
    } 
    
    @property (nonatomic, assign) id<DismissPopoverDelegate> delegate; 
    

    在YourViewController.m

    - (void) methodWhenYouWantToDismissPopover 
    { 
        [self.delegate dismissPopover:data]; 
    } 
    
  • +0

    即時得到就行錯誤@class YourViewController:UIViewController中 { ID 委託; } 它說我需要一個; – BDGapps 2011-05-07 16:24:41

    +0

    你得到了什麼樣的錯誤? – 5hrp 2011-05-07 16:30:43

    +0

    它說我需要一個;而不是在@class AddEventViewController_iPad:UIViewController – BDGapps 2011-05-07 16:32:30

    11

    Sharrps答案是非常好的,但這裏有一個稍微不同的方法,可能會更快如果你正在展示一個子類視圖控制器。

    所以,如果你已經提出了UIViewController的子類,定義一個指向UIPopoverController的屬性。在呈現視圖控制器中,實例化您的自定義視圖控制器,使用所述自定義視圖控制器實例化您的彈出窗口,然後將自定義視圖控制器的屬性指定給包含它的彈出窗口控制器。

    當需要解僱的時候,你的控制器會引用它的彈出窗口並且可以解除它。彈出窗口還會有一個指向其父視圖控制器的指針,因此您可以通過原始呈現視圖控制器執行與模型相關的任何操作。

    +3

    這很聰明。我將回避接受的答案並採取這種方式。蘋果應該讓這個更簡單。當你問一個傢伙出去,他說,要求我的父親帶我離開,這可能很煩人。 – gigahari 2013-03-21 10:01:45

    +0

    比被接受的答案更容易 - 習慣於以這種方式在類之間傳遞對象和數據,但沒有考慮在提交的VC中實施這樣的解除流行。 – 2014-03-12 15:51:34

    1

    在上面的原始對話「即時得到就行了錯誤@class YourViewController:UIViewController的{ID代表;}它說我需要一個; - BDGapps」

    答案很簡單。這是一種類型。將@class更改爲@interface,一切都很好。

    @protocol DismissPopoverDelegate 
    - (void) dismissPopover:(NSObject *)yourDataToTransfer; 
    @end 
    
    
    @interface YourViewController : UIViewController { 
        id<DismissPopoverDelegate> delegate; 
    } 
    
    相關問題