web-dev-qa-db-ja.com

選択すると、iOSの配列を持つuitableviewセクションの無線の選択が解除されますswift

テーブルビューには別のセクションがあります。

すべてのセクションにラジオボタンを追加したい。

各セクションには、テーブルビューで個別の選択と選択解除があります。

最初のセクションchoice1、[図に表示]

選択されたチーズはチーズが選択したいことを意味し、次にユーザーがベーコンをクリックするとチーズは自動的に選択解除されます。

[ここでは、クリックアクションにラジオボタンSSRadioButtonクラスを使用しています。テーブルビューセルにラジオボタンを作成します。ラジオボタンのボタンアクションの書き方。または新しい方法を提案する]。

各ラジオボタンでは、個別に選択および選択解除する必要があります。テーブルビューのすべてのセクションで同じプロセス。どのように私を助けることが可能ですか。よろしくお願いします。 enter image description here

私のコード:

 var radioControllerChoice : SSRadioButtonsController = SSRadioButtonsController()
    var radioControllerDip : SSRadioButtonsController = SSRadioButtonsController()

func numberOfSections(in tableView: UITableView) -> Int {
        return table_data.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // Return the number of rows in the section.
        return table_data[section].menu_id.count
    }

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell:CustomiseTableViewCell = tableView.dequeueReusableCell(withIdentifier: "Customise") as! CustomiseTableViewCell
        cell.name.text?=table_data[indexPath.section].menu_name[indexPath.row]
        print(table_data[indexPath.section].customize[indexPath.row])

        switch indexPath.section {
        case 2:
            radioControllerChoice.addButton(cell.radioBtn)
            radioControllerChoice.shouldLetDeSelect = false
        case 3:
            radioControllerDip.addButton(cell.radioBtn)
            radioControllerDip.shouldLetDeSelect = false

            switch Int(table_data[indexPath.section].customize[indexPath.row]) {
            case 1:
                cell.radioBtn.isHidden = false
            default:
                print("Invalid choose")


                cell.radioBtn.addTarget(self, action: #selector(ViewController.didSelectButton), for: .touchUpInside)
                cell.radioBtn.tag = indexPath.row

            }
        }
    }

func didSelectButton(selectedButton: UIButton?)
{
        /// need solution for button action help me..
}
5
saravanar

SSRadioButtonの代わりにUIButtonを使用して、チェックされているラジオボタンとチェックされていないラジオボタンのボタンの画像を変更できます。

Swift3.2:CustomiseTableViewCell

import UIKit

protocol CustomTableViewCellDelegate {
    func didToggleRadioButton(_ indexPath: IndexPath)
}

class CustomiseTableViewCell: UITableViewCell {

@IBOutlet weak var itemLabel: UILabel!
@IBOutlet weak var radioButton: UIButton!
var delegate: CustomTableViewCellDelegate?

func initCellItem() {

    let deselectedImage = UIImage(named: "ic_radio_button_unchecked_white")?.withRenderingMode(.alwaysTemplate)
    let selectedImage = UIImage(named: "ic_radio_button_checked_white")?.withRenderingMode(.alwaysTemplate)
    radioButton.setImage(deselectedImage, for: .normal)
    radioButton.setImage(selectedImage, for: .selected)
    radioButton.addTarget(self, action: #selector(self.radioButtonTapped), for: .touchUpInside)
}

func radioButtonTapped(_ radioButton: UIButton) {
    print("radio button tapped")
    let isSelected = !self.radioButton.isSelected
    self.radioButton.isSelected = isSelected
    if isSelected {
        deselectOtherButton()
    }
    let tableView = self.superview as! UITableView
    let tappedCellIndexPath = tableView.indexPath(for: self)!
    delegate?.didToggleRadioButton(tappedCellIndexPath)
}

func deselectOtherButton() {
    let tableView = self.superview?.superview as! UITableView
    let tappedCellIndexPath = tableView.indexPath(for: self)!
    let indexPaths = tableView.indexPathsForVisibleRows
    for indexPath in indexPaths! {
        if indexPath.row != tappedCellIndexPath.row && indexPath.section == tappedCellIndexPath.section {
            let cell = tableView.cellForRow(at: IndexPath(row: indexPath.row, section: indexPath.section)) as! CustomiseTableViewCell
            cell.radioButton.isSelected = false
        }
    }
}

}

UITableViewDataSourceのデリゲートメソッドからinitCellItemメソッドを呼び出します。

// Your ViewController

let menuList = [ ["Cheese", "Bacon", "Egg"],
["Fanta", "Lift", "Coke"] ]  // Inside your ViewController
var selectedElement = [Int : String]()

func didToggleRadioButton(_ indexPath: IndexPath) {
    let section = indexPath.section
    let data = menuList[section][indexPath.row]
    if let previousItem = selectedElement[section] {
        if previousItem == data {
            selectedElement.removeValue(forKey: section)
            return
        }
    }
    selectedElement.updateValue(data, forKey: section)
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
   let cell:CustomiseTableViewCell = 
   tableView.dequeueReusableCell(withIdentifier: "Customise") as! CustomiseTableViewCell
    let item = menuList[indexPath.section][indexPath.row]
    cell.itemLabel.text = item
    if item == selectedElement[indexPath.section] {
        cell.radioButton.isSelected = true
    } else {
        cell.radioButton.isSelected = false
    }
    cell.initCellItem()
    cell.delegate = self
    // Your logic....
    return cell
}

enter image description here

7
Rahul Kumar

別の方法:

サードパーティのライブラリ(UIButton)の代わりに単純なSSRadioButtonを使用して、次のように使用できます。

  1. をセットする UIButton'simage in default state to-circle(スクリーンショットのように)

  2. をセットする UIButton'simage in selected stateから-塗りつぶされた円

UIButton'saction eventは、他の場合と同じように通常の方法でキャプチャできます。

このようなもの:

enter image description here

このアプローチに従うか、これに関して何らかの支援が必要かどうかをお知らせください。

0
PGDev