Индекс ObjectAtIndex 0 вне границ для пустого массива в сегментированном элементе управления - PullRequest
0 голосов
/ 14 февраля 2020

Привет Я хочу сделать сегментированный элемент управления программно, но это ошибка при запуске симулятора «Индекс ObjectAtIndex 0 за пределами для пустого массива». Я пытаюсь найти проблему, но не могу ее найти. это мой код

    let segmentedControl    = GSegmentedControl(frame: .zero)
    let segmentedIndicator  = UIView()

    segmentedControl.setTitle("Daily", forSegmentAt: 0)
    segmentedControl.setTitle("Subject", forSegmentAt: 1)
    view.addSubview(segmentedControl)
    segmentedControl.addTarget(self, action: #selector(ViewController.indexChange(in:)), for: .valueChanged)

    @objc func indexChange(in segmented: UISegmentedControl) {
        let numberOfSegmented   = CGFloat(segmentedControl.numberOfSegments)
        let selectIndex         = CGFloat(segmented.selectedSegmentIndex)
        let titleCount          = CGFloat(segmentedControl.titleForSegment(at: segmented.selectedSegmentIndex)!.count)

        view.addSubview(segmentedIndicator)
        segmentedIndicator.backgroundColor = .systemPink
        segmentedIndicator.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            segmentedIndicator.topAnchor.constraint(equalTo: segmentedControl.bottomAnchor, constant: 3),
            segmentedIndicator.heightAnchor.constraint(equalToConstant: 2),
            segmentedIndicator.widthAnchor.constraint(equalToConstant: CGFloat(15 + titleCount * 8)),
            segmentedIndicator.centerXAnchor.constraint(equalToSystemSpacingAfter: segmentedControl.centerXAnchor, multiplier: CGFloat(numberOfSegmented / CGFloat(3) + CGFloat(selectIndex-1.0) * 2.0))

        ])

        UIView.animate(withDuration: 0.5, animations: {
            self.view.layoutIfNeeded()
            self.segmentedIndicator.transform = CGAffineTransform(scaleX: 1.4, y: 1)
        }) { finish in
            UIView.animate(withDuration: 0.4) {
                self.segmentedIndicator.transform = .identity
            }
        }
    }

1 Ответ

1 голос
/ 14 февраля 2020

Между

let segmentedControl = GSegmentedControl(frame: .zero)

и

segmentedControl.setTitle("Daily", forSegmentAt: 0)
segmentedControl.setTitle("Subject", forSegmentAt: 1)

вы не установили numberOfItems, поэтому у вас есть счетчик 0, но вы пытаетесь получить доступ к первому (и второму) индексу.

Чтобы исправить это, измените init:

let segmentedControl = GSegmentedControl(items: ["Daily", "Subject"])

и удалите setTitle .. lines
или измените строки setTitle на

segmentedControl.insertSegment(withTitle: "Daily", at: 0, animated: false)
segmentedControl.insertSegment(withTitle: "Subject", at: 1, animated: false)
...