我基本上是在尝试重新创建 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)模式,您:
创建一个协议(protocol)来指定您的委托(delegate)类必须实现的功能,通常我在委托(delegate)类之上执行此操作,所以 MainVC。
protocol UsersListDelegate: class {
func newConversationCreated(withUser user: AnyObject)
}
让您的委托(delegate)类 (MainVC) 符合协议(protocol)并实现所需的功能
class MainVC: UIViewController, UsersListDelegate {
func newConversationCreated(withUser user: AnyObject) {
//I'll fill this in later in my answer
}
}
在 UsersListVC 中创建一个变量来保存委托(delegate)类
class UsersListVC: UIViewController {
weak var delegate: UsersListDelegate!
}
当您从 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 函数来:
例如
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/
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我在我的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服务器更新战俘
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我正在尝试编写一个将文件上传到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
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
这里有一个很好的答案解释了如何在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返回它复制的字节数,但是当我还没有下
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的