如何在向前传递数据后将数据向后传递到视图控制器?

2023-12-19

我正在开发一个测验应用程序,并且在初始视图控制器之后出现第二个视图控制器,要求您回答问题。在第二个视图控制器上,用户必须按下按钮才能返回到初始视图控制器才能被问到另一个问题。然而,当我从第二个视图控制器返回时,我相信正在创建初始视图控制器的新实例,并且会向用户询问他们已经回答过的问题。我的初始视图控制器的 swift 文件中的代码是这样构建的:当用户被问到一个问题时,一旦该问题通过其索引从数组中删除。我怎样才能做到不通过第二个视图控制器的连接来创建初始视图控制器的新实例?或者有没有办法让第二个视图控制器可以访问与初始视图控制器相同的方法?

这是我的初始视图控制器的代码:

import UIKit

class ViewController: UIViewController {


var questionList = [String]()


func updateCounter() {

    counter -= 1
    questionTimer.text = String(counter)

    if counter == 0 {


        timer.invalidate()
        wrongSeg()
        counter = 15

    }



}


func randomQuestion() {



    //random question
    if questionList.isEmpty {
        questionList = Array(QADictionary.keys)

        questionTimer.text = String(counter)




    }






    let rand = Int(arc4random_uniform(UInt32(questionList.count)))
    questionLabel.text = questionList[rand]


    //matching answer values to go with question keys
    var choices = QADictionary[questionList[rand]]!

      questionList.remove(at: rand)



    //create button
        var button:UIButton = UIButton()

    //variables
    var x = 1
    rightAnswerBox = arc4random_uniform(4)+1


        for index in 1...4
        {



            button = view.viewWithTag(index) as! UIButton

            if (index == Int(rightAnswerBox))
            {
                button.setTitle(choices[0], for: .normal)

            }

            else {
                button.setTitle(choices[x], for: .normal)
                x += 1

            }


            randomImage()

        }
    }


let QADictionary = ["Who is Thor's brother?" : ["Atum", "Loki", "Red Norvell", "Kevin Masterson"], "What is the name of Thor's hammer?" : ["Mjolinr", "Uru", "Stormbreaker", "Thundara"], "Who is the father of Thor?" : ["Odin", "Sif", "Heimdall", "Balder"]]



//wrong view segue
func wrongSeg() {

   performSegue(withIdentifier: "incorrectSeg", sender: self)

}

//proceed screen
func rightSeg() {

    performSegue(withIdentifier: "correctSeg", sender: self)
}



//variables
var rightAnswerBox:UInt32 = 0
var index = 0



//Question Label
@IBOutlet weak var questionLabel: UILabel!

//Answer Button
@IBAction func buttonAction(_ sender: AnyObject) {

if (sender.tag == Int(rightAnswerBox))


{
    rightSeg()


    print ("Correct!")

}

    if counter != 0 {

        counter = 15
        questionTimer.text = String(counter)
    }
else if (sender.tag != Int(rightAnswerBox)) {

    wrongSeg()
print ("Wrong!")
    timer.invalidate()
    questionList = []

    }

   randomQuestion()

}

override func viewDidAppear(_ animated: Bool)
 {
randomQuestion()




}



//variables
var counter = 15

var timer = Timer()

@IBOutlet weak var questionTimer: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    timer = Timer.scheduledTimer(timeInterval: 1, target:self, selector: #selector(ViewController.updateCounter), userInfo: nil, repeats: true)


}

这是第二个视图控制器的代码:

import UIKit




 class ContinueScreen: UIViewController {




//correct answer label
@IBOutlet weak var correctLbl: UILabel!

//background photo
@IBOutlet weak var backgroundImage: UIImageView!

func backToQuiz() {

    if let nav = self.navigationController {
        nav.popViewController(animated: true)
        }
    else {

        self.dismiss(animated: true, completion: nil)
        }

    }

@IBAction func `continue`(_ sender: Any) {


    backToQuiz()
}

先生,您需要的是一个代表或一个放松的转场。我更喜欢代表,因为它们更容易理解,而且我认为它们更强大。

在您的ContinueScreen视图控制器中定义与此类似的协议:

protocol QuizCompletedDelegate {
    func completedQuiz()
    func canceledQuiz()
}

另外,在您的ContinueScreen视图控制器中,您需要声明QuizCompletedDelegate类型的可选委托

var delegate: QuizCompletedDelegate?

...并在适当的时候使用该委托调用函数:

@IBAction func didPressContinue(_ sender: Any) {
    if allQuestionsAnswered == true {
        delegate.completedQuiz()
    } else {
        delegate.cancelledQuiz()
    }
}

在初始视图控制器中,您可以实现协议的功能:

extension ViewController: QuizCompletedDelegate {
    func completedQuiz() {
        //Handle quiz complete
    }
    func cancelledQuiz() {
        //Handle quiz cancelled
    }
}

然后您需要做的最后一件事是在初始视图控制器的prepareForSegue 函数中设置Continue Screen 视图控制器的委托。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showContinueScreen" {
        let continueVC = segue.destination as! ContinueScreen
        continueVC.delegate = self
    }
}

在初始视图控制器的 ViewDidAppear 上删除对 randomQuestion() 的调用,然后您就可以开始工作了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在向前传递数据后将数据向后传递到视图控制器? 的相关文章

  • 如何在 Swift 中创建 UIAlertView?

    我一直在努力在 Swift 中创建 UIAlertView 但由于某种原因我无法得到正确的语句 因为我收到此错误 找不到接受提供的 init 重载 论点 我是这样写的 let button2Alert UIAlertView UIAlert
  • Swift 中的 viewWillLayoutSubviews

    我正在尝试翻译SKScene scene GameScene sceneWithSize skView bounds size 进入 swift 但我收到错误 sceneWithSize 不可用 使用对象构造 SKScene size 我在
  • iOS 13 检查 CLLocationManager 的临时授权状态

    根据 WWDC 视频 https developer apple com videos play wwdc2019 705 https developer apple com videos play wwdc2019 705 当你要求 Al
  • iOS WKWebView 处理文件下载

    我面临以下问题 在 Web 界面中 文件下载是通过锚标记触发的 如下所示 a href bla blabla a 虽然 Safari 浏览器可以处理此请求并打开一个对话框来处理文件 但 WKWebView 将此视为普通链接并且不对其执行任何
  • 如何组合两个 SwiftyJSON 对象

    我有一个 swiftyJSON 对象 例如 location http img http commentCount 0 timestamp 1432460217550 我希望能够向其附加另一个 swiftyJSON 对象 使其看起来像 lo
  • NSURLCache 不缓存

    我正在使用 Xcode 6 1 6A1030 iOS7 和 iOS8 模拟器 NSURLCache 似乎没有缓存任何东西 我使用 Cache Control 标头 我的服务器返回带有 max age 6000 的 Cache Control
  • Swift:协议、结构、类

    我开始学习 Swift 语言 但在理解协议 结构和类方面遇到了困难 我来自 Android 方面的编程 所以我相信 Swift 协议基本上是 Java 接口 其中每一个的正确用例是什么 这些类比并不 完全 正确 但这就是我所理解的要点 是的
  • 如何将自定义 C 代码放入 SwiftPM 包中?

    我正在尝试将 C 代码打包到 Swift 模块中 我们称之为CModule 一旦我将其放入项目的基本文件夹中 Swift模块 并配置了搜索路径 我可以在 Swift 文件中自动完成工作 并检测错误 警告 问题是 导入时它无法识别该模块 并且
  • 为 Swift 对象/属性设置观察者

    我一直在寻找一种在连接到 Mac 的显示器数量发生变化时触发方法的方法 我知道我可以获得 NSScreen screens count 的值 但我需要找到一种方法来在该值发生变化时创建通知或其他内容 或者指示所连接的显示器数量发生变化的其他
  • 将自定义图像设置为 UIBarButtonItem 但它不显示任何图像

    我想将自定义图像设置为 UIBarButtonItem 但它只显示周围的矩形框并且不显示实际图像 func setupBrowserToolbar let browser UIToolbar frame CGRect x 0 y 20 wi
  • 调用 SwiftUI 中位置 #11、#12 处的额外参数 [重复]

    这个问题在这里已经有答案了 我在 SwiftUI 中的切换开关上不断收到 调用中位置 11 12 处有额外参数 错误 我见过其他人有 调用中的额外参数 错误 但答案似乎没有帮助 另外 我的错误是 位置 11 12 我还没有看到其他人发生这种
  • 在 swift 中将简单字符串转换为 JSON 字符串

    我知道有一个同标题的问题here https stackoverflow com questions 30825755 convert string to json string in swift 但在那个问题中 他试图将字典转换为 JSO
  • 是否为 Core Data 的获取结果控制器实现委托

    实现四种委托方法有什么好处 void controllerWillChangeContent NSFetchedResultsController 控制器 void 控制器 NSFetchedResultsController 控制器 di
  • 可以获取位置,但无法获取航向

    我目前只使用模拟器 但我在 iOS 模拟器上快速使用 CoreLocation 时遇到问题 我得到此代码打印的位置更新 但从未得到标题 我不想当然 我正在尝试制作一个指南针类型的应用程序 它将显示目标的方位 class CompassVie
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 用于字数计算的 Swift String 中的字数

    我想做一个程序来找出字符串中有多少个单词 用空格 逗号或其他字符分隔 然后把总数加起来 我正在制作一个平均计算器 所以我想要数据总数 然后将所有单词相加 update Xcode 10 2 x Swift 5 或更高版本 使用基础方法enu
  • 如何将字符串日期转换为 NSDate?

    我想转换字符串 2014 07 15 06 55 14 198000 00 00 to an NSDate在斯威夫特 尝试这个 let dateFormatter NSDateFormatter dateFormatter dateForm
  • 致命错误:在字典中发现“地理编码地标”类型的重复键。 (Mapbox 地理编码器)

    我引用 这通常意味着要么该类型违反了 Hashable 的要求 要么此类字典的成员在插入后发生了变化 我正在使用 Mapbox Geocoder 当发生此运行时错误时 我的 XCode 将我带到线程 1 0 swift runtime on
  • init 中的 Swift 通用约束

    我有通用的 我希望能够用特定的约束来初始化它 约束仅用于初始化 班里的其他人并不关心 这是一个简化的示例 struct Generic
  • IPV6 快速可达性

    我是 swift 和 xcode 的新手 并且我的应用程序因 IPV6 而被拒绝 性能 2 1 当我们执行以下操作时 您的应用程序会在运行 iOS 9 3 5 并连接到 IPv6 网络的 iPad 和 iPhone 上崩溃 具体来说 当我们

随机推荐

  • android应用程序可以检查手机的版本吗

    我想编写一个使用动态壁纸的应用程序 仅版本 7 及更高版本支持此功能 应用程序是否可以检查 Android 手机的版本 并根据版本运行不同的代码 例如使用动态壁纸或静态背景 你有一个代码示例吗 这需要特殊权限吗 假设您需要 Android
  • 使用pauseOnConnect 通过 https 传递连接

    我正在使用pauseOnConnect选项开启net createServer 允许我将连接传递给我使用集群创建的工作人员 server net createServer pauseOnConnect true function conne
  • 使用Spring boot和javafx会消耗大量内存吗?

    我愿意在我的 JavaFX 应用程序中使用 Spring boot 技术 以获得其依赖注入的优势 但我想知道对内存的影响 因为你知道任何带有 组件 符号的类都会被加载到 MetaSpace 因为 Spring boot 会从中创建一个静态对
  • Laravel 的 5.3 通行证和 api 路线

    我正在使用 Laravel Framework 版本 5 3 9 新下载的内容没有通过作曲家添加任何内容 除了 laravel passport 1 0 我做了中建议的所有事情docs https laravel com docs mast
  • Visual Studio 2010 代码覆盖率 - 找不到由检测实用程序创建的备份文件

    我尝试在 VS 2010 中运行代码覆盖率 但遇到以下错误 不生成覆盖范围信息 代码覆盖率就地检测 无法完全备份二进制文件 MyProject dll 找不到由检测实用程序创建的备份文件 MyProject dll orig 检查为测试运行
  • 使用 PHP/MySQL 比较标签组以查找相似性/分数

    如何将一组标签与数据库中另一个帖子的标签进行比较以获取相关帖子 我想做的是将帖子上的一组标签与另一个帖子的标签进行比较 但不是每个标签单独 假设您想根据帖子中的标签获取真正相关的项目 然后从最相关到 最不相关的顺序显示它们 每次都必须显示三
  • 如何在 C# 中发出 HTTP 请求 [重复]

    这个问题在这里已经有答案了 我如何在 Windows 中用 C 发出卷曲请求或 我想使用此参数发出网络请求 它应该收到有效的响应 request curl http www1 bloomingdales com api store v2 s
  • Spark阶段交换的意义

    谁能解释一下我的 Spark DAG 中的 Spark 阶段中交换的含义 我的大部分阶段要么以交换开始 要么以交换结束 1 WholeStageCodeGen gt 交换 2 交换 gt WholeStageCodeGen gt SortA
  • 离散傅里叶变换:如何正确使用 fftshift 和 fft

    我想对 numpy 数组 Y 进行数值计算 为了进行测试 我使用高斯函数 Y exp x 2 符号 傅立叶变换为 Y 常数 exp k 2 4 import numpy X numpy arange 100 100 Y numpy exp
  • 如何重新启动流星

    If I close the browser tab and press Ctrl Z to exit the current running meteor process how do I start meteor again to re
  • 如何在 SQL Server 2008 中将图像字段中的 varbinary 值更新为 null?

    我上传了一张图像并存储到数据库的图像字段中 该图像存储为 0xFFD8FFE 当我尝试用 null 更新上面的内容时 出现了一个异常 数据类型 image 和 varbinary max 在等于运算符中不兼容 我想将上面的值更改为空 只需使
  • 基于唯一列的行求和 awk

    我正在寻找一种更优雅的方法来执行此操作 对于超过 100 列 awk a 1 4 b 1 5 c 1 6 d 1 7 e 1 8 f 1 9 g 1 10 END for i in a print i a i b i c i d i e i
  • 如何在MS Word中自定义引文样式?

    要在 MS Word 中创建自定义引文样式 我按照此网页中的说明进行操作https msdn microsoft com en us vba word vba articles create custom bibliography styl
  • 显示一个元素并在 1 秒后隐藏它

    我有以下元素 div class text hide Hello SO div 我用 jQuery 展示它 如下所示 text addClass show removeClass hide So my div 是表演 我现在希望它在 1 秒
  • 切换到较新版本的 android ndk 时未定义的模块

    我正在尝试从 ndk r11c 升级到 ndk r14 当我运行 r14 时 出现错误 Android NDK 模块 myJNI 依赖模块 png jpeg log 在我的 Android 版本中 LOCAL SHARED LIBRARIE
  • setcookie() 不会在 Google Chrome 中设置 cookie

    我正在阅读一些有关如何设置 cookie 的 PHP 教程 我注意到 cookie 在 FF4 和 IE9 上成功设置 但在 Chrome 11 0 696 60 中没有设置 PHP 文件由 XAMPP localhost 提供 我尝试了
  • 使用脚本或工具仅获取 HTML 元素

    我正在尝试获取大量状态信息 这些信息在网站中编码 主要在 head gt 元素内 我知道我可以使用wget or curl或 python 获取整个页面 但我不想给服务器带来太多不必要的压力 页面本身相当大 复杂 有没有什么方法可以只获取头
  • 出现错误“需要左值作为赋值的左操作数”

    我是 C 新手 在编译简单代码时遇到以下问题 include
  • 如何使用 font-face 缩小 CSS

    我有一个带有字体的样式表 当我使用在线服务缩小 CSS 时 字体停止工作 我采取的方法是提取 font face 代码 缩小 css 的其余部分 然后将 font face 粘贴到缩小后的样式表的顶部 好奇是否有人对此有更好的方法 我使用此
  • 如何在向前传递数据后将数据向后传递到视图控制器?

    我正在开发一个测验应用程序 并且在初始视图控制器之后出现第二个视图控制器 要求您回答问题 在第二个视图控制器上 用户必须按下按钮才能返回到初始视图控制器才能被问到另一个问题 然而 当我从第二个视图控制器返回时 我相信正在创建初始视图控制器的