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
以及任何其他地方调用该方法。
旁注:
您不得调用自己任何包含 will
、did
和 should
的委托方法。这些方法由框架专门调用。
您应该只在情节提要上添加按钮并创建 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 )
我有一个在故事板上创建 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
以及任何其他地方调用该方法。
旁注:
您不得调用自己任何包含 will
、did
和 should
的委托方法。这些方法由框架专门调用。
您应该只在情节提要上添加按钮并创建 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 )