2017-05-15 14 views
1

私はSafari App Extension Programming Guideの後にXCode 8.3とSwift 3を使ってSafari App Extensionを構築しています。拡張機能には、拡張機能のツールバー項目をクリックしたときに表示されるpopoverが含まれています。 Popoverビューには、ユーザーが実行できるアクションにリンクされたいくつかのボタンが含まれています。Safari App Extensionのポップオーバーをプログラムで閉じるにはどうすればよいですか?

アクションの実行後にポップオーバーを閉じるには、これらのボタンの1つをクリックします。デフォルトでは、ポップオーバーの外にある場所をクリックすると閉じられますが、ガイドやdocsのいずれかでポップオーバーを閉じる他の方法は見つかりませんでした。

私はNSPopoverperformCloseメソッドを持っていることを知っているが、拡張内からポップオーバー自体にアクセスする方法があるように表示されません:アプリの拡張機能は、あなたがその内容が魔法のようにポップオーバー内に表示さSFSafariExtensionViewControllerを、提供することができます。

this StackOverflow answerで説明したように、私もdismissViewControllerを使用してみましたが、私の見解では、コントローラself.presentingは常にnilで、かつself.dismissViewController(self)だけのメッセージで拡張クラッシュ:

dismissViewController:: Error: maybe this view controller was not presented?を。

最後に、私はプログラム的にrelated questionに気付きましたopeningツールバーアイテムのポップオーバーは過去6ヶ月間は返答していません。これはAppleに、popoverのオープンとクローズの厳格な制限を単に与えるかもしれないと疑う。このような場合でも、限界が何であるかを知ることは賢明です。さて、私は同じこと@Aaronに取り組んでいると私は以下のようにそれを考え出し

答えて

0

- :

をビューコントローラ

#import <Cocoa/Cocoa.h> 
#import <SafariServices/SafariServices.h> 

@interface SafariExtensionViewController : SFSafariExtensionViewController 
{ 
    SFSafariWindow *sfWindow; 
} 
@property (nonatomic, retain) SFSafariWindow *sfWindow; 

のあなたの.hファイルでビューコントローラのあなたの.mファイルで

#import "SafariExtensionViewController.h" 
#import "SafariExtensionHandler.h" 

@interface SafariExtensionViewController() 

@end 

@implementation SafariExtensionViewController 

@synthesize sfWindow; 

+ (SafariExtensionViewController *)sharedController 
{ 
    static SafariExtensionViewController *sharedController = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedController = [[SafariExtensionViewController alloc] init]; 
    }); 
    return sharedController; 
} 

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:@"SafariExtensionViewController" bundle:nil]; 
    if(self) 
    { 

    } 
    return self; 
} 

-(IBAction)btnClosePressed:(id)sender 
{ 
    [SafariExtensionHandler.self popoverDidCloseInWindow:sfWindow]; 
} 

上記のようなアクション方法でボタンを接続すると、すべて設定されます。

import Cocoa 
import SafariServices 

class SafariExtensionViewController: SFSafariExtensionViewController { 
    var sfWindow: SFSafariWindow? 

    class func shared() -> SafariExtensionViewController { 
     var sharedController: SafariExtensionViewController? = nil 
     var onceToken: Int 
     if (onceToken == 0) { 
      /* TODO: move below code to a static variable initializer (dispatch_once is deprecated) */ 
      sharedController = SafariExtensionViewController() 
     } 
     onceToken = 1 
     return sharedController! 
    } 

    override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: Bundle!) { 
     super.init(nibName: "SafariExtensionViewController", bundle: nil) 
    } 

    @IBAction func btnClosePressed(_ sender: Any) { 
     SafariExtensionHandler.self.popoverDidClose(in: sfWindow) 
    } 
} 

Extension handler file sfpage instance variable

+0

よし@EricAyaが行わ: - それは

スウィフトコードをクリックし、ポップオーバーボタンをポップオーバー閉じます。 –

+0

優秀、ありがとうございます。 – Moritz

+0

'sfWindow'はどこで設定していますか? 'sfWindow'が展開されない限り、投稿したスウィフトコードは実行されません。さらに、このように 'popoverDidClose'を呼び出すとエラーが発生するため、問題は解決しません。 –

関連する問題