我有一个应用程序,在故事板上创建了21个按钮,然后这些按钮允许用户选择播放器。这些按钮是通过编程方式创建的,并且具有用于设置其格式的类。
//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个按钮,这在理论上是可行的,但是由于我的按钮的backgroundColor清除了显示下方的旧按钮。
理论:我想我还是应该不只是加载图层和按钮的图层?
但是我无法在任何地方找到以编程方式重置应用程序的选项,就像刚加载时一样,或者清除现有按钮,以便我可以创建更多按钮。
问题:有人可以指出正确的方向来进行应用重置或类似的过程吗?
非常感谢
Kev
[创建reset
方法,首先从视图中删除所有可能的选择按钮。
func reset() {
let ksPickButtons = view.subviews.filter{$0 is KSPickButton}
ksPickButtons.forEach{$0.removeFromSuperview()}
// code to create the buttons
}
或更短
func reset() {
view.subviews.filter{$0 is KSPickButton}
.forEach{$0.removeFromSuperview()}
// code to create the buttons
}
然后将其他代码从viewDidLoad
移到reset
,并从viewDidLoad
以及其他任何位置调用该方法。
旁注:
您不得自称任何包含will
,did
和should
的委托方法。这些方法仅由框架调用。
您应该只在情节提要板上添加按钮并创建IBOutlet才能通过代码访问它们,或者不要在情节提要中添加任何按钮并仅使用代码创建并添加它们。我不确定您要完成什么,很遗憾,我无法就此提供很多建议,除了(通常)仅坚持故事板或仅以编程方式创建UI(通常)是一个好主意。我自己更喜欢后者)。
两种方法都可以直接回答您的问题,真正“重置”视图控制器的唯一方法是创建一个新的视图控制器,并用新的视图控制器替换旧的视图控制器(因此,现有的视图控制器实际上没有任何类型的重置方法)。如果您不想创建一个新的viewcontroller,那么您唯一可以做的就是自己手动清理所有内容,我将举一个如何清理按钮的示例:
func removeAllPickButtons() {
let buttons = view.subviews.compactMap({ $0 as? KSPickButton })
buttons.forEach({ $0.removeFromSuperview() })
}
此方法将直接在您的viewcontroller中的所有视图(因此只有1层深度)过滤到仅KSPickButtons(compactMap),然后循环遍历所有视图以将其从其超级视图中删除(forEach)