Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Mac催化剂上打开一个新窗口

在Mac催化剂上打开一个新窗口
EN

Stack Overflow用户
提问于 2019-11-15 09:33:28
回答 2查看 4.6K关注 0票数 11

我正在移植一个iPad应用程序使用Mac催化剂。我正在尝试打开一个视图控制器在一个新的窗口。

如果我使用的是严格的AppKit,我可以像这个帖子中描述的那样做一些事情。但是,由于我使用的是UIKit,所以没有可用的showWindow()方法。

这篇文章说,通过在项目中的一个新包中添加AppKit是可能的(我这样做了),但是它并没有解释如何实际显示新窗口的具体细节。上面写着..。

另一件您不能做的事情是生成一个具有UIKit视图层次结构的新的UIKit。但是,您的UIKit代码能够生成一个新的窗口场景,您的AppKit代码能够获取它所呈现的结果NSWindow,并劫持它来执行您想要的任何操作,因此在这个意义上,您可以为辅助调色板和各种其他功能生成UIKit窗口。

有人知道如何实现本文中所解释的内容吗?

TL;DR:,我如何用Mac催化剂作为一个新的独立NSWindow打开一个UIViewController

EN

回答 2

Stack Overflow用户

发布于 2019-11-27 01:50:35

编辑:添加了关于如何拥有其他不同窗口(如面板)的信息

为了在mac上支持多个窗口,您所需要做的就是在iPad上支持多个窗口。

您可以在从22:28分钟开始的 WWDC会话中找到所需的所有信息,但是要总结它,您需要做的是支持新的场景生命周期模型。

首先编辑目标并检查支持多窗口复选标记。

完成此操作后,单击配置选项,该选项将带您到info.plist。确保您有合适的应用场景报表条目

创建一个名为SceneDelegate.swift的新的快速文件,并将下面的样板代码粘贴到其中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?


    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).

        // Create the SwiftUI view that provides the window contents.
       guard let _ = (scene as? UIWindowScene) else { return }
    }

    func sceneDidDisconnect(_ scene: UIScene) {
        // Called as the scene is being released by the system.
        // This occurs shortly after the scene enters the background, or when its session is discarded.
        // Release any resources associated with this scene that can be re-created the next time the scene connects.
        // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
    }

    func sceneDidBecomeActive(_ scene: UIScene) {
        // Called when the scene has moved from an inactive state to an active state.
        // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
    }

    func sceneWillResignActive(_ scene: UIScene) {
        // Called when the scene will move from an active state to an inactive state.
        // This may occur due to temporary interruptions (ex. an incoming phone call).
    }

    func sceneWillEnterForeground(_ scene: UIScene) {
        // Called as the scene transitions from the background to the foreground.
        // Use this method to undo the changes made on entering the background.
    }

    func sceneDidEnterBackground(_ scene: UIScene) {
        // Called as the scene transitions from the foreground to the background.
        // Use this method to save data, release shared resources, and store enough scene-specific state information
        // to restore the scene back to its current state.
    }


}

你基本上就完蛋了。运行你的应用程序,点击命令+N创建任意数量的新窗口。

如果要在代码中创建新窗口,可以使用以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@IBAction func newWindow(_ sender: Any) {            
    UIApplication.shared.requestSceneSessionActivation(nil, userActivity: nil, options: nil) { (error) in
        //
    }
}

,现在我们进入了如何创建额外的windows的大谜团。

关键是在应用程序中创建多个场景类型。您可以在info.plist (我无法正常工作)或在AppDelegate中完成。

让我们将函数更改为创建一个新窗口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@IBAction func newWindow(_ sender: Any) {     
    var activity = NSUserActivity(activityType: "panel")
    UIApplication.shared.requestSceneSessionActivation(nil, userActivity: activity, options: nil) { (error) in

    }
}

为您的新场景创建一个新的故事板,创建至少一个视图控制器,并确保设置为故事板中的initalviewcontroller。

让我们将以下函数添加到app委托中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 
        if options.userActivities.first?.activityType == "panel" {
            let configuration = UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
            configuration.delegateClass = CustomSceneDelegate.self
            configuration.storyboard = UIStoryboard(name: "CustomScene", bundle: Bundle.main)
            return configuration
        } else {
            let configuration = UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
            configuration.delegateClass = SceneDelegate.self
            configuration.storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
            return configuration
        }
    }

通过在请求场景时设置userActivity,我们可以知道要创建哪个场景并相应地为其创建配置。菜单中的新窗口或CMD+N仍然会创建默认的新窗口,但是新窗口按钮现在将从新的故事板创建UI。

塔达:

票数 32
EN

Stack Overflow用户

发布于 2020-04-06 00:42:32

有了SwiftUI,您就可以这样做了(感谢罗恩·塞布罗):

1.激活多窗口支持:

2.要求新的场景:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct ContentView: View {
    var body: some View {
        VStack {
            // Open window type 1
            Button(action: {
                UIApplication.shared.requestSceneSessionActivation(nil,
                                                                   userActivity: NSUserActivity(activityType: "window1"),
                                                                   options: nil,
                                                                   errorHandler: nil)
            }) {
                Text("Open new window - Type 1")
            }

            // Open window type 2
            Button(action: {
                UIApplication.shared.requestSceneSessionActivation(nil,
                                                                   userActivity: NSUserActivity(activityType: "window2"),
                                                                   options: nil,
                                                                   errorHandler: nil)
            }) {
                Text("Open new window - Type 2")
            }
        }
    }
}

3.创建新的窗口视图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Window1: View {
    var body: some View {
        Text("Window1")
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Window2: View {
    var body: some View {
        Text("Window2")
    }
}

4.更改SceneDelegate.swift:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)

            if connectionOptions.userActivities.first?.activityType == "window1" {
                window.rootViewController = UIHostingController(rootView: Window1())
            } else if connectionOptions.userActivities.first?.activityType == "window2" {
                window.rootViewController = UIHostingController(rootView: Window2())
            } else {
                window.rootViewController = UIHostingController(rootView: ContentView())
            }

            self.window = window
            window.makeKeyAndVisible()
        }
    }
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58882047

复制
相关文章
在新窗口打开链接
最近博主再用H+模板时候表单提交和链接都在新窗口打开,没看见target="_blank",一直没查出来,苦恼N久,今天百度了如何用JS css等等实现网页所有链接在新窗口打开,终于找到了原因,因如下代码导致。 代码如下:
雨落凋殇
2019/12/25
2.7K0
from表单提交在新窗口打开
<form action=”URL”  method=”post”  target=”_blank” >
kirin
2021/03/01
2.4K0
使用 jQuery 在新窗口打开外部链接
我们一般都希望在新窗口打开外部链接,这样用户就不需要离开网站就能访问外部链接,但是如果每个外部链接都手工加上新窗口打开的属性(target="_blank")的话,会让人非常抓狂。使用 jQuery,我们只需要几行代码就能在新窗口中打开外部链接。
Denis
2023/04/15
2.7K0
在新窗口中打开页面?小心有坑!
本文讲述了一种在新窗口中打开页面时需要注意的安全问题和解决方案。当使用window.open()在新窗口中打开页面时,可能会存在安全风险。例如,攻击者可以通过恶意脚本劫持新窗口中的页面,从而窃取用户的个人信息。为了防范这种安全风险,可以采用以下方法:使用noopener属性或window.open()并设置opner为空,这样新窗口将不会继承父窗口的任何属性。另外,也可以使用iframe来打开新窗口,并确保iframe中的内容安全。最后,如果必须在新窗口中打开页面,可以使用第三方库,如OpenURL,来避免安全风险。
IMWeb前端团队
2017/12/28
4K0
在新窗口中打开页面?小心有坑!
在新窗口中打开页面?小心有坑!
产品需求来啦:点击页面上某个东西,要在新窗口中打开一个页面,注意!要在新窗口中打开。你呵呵一笑,太简单了:
IMWeb前端团队
2019/12/04
5.3K0
qt tabwidget切换_标签怎么在新窗口打开
QTabWidget 用来分页显示 重要函数: 1.void setTabText(int, QString); //设置页面的名字. 2.void setTabToolTip(QString); //设置页面的提示信息. 3.void setTabEnabled(bool); //设置页面是否被激活. 4.void setTabPosition(QTabPosition::South); //设置页面名字的位置. 5.void setTabsClosable(bool); //设置页面关闭按钮。 6.int currentIndex(); //返回当前页面的下标,从0开始. 7.int count(); //返回页面的数量. 8.void clear(); //清空所有页面. 9.void removeTab(int); //删除页面. 10.void setMoveable(bool); //设置页面是否可被拖拽移动. 11.void setCurrentIndex(int); //设置当前显示的页面.
全栈程序员站长
2022/11/04
3.8K0
qt tabwidget切换_标签怎么在新窗口打开
JS 新窗口打开超链接
第一种  给a标签添加点击事件: 源码: //点击百度一下 进行百度搜索 $("#baiduBtn").click(function(){ this.href="
明明如月学长
2021/08/27
16.2K0
WordPress后台点击“查看站点”在新窗口中打开
WordPress 后台点击左上角的网站名称或者菜单中的“查看站点”都是在当前窗口直接打开,但其实有时候我们是想要在保留后台界面,在新窗口中打开这个链接查看首页而已,虽然可以通过右键在新窗口中打开,无疑是没有直接点击在单独的窗口中打开“查看站点”链接会更方便。
张子凡
2022/11/02
1.5K0
WordPress后台点击“查看站点”在新窗口中打开
JS post方式打开新窗口
郭顺发
2023/07/17
5370
Chrome下的打开新窗口
做了一个后台运维管理系统<前台页面基于Extjs进行开发>,在点击datagrid头部一个按钮,需要打开一个新窗口
meteoric
2018/11/15
3.6K0
写了一个打开最大新窗口的JS
在IE里面如果使用a标签的target=”_black”打开的新窗口,那么窗口的大小是由最后一次关闭窗口时窗口大小决定的,如果我们希望a标签打开的新窗口都是最大的窗口,那么我们需要使用window.open来实现。
深蓝studyzy
2022/06/16
3.3K0
Typecho文章链接用新窗口打开
这篇文章是我去年发过的,今天重新搭建Blog刚好需要就找了一下 想着应该会有人需要就重新发一下 用PHP函数实现 文章链接用新窗口打开
洛叶的Blog
2023/04/13
2K0
Typecho文章链接用新窗口打开
如何新窗口打开导航链接?
像没有服务器,没弄多个Github账号的人,比如我(资深白嫖党),可能会遇到这个问题。
唐志远
2023/08/01
2600
如何新窗口打开导航链接?
Typecho文章内链新窗口打开
我之前找了很多方法发现都是失效的,都是以前的版本的 方法一:添加parseContent() 函数 (推荐) 在主题function.php中添加 function parseContent($obj){ $options = Typecho_Widget::widget('Widget_Options'); if(!empty($options->src_add) && !empty($options->cdn_add)){ $obj->content = str
洛叶的Blog
2023/04/17
1.8K0
Mac电脑打开文件夹在新标签还是新窗口的设置问题
如果想在新标签打开,打开Finder(访达),偏好设置,勾选“在标签页中打开文件夹”
geekfly
2022/04/24
3.6K0
Mac电脑打开文件夹在新标签还是新窗口的设置问题
vue路由如何在新窗口打开页面
官方文档中说 v-link 指令被 <router-link> 组件指令替代,且 <router-link> 不支持 target="_blank" 属性,如果需要打开一个新窗口必须要用<a>标签,但事实上vue2版本的 <router-link> 是支持 target="_blank" 属性的(tag="a"),示例如下:
李维亮
2021/07/08
8.3K0
Angular 允许ctrl+点击新窗口打开
客户希望使用Ctrl+点击链接在新窗口打开新页面。 经过调查可以实现,具体方式:
mafeifan
2019/05/10
2.5K0
WordPress 网站如何有选择性的在新窗口打开链接?
WordPress 网站如何有选择性的在新窗口打开链接?在新窗口打开链接有时还是很有必要,下面这个简单实例,是利用 JQuery实现有选择性的在新窗口打开链接的方法。
主机教程网2bcd.com
2022/10/17
1K0
html a标签打开新窗口_a标签链接打开新页面
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/17
4.3K0
typecho1.2 (18.10.23) 新窗口打开链接
本博客主要是面向亚洲访客,简体中文访客。而中文用户是习惯于新窗口打开链接,所以我修改了一下代码。
eallion
2022/12/20
2K0

相似问题

催化剂:如何打开Mac上的设置?

13

在Mac催化剂上的应用

111

mac上python中的Matplotlib打开了一个新窗口

24

在NSAlert上打开新窗口

10

Mac催化剂游戏在GKAchievementInternal showBanner上崩溃

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文