草庐IT

ios - NavigationController 不会从函数调用 + swift 推送

coder 2023-09-07 原文

我基本上是在尝试重新创建 whatsapp。我的 MainVC 有一个显示所有当前对话的 TableView,并有一个到 ChatVC 的推送转接以显示整个对话。

当用户想要开始新的对话时,他们点击右上角的按钮,UserListVC 从底部出现并显示用户列表。

我的想法是,当用户单击用户时,“UsersListVC”会消失(显示 mainVC)并调用一个函数来打开 ChatVC。但是,在从 MainVC 中删除后,我无法成功调用函数。

请不要现在我没有推送任何数据我只是想让 segues 正常工作

MainVC.swift

func showChatVC() {

    print("FUnction called")
    let showChat = ChatVC()
    navigationController?.pushViewController(showChat, animated: false)

}

UsersListVC.swift

       func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            dismiss(animated: true) { 
                MainVC().showChatVC()
            }
        }

我尝试了几种不同的变体,但我似乎根本无法调用 MainVC 中的函数。我的想法是不是太固执了,以这种方式进行转场?我应该直接从 UsersListVC 到 ChatVC 吗

最佳答案

这里有很多答案,我认为我应该使用委托(delegate)模式来解决这些类型的问题。

通过委托(delegate),您可以从 UsersListVC 调用 MainVC 中的函数,这使得转至 ChatVC 变得更加容易,并且在您将所选用户传递给 ChatVC 时也会有所帮助。

要制作委托(delegate)模式,您:

  1. 创建一个协议(protocol)来指定您的委托(delegate)类必须实现的功能,通常我在委托(delegate)类之上执行此操作,所以 MainVC。

    protocol UsersListDelegate: class {
    
        func newConversationCreated(withUser user: AnyObject)
    
    }
    

  1. 让您的委托(delegate)类 (MainVC) 符合协议(protocol)并实现所需的功能

    class MainVC: UIViewController, UsersListDelegate {
    
        func newConversationCreated(withUser user: AnyObject) {
    
            //I'll fill this in later in my answer
    
        }
    
    }
    

  1. 在 UsersListVC 中创建一个变量来保存委托(delegate)类

    class UsersListVC: UIViewController {
    
        weak var delegate: UsersListDelegate!
    
    }
    

  1. 当您从 MainVC 呈现 UsersList 时,将委托(delegate)变量设置为 MainVC(自身),例如,如果您转至 UsersList,则可以在准备转场时完成此操作。

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    
        if let destination = segue.destination as? UsersListVC {
    
            destination.delegate = self
    
        }
    
    }
    

    或者如果你在没有 segue 的情况下呈现它:

    func presentUsersList() {
    
        let userListsVC = UsersListVC()
        userListsVC.delegate = self
        self.present(userListsVC, animated: true)
    
    }
    

您的委托(delegate)模式现已完成。要在您想要创建新对话并关闭 UserListsVC 时调用委托(delegate)函数,您可以这样做

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        delegate.newConversationCreated(withUser: /*Your User Object*/)

    }

并且在 MainVC 中,您可以实现 newConversationCreated 函数来:

  • 关闭用户列表
  • 创建 ChatVC
  • 将用户传递给 ChatVC
  • 出席 ChatVC

例如

    func newConversationCreated(withUser user: AnyObject) {

        dismiss(animated: true) { 

            let showChat = ChatVC()
            showChat.user = user
            navigationController?.pushViewController(showChat, animated: false)

        }

    }

附注从 MainVC 调用 dismiss 似乎很奇怪,但这实际上是 apple 的最佳实践(请参阅此 question 中的答案以了解原因)。它会关闭 UserLists,不用担心。

关于ios - NavigationController 不会从函数调用 + swift 推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39989561/

有关ios - NavigationController 不会从函数调用 + swift 推送的更多相关文章

  1. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

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

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

  6. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  7. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  8. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  9. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  10. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

随机推荐