Xcode:重置App和所有变量和类

Xcode: Reset App and all variables and classes

我有一个在故事板上创建 21 个按钮的应用程序,然后这些按钮允许用户选择 players.The 按钮以编程方式创建并具有设置其格式的 class。

//run 2 loops to dsip;ay the buttons (21 of them)
    for j in 0...2 {
    for i in 0...6 {
     //use the CLASS KSPIckButton to format the buttons
     let buttonOne:UIButton = KSPickButton(frame: CGRect(x: (j + 1) * 35 + (j * 80), y: (i + 5) * 35 + buttonSet, width: 110, height: 30))


    //Add the button to the storyboard
    self.view.addSubview(buttonOne)


        buttonOne.addTarget(self,
        action: #selector(playerButtons),
        for: .touchUpInside)
    //assign the tag to the button
    buttonOne.tag = playerNo
    //Give the buttons the players names
    buttonOne.setTitle(allPlayers[playerNo], for: .normal)

问题: 用户可以选择 10 个名字,然后决定重新设置.....

我试过: 我从一个动作按钮 运行 viewDidLoad() ,它会在已经存在的 21 个按钮之上加载另外 21 个按钮,这在理论上是可行的,但是由于我的按钮的背景颜色很清楚,下面显示的旧按钮。

理论: 我猜我不应该只是加载一层又一层的按钮?

但我在任何地方都找不到以编程方式重置应用程序的选项,就像刚刚加载一样,或者清除现有按钮以便我可以创建更多按钮。

问题: 有人可以为我指明应用重置或类似过程的正确方向吗?

非常感谢

Kev

创建一个 reset 方法并首先从视图中删除所有可能的选择按钮。

func reset() {
    let ksPickButtons = view.subviews.filter{[=10=] is KSPickButton}
    ksPickButtons.forEach{[=10=].removeFromSuperview()}

    // code to create the buttons
}

或更短

func reset() {
    view.subviews.filter{[=11=] is KSPickButton}
                 .forEach{[=11=].removeFromSuperview()}

    // code to create the buttons
}

然后将其他代码从 viewDidLoad 移动到 reset 并从 viewDidLoad 以及任何其他地方调用该方法。

旁注:

您不得调用自己任何包含 willdidshould 的委托方法。这些方法由框架专门调用。

您应该只在情节提要上添加按钮并创建 IBOutlets 以在代码中访问它们,或者不要在情节提要中添加任何按钮并仅使用代码创建和添加它们。我不确定你想要完成什么,所以不幸的是我不能给你很多关于这个的建议,除此之外,(通常)坚持只使用故事板或只以编程方式创建 UI(而我自己更喜欢后者)。

无论哪种方式,要直接回答您的问题,真正 'reset' 一个 viewcontroller 的唯一方法是创建一个新的 viewcontroller 并将旧的替换为新的(所以在现有 viewcontroller 上实际上没有任何类型的重置)。如果你不想创建一个新的 viewcontroller 那么你唯一能做的就是自己手动清理所有东西,我会给你一个如何清理你的按钮的例子:

func removeAllPickButtons() {
        let buttons = view.subviews.compactMap({ [=10=] as? KSPickButton })
        buttons.forEach({ [=10=].removeFromSuperview() })
    }

此方法将直接位于 viewcontroller 中的所有视图(因此只有 1 层深)过滤为仅 KSPickButtons (compactMap),然后遍历所有视图以将它们从它们的超级视图中删除(forEach )