2017-06-30 188 views
0

我已經搜索了各種源代碼,並找不到一個清晰和簡單的解決方案,用於在iOS應用程序中使用Xcode 8.3在Swift 3中創建單選按鈕組的等效項。單選按鈕組Swift 3 Xcode 8

例如,如果我在一個組中有3個按鈕,並且一次只能選擇一個按鈕。目前,我正在通過將組中的2個按鈕的狀態更改爲在選擇另一個按鈕時不選擇,反之亦然。

@IBAction func buttonA(_ sender: Any) { 
    buttonB.isChecked = false 
    buttonC.isChecked = false 
} 

@IBAction func buttonB(_ sender: Any) { 
    buttonA.isChecked = false 
    buttonC.isChecked = false 
} 

@IBAction func buttonC(_ sender: Any) { 
    buttonA.isChecked = false 
    buttonB.isChecked = false 
} 

但是我期望一個更有效的方法來做到這一點。

任何有關更高效解決方案的幫助將不勝感激。

+0

你的問題的一切都是關於macOS,但你已經標記了你的問題iOS。你的意思是? – rmaddy

+0

我明白你的意思,我錯誤地混淆了文檔。我的意思是iOS。爲了清楚起見,我正在努力尋找一種爲iOS應用程序創建單選按鈕組的簡單方法。 –

+1

iOS中沒有本機單選按鈕(或收音機組)。你應該用相關信息更新你的問題。 – rmaddy

回答

0

您可以將所有按鈕的IBAction連接到一種方法。

@IBAction func buttonClick(_ sender: UISwitch) { // you're using UISwitch I believe? 

} 

您應該添加所有的按鈕到一個數組:

// at class level 
var buttons: [UISwitch]! 

// in viewDidLoad 
buttons = [buttonA, buttonB, buttonC] 

然後,寫一個buttonClick方法是這樣的:

buttons.forEach { $0.isChecked = false } // uncheck everything 
sender.isChecked = true // check the button that is clicked on 

替代方案:

嘗試使用UITableView 。每行包含一個選項。選擇一行時,將該行的accessoryType更改爲.checkMark,將其他行更改爲.none

如果你太懶惰,請嘗試搜索cocoapods.org,看看其他人做了什麼。

+0

謝謝。我已經編輯了我的原始問題,以明確指出我指的是iOS。事實上,我混淆了文檔。 –

+0

@ChrisHerbst編輯。 – Sweeper

0

根據您的用戶界面,您可以採取多種方法。

UITableView - 使用UITableView加上覆選標記裝飾器。如果這些單選按鈕的佈局相當傳統,這是正確的範例。如果佈局是網格而不是列表,則可以使用UICollectionView

您可以使用func table(_ table: WKInterfaceTable, didSelectRowAt rowIndex: Int)中的UITableViewDelegate來捕獲選擇。當您想要提交更改以確定選定哪個單元格時,可以在tableView上調用indexPathForSelectedRow

蘋果的UITableView的教程,可以發現:

https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/CreateATableView.html


管理一組UIButtons的 - 你可以存儲到UIButton的對象是你的單選按鈕的部分引用數組組。

protocol RadioButtonDelegate: class { 
    func didTapButton(_ button: UIButton) 
} 

class RadioButtonGroup { 
    private var buttons: [UIButton] = [] 
    weak var delegate: RadioButtonDelegate? 

    var selectedButton: UIButton? { return buttons.filter { $0.isSelected }.first } 

    func addButton(_ button: UIButton) { 
     buttons.append(button) 
    } 

    @objc private func didTapButton(_ button: UIButton) { 
     button.isSelected = true 

     deselectButtonsOtherThan(button) 

     delegate?.didTapButton(button) 
    } 

    private func deselectButtonsOtherThan(_ selectedButton: UIButton) { 
     for button in buttons where button != selectedButton { 
      button.isSelected = false 
     } 
    } 
} 

class MyView: UIView { 
    private var radioButtonGroup = RadioButtonGroup() 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     let button1 = UIButton(type: .custom) 
     button1.setTitle("Eeeny", for: .normal) 
     let button2 = UIButton(type: .custom) 
     button2.setTitle("Meeny", for: .normal) 
     let button3 = UIButton(type: .custom) 
     button3.setTitle("Miny", for: .normal) 

     self.radioButtonGroup.addButton(button1) 
     self.radioButtonGroup.addButton(button2) 
     self.radioButtonGroup.addButton(button3) 

     addSubview(button1) 
     addSubview(button2) 
     addSubview(button3) 
    } 
} 
0

在IB只是要爲所有三個按鈕的touchUpInside事件正常狀態,radio_on像一個選擇,並設置radio_off圖像選中狀態,那麼只有你有btnClicked方法連接到所有按鈕的touchUpInside事件

class ViewController: UIViewController { 

@IBOutlet weak var btnFirst:UIButton! 

@IBOutlet weak var btnSecond:UIButton! 

@IBOutlet weak var btnThird:UIButton! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func btnClicked(sender:UIButton){ 

    let buttonArray = [btnFirst,btnSecond,btnThird] 

    buttonArray.forEach{ 

     $0?.isSelected = false 

    } 

    sender.isSelected = true 

}