Передача tag UIButton в class запроса

swift

#1

Всем добрый день! С наступающим Новым годом!
В шишки избился. Подскажите как реализовать следующее имеется класс который генерирует панель с UIButton.

class DayPickerView: UIControl {
public weak var dateSource: DayPickerViewDateSource? {
     didSet {
         setupView()
  }
} 
private var buttons: [UIButton] = []
private var stackView: UIStackView!

override func layoutSubviews() {
    super.layoutSubviews()
    
    stackView.frame = bounds
}

func setupView() {
    let count = dateSource?.dayPickerCount(self)

    for item in 0..<count! {
        let indexPath = IndexPath(row: item, section: 0)
        let title = dateSource?.dayPickerTitle(self, indexPath: indexPath)
        let button = UIButton(type: .system)
        button.tag = item
        button.setTitle(title, for: .normal)
        button.setTitleColor(.black, for: .normal)
        button.setTitleColor(.white, for: .selected)
        button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 10)
        button.addTarget(delegate, action: #selector(delegate?.selectedButton(sender:)), for: .touchUpInside)
        button.titleLabel?.numberOfLines = 0
        buttons.append(button)
        self.addSubview(button)
    }

    stackView = UIStackView(arrangedSubviews: buttons)

    self.addSubview(stackView)

    stackView.spacing = 8
    stackView.axis = .horizontal
    stackView.distribution = .fillEqually
    stackView.alignment = .center
}

}

extension DayPickerView {
@objc func selectedButton(sender: UIButton) {
    for b in buttons {
        b.isSelected = false
    }

    let index = sender.tag
    let button = self.buttons[index]
    button.isSelected = true

}

}
Нужно передать tag UIBuuton let index = sender.tag в запрос который из интернета получает данные

class SheduleNetworkService: SheduleNetworkServiceProtocol {

func getShedule(complition: @escaping (Result<Schedule?, Error>) -> ()) {
    guard let url = URL(string: "https://xxx/api/schedule?dateStart=\(calendars[0])&dateEnd=\(calendars[0])") else { return }
    
    NetworkService.shared.getData(url: url, decod: Schedule.self) { json in
        switch json {
        case .success(let schedule):
            complition(.success(schedule as? Schedule))
        case .failure(let error):
            print(error.localizedDescription)
        }
    }
}

}
тег это index для calendars[0] который по дате формирует запрос


#2

Парни тупой вопрос или нет ответа?


#3

Можно взять пример с UITabBarController и хранить свойство selectedIndex в DayPickerView

private(set) var selectedIndex: Int // можно не делать изменяющимся только изнутри, но тогда нужно дописывать логику переключения.

@objc func selectedButton(sender: UIButton) { 
    ...
    selectedIndex = index
}

Функцию getShedule немного видоизменяем:

func getShedule(calendarIndex: Int, complition: @escaping (Result<Schedule?, Error>) -> ()) { 
    guard let url = URL(string: "https://xxx/api/schedule?dateStart=\(calendars[\(calendarIndex)])&dateEnd=\(calendars[\(calendarIndex)])") else { return }
    ...

В классе, который владеет pickerView и сервисом, берёте selectedIndex и передаёте в функцию получения расписания.


#4

Спасибо! Но это тоже не работает, приходит nil (


#5

Может кто-то еще поделится мыслями, опытом)