gpt4 book ai didi

objective-c - 你如何实现 NSPageController 来浏览 webView 的历史记录

转载 作者:太空狗 更新时间:2023-10-30 03:16:46 27 4
gpt4 key购买 nike

我有一个基于 webView 的应用程序,但我希望用户能够通过在触控板上滑动和魔术鼠标来导航它。因此,我要实现 NSPageController。

我查看了文档和 PictureSwiper 应用程序,但它们并不是真正适用于 webView。所以,我想知道如何在 webView 上使用 NSPageController。我有一个定义为 webView 的 webView 和两个 Action ,goBack: 和 goForward: 分别加载上一页和下一页。

但是,我不知道如何让 NSPageController 与简单的 webView 一起工作。必须有办法做到这一点,但我看不到办法。如果有人可以解释我应该做什么,那就太好了。或者,如果您觉得特别慷慨,可以下载我的免费浏览器源代码示例。 https://sites.google.com/site/infiniteopensyntax/basic-web-browser

该来源展示了我自己的应用程序是如何设置的。如果您想在该应用程序上实现 NSPageController 并将源代码发送给我,我将不胜感激。内容不多,但如果您这样做,我会将滑动示例添加到 Infinite Open Syntax 中,并在上面写上您的名字。您可以选择许可证。

这是 Cocoa,不是 Cocoa Touch

编辑

好的,现在我只需要确保该应用程序仍可在 Snow Leopard 上运行。据说,我可以通过断开 socket 来测试它。它工作正常,减去后退和前进按钮。为此,我相信我会检查 NSPageController 类。如果它不存在,那么我就跳过使用 pageController。

- (IBAction)goBack:(id)sender {
if (NSClassFromString(@"NSPageController") != Nil)
{
[self.pageController navigateBack:sender];
}
{

//Not 10.8
[webView goBack];
}
}

最佳答案

您链接到的页面上的下载链接不起作用,所以我会保持我的回答更笼统。

如果您使用 NSPageController,则无需保留多个 WebView 或手动生成快照;它会为你处理。在您的情况下,您想在 History Mode 中使用 NSPageController .为此,将您的 WebView 连接到 pageController.view。您将需要实现三个 NSPageControllerDelegate 方法:

- (void)pageControllerWillStartLiveTransition:(NSPageController *)pageController;
- (void)pageController:(NSPageController *)pageController didTransitionToObject:(id)object;
- (void)pageControllerDidEndLiveTransition:(NSPageController *)pageController;

每次 WebView 进入新页面(不是通过后退/前进操作),调用 navigateForwardToObject:(id)objectpageController 上。我将使 object 成为一个自定义对象,它存储导航页面的用户状态(滚动位置、突出显示的文本、表单内容等)以及页面的 WebHistoryItem。 .用户状态最初可以是未定义的,但应该在 pageControllerWillStartLiveTransition: 中设置。这是一个例子:

- (void)pageControllerWillStartLiveTransition:(NSPageController *)pageController
{
// Remember user state
MyCustomObject *object = [self.pageController.arrangedObjects objectAtIndex:self.pageController.selectedIndex];
object.userState = someUserState;
}

当该方法返回时,pageController 将隐藏其 View (WebView)并改为显示其 View 先前状态的快照。

滑动动画完成后,将调用 pageController:didTransitionToObject:。凉爽的。在该方法中你应该做的是从 object 中获取 WebHistoryItem 并使用 goToBackForwardItem: 让 WebView 返回到该项目。方法。您还应该保留存储在 object 中的用户状态(例如,在实例变量中),因为一旦 WebView 完成加载,您就需要恢复它。

最后,在 pageControllerDidEndLiveTransition: 中,您可以在重新显示 WebView 之前做任何您想做的事情。我希望这没什么,因为在 WebView 完成加载之前用户状态不会恢复,所以您在其实现中需要的只是 [pageController completeTransition]

最后一个细节是后退/前进按钮。您应该像往常一样实现它们,但也让它们在 pageController 上调用 navigateBack:navigateForward:

这几乎涵盖了它。我实际上还没有尝试过这个具体示例,所以如果您遇到任何问题,请告诉我。

编辑

以下是我将如何修改您的源代码以获得基本的 NSPageController 功能。在 AppDelegate 头文件中添加 NSPageController IBOutlet 属性。在您的 MainMenu.xib 文件中添加页面 Controller ,将其 View 连接到您的 WebView,将您的 AppDelegate 作为其委托(delegate),并为其提供我们刚刚在 AppDelegate 中创建的属性的引用导出。此外,让您的 AppDelegate 成为 WebView 的 frameLoadDelegate。在 basicWebAppDelegate.m 中添加一个私有(private)属性:

@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 用作对象。您可能需要采取不同的做法。

如果您需要更多帮助,请告诉我。

关于objective-c - 你如何实现 NSPageController 来浏览 webView 的历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13747190/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com