Можно ли использовать запись массива в #selector? - PullRequest
0 голосов
/ 22 апреля 2020

Я добавляю ярлыки и кнопки в TextView динамически. Это обусловлено циклическим перебором массивов, содержащих имена меток, имена кнопок и имена функций кнопок. Для краткости и простоты я изменил здесь код, чтобы использовать жестко закодированные индексы вместо al oop, и я не включил функции создания меток и кнопок. Ярлыки созданы просто отлично. Первая кнопка также создается просто отлично, поскольку я указываю Button1Clicked в качестве аргумента #selector. Вторая кнопка создается правильно, только если я укажу Button2Clicked в качестве аргумента #selector. Если я пытаюсь ссылаться на массив в аргументе кнопки #selector, я получаю сообщение об ошибке компилятора «Аргумент« #selector »не относится к методу, свойству или инициализатору« @ obj c »». Предполагая, что можно использовать массив, содержащий имя функции @ obj c, в качестве аргумента для #selector, кто-то может предоставить мне соответствующий синтаксис? Я использую Swift 5 и Xcode 11.2. Заранее благодарю за помощь.

@objc func Button1Clicked(sender: UIButton) {
    print("You pressed button 1")
}

@objc func Button2Clicked(sender: UIButton) {
    print("You pressed button 2")
}
    .
    .
    .

    var labelNames = [UILabel]()
    let Label1:UILabel = UILabel()
    let Label2:UILabel = UILabel()
    labelNames = [Label1, Label2]

    var buttonNames = [UIButton]()
    let Button1:UIButton = UIButton()
    let Button2:UIButton = UIButton()
    buttonNames = [Button1, Button2]

    let buttonSelectorNames = ["Button1Clicked", "Button2Clicked"]

    configureLabel(labelNameIn: labelNames[0],
                   textIn: "aaaaa",
               textColorIn: appColorWhite,
                   backgroundColorIn: appColorBlue,
                   yPositionIn: 0)
    statusTextview.addSubview(labelNames[0])

    configureLabel(labelNameIn: labelNames[1],
                   textIn: "-- bbbbb",
                   textColorIn: appColorWhite,
               backgroundColorIn: appColorBlue,
                   yPositionIn: 25)
    statusTextview.addSubview(labelNames[1])

    configureButton(buttonNameIn: buttonNames[0],
                    xPositionIn: 0,
                    yPositionIn: 50,
                    textIn: "B1",
                    textColorIn: appColorBlack,
                    backgroundColorIn: appColorBrightGreen,
                    textViewIn: statusTextview)
    buttonNames[0].addTarget(self,
                             action: #selector(Button1Clicked),
                             for: .touchUpInside)
    statusTextview.addSubview(buttonNames[0])

    configureButton(buttonNameIn: buttonNames[1],
                    xPositionIn: 100,
                    yPositionIn: 50,
                    textIn: "B2",
                    textColorIn: appColorBlack,
                    backgroundColorIn: appColorBrightGreen,
                    textViewIn: statusTextview)
    buttonNames[1].addTarget(self,
                      action: #selector(buttonSelectorNames[1]),
                      for: .touchUpInside)
    statusTextview.addSubview(buttonNames[1])

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

В прошлом у меня была сделка с таким же типом требований. Я делал это, сохраняя selector в Array.

Пожалуйста, обратитесь к фрагментам кода. Я уверен, что это поможет вам.

Код:

class ViewController: UIViewController {

    let selector = [#selector(Button1Clicked),#selector(Button2Clicked)]

    override func viewDidLoad() {
        super.viewDidLoad()
        let btn = UIButton(frame: self.view.bounds)
        self.view.addSubview(btn)
        btn.addTarget(self, action: selector[0], for: .touchUpInside)

    }

    @objc func Button1Clicked(){
        print("Button1Clicked")
    }

    @objc func Button2Clicked(){

    }
}

Вывод:

Output

0 голосов
/ 22 апреля 2020

вам не нужно определять событие нажатия кнопки для каждой кнопки. Вы можете определить общую функцию и назначить ее всем кнопкам в l oop. Затем вы можете указать с помощью тега кнопки

в вашем l oop назначить текущий индекс как тег кнопки

buttonNames[currentIndex].tag = currentIndex
buttonNames[currentIndex].addTarget(self,
                             action: #selector(didButtonClicked(_ :)),
                             for: .touchUpInside)

функция нажатия кнопки

@objc func didButtonClicked(_ sender : UIButton){
        switch sender.tag{
        case 0: //clicked button with tag 0
        case 1: //clicked button with tag 1
        default: break
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...