例如,我們有分段控制元件和按鈕陣列。如果我們在一個片段中選擇一個按鈕 - 按鈕需要保存狀態,然后我們移動到另一個片段并選擇另一個按鈕。但是如果我們回到上一個按鈕 - 它應該在我們之前選擇的位置。也就是說,每個段都必須存盤按鈕的狀態。如何做得更好?
struct SegmentsModel {
let title: String
var answered: Bool
var buttonIndex: Int? = nil
}
@objc private func buttonsTapped(_ sender: UIButton) {
let _ = buttons.map({$0.isSelected = false})
sender.isSelected = true
guard let index = buttons.firstIndex(of: sender) else { return }
switch index {
case 0:
selectedSegment(segmentedControl, buttonSelected: true, indexButton: 0)
case 1:
selectedSegment(segmentedControl, buttonSelected: true, indexButton: 1)
case 2:
selectedSegment(segmentedControl, buttonSelected: true, indexButton: 2)
case 3:
selectedSegment(segmentedControl, buttonSelected: true, indexButton: 3)
default:
break
}
}
@objc private func selectedSegment(_ sender: UISegmentedControl,
buttonSelected: Bool, indexButton: Int) {
let currentIndex = sender.selectedSegmentIndex
if buttonSelected == true {
buttons[indexButton].isSelected = true
} else {
let _ = buttons.map({$0.isSelected = false})
}
switch currentIndex {
case 0:
arrayOfSegments[0].answered = buttonSelected
arrayOfSegments[0].buttonIndex = indexButton
case 1:
arrayOfSegments[1].answered = buttonSelected
arrayOfSegments[1].buttonIndex = indexButton
case 2:
arrayOfSegments[2].answered = buttonSelected
arrayOfSegments[2].buttonIndex = indexButton
default:
break
}
}

uj5u.com熱心網友回復:
正如我在評論中提到的,有很多方法可以實作你想要的。我將與您分享一個想法。
我看到您試圖將所有按鈕存盤在一個陣列中,并且必須不斷回圈它們以確定之前選擇了哪個按鈕。既然你希望代碼有更簡單的邏輯,我會給你一個不同的想法。
實作您想要的一種方法是使用標簽。每個 UIView 物件都有一個標簽,默認設定為 0。
使用情節提要,我將按鈕的標簽設定為 100、101、102、103,這也可以通過編程方式完成。

你可以選擇任何你喜歡的整數,但重要的是給它們一些唯一的數字,這樣當你嘗試按標簽獲取視圖時,你只會得到你想要的視圖。
所以設定標簽后,這就是我在代碼中更新的內容。
struct SegmentsModel {
let title: String
var answered = false
var buttonIndex: Int? = nil
{
// Auto-update the value of answered when value of buttonIndex changes
didSet
{
answered = buttonIndex != nil
}
}
}
我在這里沒有做任何重大更新。我只添加了一個屬性觀察器,所以當按鈕索引被設定時,被回答的變數也是自動設定的,所以你不必為此做任何事情
接下來,下面是管理段和按鈕的所有邏輯。我將 UIViewController 與 StoryBoard 一起使用,因此您可能需要忽略某些內容。所有重要的代碼都有注釋,因此您可以跟進。
class ViewController: UIViewController {
// I will store the results in this array
var storedResults: [SegmentsModel] = []
// Segment control outlet
@IBOutlet weak var segmentControl: UISegmentedControl!
// Array of buttons
@IBOutlet var buttons: [UIButton]!
override func viewDidLoad() {
super.viewDidLoad()
// Loop over all segments
for index in 0 ..< segmentControl.numberOfSegments
{
// Initialize and store default results values in storedResults array
if let segmentTile = segmentControl.titleForSegment(at: index)
{
storedResults.append(SegmentsModel(title: segmentTile))
}
}
}
// Segment action
@IBAction func selectedSegment(_ sender: UISegmentedControl)
{
// Update the UI of buttons
reloadButtons()
}
@IBAction func buttonTapped(_ sender: UIButton)
{
// Reset your buttons
let _ = buttons.map({$0.isSelected = false})
// Set the current button to selected
sender.isSelected = true
// Get the current result so we can update it
var currentResult = storedResults[segmentControl.selectedSegmentIndex]
// Update the current segments selected button index using tag
currentResult.buttonIndex = sender.tag
// Put the result back into the array as structs as value types
storedResults[segmentControl.selectedSegmentIndex] = currentResult
}
// Reload button data
private func reloadButtons()
{
// Reset your buttons
let _ = buttons.map({$0.isSelected = false})
let currentResult = storedResults[segmentControl.selectedSegmentIndex]
// Check if current index has a selected button and if it does retrieve it
// with a tag
if let selectedButtonIndex = currentResult.buttonIndex,
let selectedButton = view.viewWithTag(selectedButtonIndex) as? UIButton
{
// Show the selected button in the UI
selectedButton.isSelected = true
}
}
}
最終結果可以在這個 youtube 視頻中看到,我相信這就是你想要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/414246.html
標籤:
