リンク先のページのダウンロードリンクが機能しないため、より一般的な回答を残しておきます。
NSPageController
;を使用している場合は、複数のWebViewを保持したり、スナップショットを手動で生成したりする必要はありません。それはあなたのためにそれを世話します。あなたの場合、履歴モードNSPageController
で使用したいと思います。これを行うには、にを配線します。次の3つのメソッドを実装する必要があります。WebView
pageController.view
NSPageControllerDelegate
- (void)pageControllerWillStartLiveTransition:(NSPageController *)pageController;
- (void)pageController:(NSPageController *)pageController didTransitionToObject:(id)object;
- (void)pageControllerDidEndLiveTransition:(NSPageController *)pageController;
WebViewが(戻る/進むアクションではなく)新しいページに移動するたびに、を呼び出しnavigateForwardToObject:(id)object
ますpageController
。object
ナビゲートされたページのユーザー状態(スクロール位置、強調表示されたテキスト、フォームの内容など)とページのを格納するカスタムオブジェクトを作成しますWebHistoryItem
。ユーザーの状態は最初は未定義にすることができますが、で設定する必要がありますpageControllerWillStartLiveTransition:
。次に例を示します。
- (void)pageControllerWillStartLiveTransition:(NSPageController *)pageController
{
// Remember user state
MyCustomObject *object = [self.pageController.arrangedObjects objectAtIndex:self.pageController.selectedIndex];
object.userState = someUserState;
}
そのメソッドが戻ると、pageController
はそのビュー(WebView)を非表示にし、代わりにそのビューの以前の状態のスナップショットを表示します。
スワイプアニメーションが完了すると、pageController:didTransitionToObject:
が呼び出されます。涼しい。そのメソッドで実行する必要があるのは、メソッドを使用してWebViewをそのアイテムから取得し、そのアイテムに戻すことWebHistoryItem
です。また、ロードが完了したら復元する必要があるため、(たとえば、インスタンス変数に)保存したユーザー状態を保持する必要があります。object
goToBackForwardItem:
object
WebView
最後に、pageControllerDidEndLiveTransition:
WebViewを再表示する前に、やりたいことを何でもします。WebViewの読み込みが完了するまでユーザーの状態は復元されないため、これは何もないと思います。そのため、実装に必要なのはです[pageController completeTransition]
。
最後の詳細は、戻る/進むボタンです。通常どおりに実装する必要がありますが、navigateBack:
またはnavigateForward:
pageControllerで呼び出す必要もあります。
それはほとんどそれをカバーしています。私は実際にこの特定の例を試したことがないので、何か問題が発生した場合はお知らせください。
編集
基本的な機能を取得するためにソースを変更する方法は次のとおりNSPageController
です。NSPageController IBOutlet
AppDelegateヘッダーファイルにプロパティを追加します。ファイルにページコントローラーを追加し、MainMenu.xib
そのビューをWebViewにワイヤリングし、AppDelegateをデリゲートにして、AppDelegateで作成したプロパティへの参照アウトレットを指定します。また、AppDelegateをWebViewのものにしますframeLoadDelegate
。内部basicWebAppDelegate.m
にプライベートプロパティを追加します。
@interface basicWebAppDelegate ()
@property (assign) id currentItem;
@end
次に、次の内部実装を追加します。
#pragma mark - WebFrameLoadDelegate
- (void)webView:(WebView *)sender didCommitLoadForFrame:(WebFrame *)frame {
if (frame == [sender mainFrame]) {
id object = [sender.backForwardList currentItem];
BOOL isCurrentItem = self.currentItem && (object == self.currentItem) ? YES : NO;
if (!isCurrentItem) {
[self.pageController navigateForwardToObject:[sender.backForwardList currentItem]];
}
}
}
#pragma mark - NSPageControllerDelegate
- (void)pageControllerWillStartLiveTransition:(NSPageController *)pageController {
self.currentItem = [self.webView.backForwardList currentItem];
// Here is where you'll save any state for your pageController.arrangedObjects[pageController.selectedIndex] object
}
- (void)pageController:(NSPageController *)pageController didTransitionToObject:(id)object {
BOOL isCurrentItem = self.currentItem && (object == self.currentItem) ? YES : NO;
if (!isCurrentItem) {
self.currentItem = object;
[self.webView goToBackForwardItem:object];
}
}
- (void)pageControllerDidEndLiveTransition:(NSPageController *)pageController {
self.currentItem = nil;
[pageController completeTransition];
}
最後に、アクションを変更してgoBack:
、goForward:
それぞれ[self.pageController navigateBack:sender]
とを呼び出すだけ[self.pageController navigateForward:sender]
にします。
ここではユーザーの状態をわざわざ保存せず、代わりにWebHistoryItem
sをオブジェクトとして直接使用したことに注意してください。別の方法で行う必要があるかもしれません。
さらにサポートが必要な場合はお知らせください。