草庐IT

xcode - 替换 Swift2 Storyboard MAC OSX 下的 NSViewController

coder 2023-09-06 原文

我是 Mac OSX 的新手,随着 Apple 宣传代码主体变得相似这一事实,我决定告诉人们我正在编写代码,因为我们应该能够制作 Mac OSX 版本。 iPhone 和 iPad 版本都很好,即将发布第二个版本,所以没有问题。

所以我将 NSWindowController 子类化以访问工具栏并研究如何在工具栏上删除和添加项目,但是对于我的生活我无法让一个 NSViewController (firstViewController) 关闭并调出第二个 NSViewController (secondViewController) 在同一个 NSWindowController 中。

所以这两个问题是 1. 我希望能够从代码中的第一个 NSViewController 执行 SegueWithIdentifier 并且 2. 通过替换同一个 NSWindowController 中的第一个 NSViewController 来调出第二个 NSViewController。

如果我向 firstViewController 添加一个按钮并向 secondViewController 添加一个 segue 然后当我选择该按钮时 secondViewController 出现就好了但是在一个单独的窗口中不是我想要的 NSWindowController 并且 firstViewController 没有得到已替换但保留在 NSWindowController 中。

所以我知道 segue 的想法会起作用,但它在代码中不起作用,当我从一个按钮插入 segue 时,它​​会起作用,但会插入一个不属于 NSWindowController 的单独的 NSViewController。

我正试图从 Apple 那里找到一些关于这个问题的编程指南,但到目前为止还没有成功。

这是我的 Storyboard 的概述:

这是我的 NSWindowController 的子类,func loginToMe2Team 是从 NSToolBar 触发的,它的工作只是在控制台上显示打印语句时找到。

import Cocoa

class me2teamWindowsController: NSWindowController {

@IBOutlet var mySignUp : NSToolbarItem!
@IBOutlet var myToolbar : NSToolbar!
let controller =  ViewController()

override func windowDidLoad() {
    super.windowDidLoad()
    print("window loaded")
}

override func windowWillLoad() {
    print("window will load")
}


@IBAction func logInToMe2Team(sender: AnyObject){

    controller.LogIn() //THIS IS THE FUNC I AM TESTING WITH

}

@IBAction func signUpToMe2Team(sender: AnyObject){

    controller.signUp()


}

这是我的 NSViewController 的子类,带有 func LogIn。它的选择很好,但 performSegueWithIdentifier 不是。我确实剪切并通过了标识符以绝对确保它是相同的。

import Cocoa
import WebKit

class ViewController: NSViewController {

@IBOutlet weak var theWebPage: WebView!
@IBOutlet weak var progressIndicator: NSProgressIndicator!

override func viewDidLoad() {
    super.viewDidLoad()

    let urlString = "https://thewebpage.com.au"
    self.theWebPage.mainFrame.loadRequest(NSURLRequest(URL: NSURL(string: urlString)!))
}

override func viewDidAppear() {
}

func LogIn() {
    print("I logged in")
    self.performSegueWithIdentifier("goToTeamPage", sender: self)
    //THIS IS THE BIT THATS NOT WORKING
}

func signUp() {
    print("I have to sign up now")
}

override var representedObject: AnyObject? {
    didSet {
    }
}

func webView(sender: WebView!, didStartProvisionalLoadForFrame frame: WebFrame!)
{
    self.progressIndicator.startAnimation(self)
}

func webView(sender: WebView!, didFinishLoadForFrame frame: WebFrame!)
{
    self.progressIndicator.stopAnimation(self)
}

}

最佳答案

您需要使用自定义的 segue 类(或者可能 NSTabViewController 如果它足以满足您的需求)。将 segue 的类型设置为 Custom,并指定您的类名:

...并实现它。没有动画,很简单:

class ReplaceSegue: NSStoryboardSegue {
    override func perform() {
        if let src = self.sourceController as? NSViewController,
           let dest = self.destinationController as? NSViewController,
           let window = src.view.window {
            // this updates the content and adjusts window size
            window.contentViewController = dest
        }
    }
}

在我的例子中,我正在使用一张工作表并想转换到另一张不同尺寸的工作表,所以我需要做更多的事情:

class ReplaceSheetSegue: NSStoryboardSegue {
    override func perform() {
        if let src = self.sourceController as? NSViewController,
           let dest = self.destinationController as? NSViewController,
           let window = src.view.window {
            // calculate new frame:
            var rect = window.frameRectForContentRect(dest.view.frame)
            rect.origin.x += (src.view.frame.width - dest.view.frame.width) / 2
            rect.origin.y += src.view.frame.height - dest.view.frame.height
            // don’t shrink visible content, prevent minsize from intervening:
            window.contentViewController = nil
            // animate resizing (TODO: crossover blending):
            window.setFrame(window.convertRectToScreen(rect), display: true, animate: true)
            // set new controller
            window.contentViewController = dest
        }
    }
}

关于xcode - 替换 Swift2 Storyboard MAC OSX 下的 NSViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33358549/

有关xcode - 替换 Swift2 Storyboard MAC OSX 下的 NSViewController的更多相关文章

  1. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  2. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  3. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  4. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  5. ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象 - 2

    假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl

  6. ruby - 如何搜索、递增和替换 Ruby 字符串中的整数子字符串? - 2

    我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/

  7. ruby - 改变替换的大小写 - 2

    我有以下内容:text.gsub(/(lower)(upper)/,'\1\2')我可以将\2替换为大写吗?类似于:sed-e's/\(abc\)/\U\1/'这在Ruby中可行吗? 最佳答案 查看gsub文档:str.gsub(模式){|匹配|block}→new_str在block形式中,当前匹配字符串作为参数传入,$1、$2、$`、$&、$'等变量将被适当设置。block返回的值将替换为每次调用的匹配项。"alowerupperb".gsub(/(lower)(upper)/){|s|$1+""+$2.upcase}

  8. ruby-on-rails - 在 rails 中分配/替换参数哈希 - 2

    我在RailsController操作中有下面的代码序列。在IF之前,params包含请求参数,正如预期的那样。在它之后,params为零。谁能解释一下这里发生了什么?iffalseparams={:user=>{:name=>"user",:comment=>'comment'}}end谢谢。 最佳答案 params其中包含请求参数实际上是一个方法调用,它返回包含参数的散列。你的params=行正在分配给一个名为params的局部变量.iffalse之后block,Ruby已经看到了本地params变量,所以当你引用params时

  9. ruby - gsub 替换不当 - 2

    我正在尝试使用gsub方法将电子邮件中的所有字母数字字符替换为“#”字符,但Ruby在“@”字符之前插入了一个反斜杠。例如:"john@doe.com".gsub(/[a-z0-9]/,"#")返回"###\#@###.###"而不是"####@###.###"。 最佳答案 它按预期返回"####@###.###",尝试:puts"john@doe.com".gsub(/[a-z0-9]/,"#")您在IRB/Pry中看到的是防止#@被解释为字符串插值。另请参阅下面@Stefan的非常有值(value)的评论。

  10. ruby - 不能将 `each` 的所有或大多数情况替换为 `map` 吗? - 2

    Enumerable#each和Enumerable#map的区别在于返回的是接收者还是映射后的结果。回到接收者是微不足道的,你通常不需要在each之后继续一个方法链,比如each{...}.another_method(我可能没见过这样的案例。即使你想回到接收者那里,你也可以通过tap来实现)。所以我认为所有或者大部分使用Enumerable#each的情况都可以用Enumerable#map代替。我错了吗?如果我是对的,each的目的是什么?map是否比each慢?编辑:我知道当您对返回值不感兴趣时​​使用each是一种常见的做法。我对这种做法是否存在不感兴趣,但感兴趣的是,除了从

随机推荐