Swift 3 无法使用 UIWindow 调用函数

Posted

技术标签:

【中文标题】Swift 3 无法使用 UIWindow 调用函数【英文标题】:Swift 3 Can't get function called with UIWindow 【发布时间】:2017-08-11 17:53:07 【问题描述】:
    let PostButton: UIButton = 
    let pB = UIButton(type: .system)
    pB.setTitle("Post", for: .normal)
    pB.titleLabel!.font = UIFont(name: "Arial Rounded MT Bold", size:18)
    pB.setTitleColor(UIColor .green, for: .normal)
    pB.translatesAutoresizingMaskIntoConstraints = false
    pB.addTarget(self, action: #selector(postingTextPost), for: .touchUpInside)
    return pB
()


func postingTextPost()

...



func setupTextWindow()

    let window: UIWindow = UIApplication.shared.keyWindow!

    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = window.bounds
    blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    window.addSubview(blurEffectView)

    window.addSubview(PostBarContainer)
    window.addSubview(PostBar)
    window.addSubview(PostButton)

    PostBarContainer.centerXAnchor.constraint(equalTo: window.centerXAnchor).isActive = true
    PostBarContainer.bottomAnchor.constraint(equalTo: window.centerYAnchor).isActive = true
    PostBarContainer.widthAnchor.constraint(equalTo: window.widthAnchor).isActive = true
    PostBarContainer.heightAnchor.constraint(equalToConstant: 50).isActive = true

    PostBar.bottomAnchor.constraint(equalTo: PostBarContainer.bottomAnchor).isActive = true
    PostBar.widthAnchor.constraint(equalTo: PostBarContainer.widthAnchor, constant: -80).isActive = true
    PostBar.heightAnchor.constraint(equalTo: PostBarContainer.heightAnchor).isActive = true

    PostButton.bottomAnchor.constraint(equalTo: PostBarContainer.bottomAnchor).isActive = true
    PostButton.widthAnchor.constraint(equalToConstant: 90).isActive = true
    PostButton.rightAnchor.constraint(equalTo: PostBar.rightAnchor, constant: 80).isActive = true
    PostButton.heightAnchor.constraint(equalTo: PostBarContainer.heightAnchor).isActive = true

     

我在UIViewController 中有一些代码来执行发布功能。但是,在UIWindow 中,我无法将该函数称为“它可能是有史以来最小的问题”。该函数也在viewcontroller 中。它与函数无关,只是没有通过 PostButton 上的#selector 调用。

我知道我在这里缺少一些东西,但就在键窗口内执行功能而言,最佳做法是什么?我知道无论如何都不应该将所有东西都扔到视图控制器中,但是,是的,对于一些建议/提示也很有用!

【问题讨论】:

请尝试像这样添加目标:pB.addTarget(self, action: "postingTextPost", for: .touchUpInside) @user1000 是的,Xcode 将其更正为:pB.addTarget(self, action: #selector(postController.postingTextPost), for: .touchUpInside)。还是没有运气 这段代码你是在哪个班级写的? @user1000 postController 您这样做的目的是什么?你为什么用这样的窗口?你试过用视图代替吗?我认为你不应该像这样使用 UIWindow 【参考方案1】:

是按钮的动作没有被识别,还是只是没有调用正确的函数?

如果无法识别来宾,那么我认为这与作为 UIViewController 的父视图有关,而不是与 UIWindow 有关。您正在初始化按钮并添加将父级设置为“self”的访客识别器。在这种情况下,Self 是 UIViewController,而实际上父视图需要是 UIWindow。我建议将 window 更改为类级别常量,然后将您的客人识别行更改为

pB.addTarget(window, action: #selector(postingTextPost), for: .touchUpInside)

【讨论】:

嘿,谢谢你的回答,但是关于你所说的。正在识别手势,按钮正在工作,但未调用选择器。我尝试了这个错误和错误,所以我认为我们现在正在到达某个地方!由于未捕获的异常'NSInvalidArgumentException',它引发了终止应用程序的异常,原因:'-[UIWindow postTextPost]:无法识别的选择器发送到实例 0x7f86a9709480' @zak 哦,天哪,我很惊讶我错过了这个,选择的需要指向一个函数,所以我认为错误是你忘记了函数上的括号。将选择器替换为 #selector(postingTextPost()) 是的,仍然没有运气伙伴,它正在找到该函数,但在运行它时没有调用它。还没有解决这个问题,真的很烦。

以上是关于Swift 3 无法使用 UIWindow 调用函数的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中从 AppDelegate 解开 UIWindow 两次

Swift - 将新的 UIWINdow 定位在屏幕中心

在iOS上没有调用sceneDidEnterBackground,swift

我想在 Swift 项目中创建一个新的 UIWindow,但是出了点问题

Swift 3.0 迁移后的 Project-Swift.h 文件编译相同函数数百次,编译耗时 7 分钟

Swift - 以编程方式创建视图问题,无法找到存储的属性