【问题标题】:How to concatenate arrays when button is selected选择按钮时如何连接数组
【发布时间】:2017-11-13 13:28:19
【问题描述】:

所以我正在开发一个测验应用程序,我想在开始测验之前给用户一个选项屏幕,用户可以在其中选择测验应该有哪些类别。

它目前一次只能处理 1 个类别,但我希望能够在用户选择选项屏幕中的按钮时连接 questionArrays。

此时,用户选择一个按钮,根据 sender.tag,一个 Int 将通过名为“pickedCategory”的 var 传递,然后该变量决定问题基于哪个数组。这发生在为 segue 做准备时:

    let selectedCategory = quizCategories[pickedCategory]
    secondVC.allQuestions = selectedCategory.questions

quizCategories 在顶部声明:

    var quizCategories = [QuestionArray]() 

我想做的是4个按钮,只要选择一个,就会将数组连接到所选的类别

例如,选择按钮 1 和 2,即用户希望根据 2 个类别提出问题。结果是这样的?

let selectedCategory = quizCategories[0].questions + quizCategories[1].questions

如果选择了 3 个按钮,则将另一个 quizCategories 数组添加到最终数组等中

请注意,我正在寻找的不是如何连接,而是如何根据选择的按钮自动执行此操作..

这是我发布的第一个问题,我对 Swift 很陌生。希望我没有让你们感到困惑。谢谢 :)

【问题讨论】:

  • 我已经读过了,这不是我要找的……连接部分没问题,我或多或少知道不同的类型以及如何使用它们……但我不是足够熟练地弄清楚如何根据选择的按钮自动完成它..
  • 听起来你需要一个切换按钮,创建一个@IBAction,然后根据按钮的切换状态触发连接。
  • 我有可选择的按钮和链接的 IBActions。触发部分是我需要帮助的......你能给我一个具体的例子吗?正如我在问题中提到的那样,我试图让它与所选按钮的不同组合一起工作,然后将其传递给为 segue 做准备

标签: ios arrays swift concatenation


【解决方案1】:

我的建议是对于每个类别按钮,通过在 categoryID 数组中添加或删除来跟踪选择了哪个(如果用户决定不想要该类别,甚至取消选择)。然后,一旦“完成”按钮(或任何最终决定按钮被点击),获取他们选择的 categoryID 数组,并对其进行 flatMap 以产生最终的问题数组。

let questions = categoryIDs.flatMap { quizCategories[$0].questions }

现在,您需要向用户展示一系列问题。使用 flatMapmap,因为您希望将返回的数组数组展平为单个数组。

【讨论】:

  • 函数式编程很好用,但我怀疑这超出了不知道如何将选定数组连接在一起的人的理解范围。
  • 谢谢!这正是我想要的!
【解决方案2】:

标签不是识别按钮的最佳方式,但我会忽略它。

不要使用按钮,使用 UISwitches。每个类别都有一个开关。

假设你有一个常量 switchTagBase,值为 100:

let switchTagBase = 100

所以你的第一个类别的开关有一个标签 100,下一个有一个标签 101,等等。

您已经有一个类别数组,这很好。

现在,当您需要构建一系列选定的问题时,只需浏览类别,找出打开了哪些开关,然后添加这些类别

var selectedCategories = [QuestionArray]() 
for (index, array) in quizCategories.enumerated() {
  let thisTag = index + switchTagBase
  guard let thisSwitch = view.viewWithTag(thisTag),
    thisSwitch.isOn else { continue }
  selectedCategories += quizCategories[index]
}

(请注意,您实际上应该根据用户激活的开关维护一个选择状态数组,并遍历该数组而不是直接循环通过开关,但为了简洁起见,我直接获取了开关状态。)

【讨论】:

    【解决方案3】:

    您可以跟踪选择了哪个按钮以及何时开始测验,连接相应的数组。

    您的代码可能如下所示:

    import UIKit
    
    class QuizzSelection: UIViewController
    {
      @IBAction func firstButtonAction(_ sender: Any)
      {
        firstButtonWasClicked()
      }
    
      @IBAction func secondButtonAction(_ sender: Any)
      {
        secondButtonWasClicked()
      }
    
      @IBAction func goForwardWithQuizz(_ sender: Any)
      {
        startQuizzWasClicked()
      }
    
      var isFirstCategorySelected = false
      var isSecondCategorySelected = false
      let firstCategoryQuestions = ["Question Cat 1"]
      let secondCategoryQuestions = ["Question Cat 2"]
      var emptyArrayOfQuestions = [String]()
    
      func firstButtonWasClicked()
      {
        if isFirstCategorySelected == true{
          isFirstCategorySelected = false
        } else{
          isFirstCategorySelected = true
        }
      }
    
      func secondButtonWasClicked()
      {
        if isSecondCategorySelected == true{
          isSecondCategorySelected = false
        } else{
          isSecondCategorySelected = true
        }
      }
    
      func startQuizzWasClicked()
      {
        if isFirstCategorySelected == true{
          emptyArrayOfQuestions += firstCategoryQuestions
        }
        if isSecondCategorySelected == true{
          emptyArrayOfQuestions += secondCategoryQuestions
        }
      }
    }
    

    编辑

    改进了六个类别的代码:

    import UIKit
    
    class QuizzSelection: UIViewController
    {
      @IBAction func firstButtonAction(_ sender: Any)
      {
        firstButtonWasClicked()
      }
    
      @IBAction func secondButtonAction(_ sender: Any)
      {
        secondButtonWasClicked()
      }
    
      // Four mour button actions
    
    
      @IBAction func goForwardWithQuizz(_ sender: Any)
      {
        startQuizzWasClicked()
      }
    
    
      var wichCategoryAreSelected = [false, false, false, false, false, false] //six categories
      var arrayOfQuestions = [["Question 1 Cat 1","Question 2 Cat 1"], ["Question 1 Cat 2", "Question 2 Cat 2"], ...]
      var emptyArrayOfQuestions = [String]()
    
    
      func firstButtonWasClicked()
      {
        wichCategoryAreSelected[0] = !wichCategoryAreSelected[0]
      }
    
      func secondButtonWasClicked()
      {
        wichCategoryAreSelected[1] = !wichCategoryAreSelected[1]
      }
    
      func startQuizzWasClicked()
      {
        for i in 0...(wichCategoryAreSelected.count-1)
        {
          if wichCategoryAreSelected[i]
          {
            emptyArrayOfQuestions += arrayOfQuestions[i]
          }
        }
      }
    
    }
    

    【讨论】:

    • 这个问题是,假设有 6 个不同的类别会导致很多 if else 语句,因为您将有很多不同的所选类别组合?
    • 你是对的。该答案的目的不是提高效率,而是易于理解。你的问题提到了4个类别。但是,这段代码很容易改进:(i) 函数 firstButtonWasClicked() 可以写成一行,(ii) startQuizzWasClicked() 也可以写成循环。
    • 如何手动或以编程方式创建按钮?你认为你最多有多少?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多