Как изменить цвет шрифта на UIAlertController на конкретном листе действий? - PullRequest
0 голосов
/ 27 апреля 2018

enter image description here

Я могу изменить цвет шрифта всех действий на зеленый, как на картинке выше, используя код ниже:

func showAlertSheet() {
    let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)

    let accountAction = UIAlertAction(title: "Account", style: .default) { (action) in
        self.performSegue(withIdentifier: "toAccountVC", sender: nil)
    }

    let actionPhotoLibrary = UIAlertAction(title: "Logout", style: .default) { (action) in

    }

    let actionCancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)


    actionSheet.addAction(accountAction)
    actionSheet.addAction(actionPhotoLibrary)
    actionSheet.addAction(actionCancel)

    actionSheet.view.tintColor = UIColor(red: 0/255, green: 129/255, blue: 58/255, alpha: 1)

    self.present(actionSheet, animated: true, completion: nil)
}

Но мне нужно изменить действие Logout, чтобы оно было красным, как на картинке ниже enter image description here

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

Что мне делать?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Нет прямого метода для установки определенной кнопки на листе действий. Вы можете сделать это таким образом, чтобы сделать его счастливым.

  1. Создайте пользовательский подкласс UIAlertController, назовем его TestAlertController.
  2. Переопределите метод viewDidAppear, чтобы найти метку, которую вы хотите изменить.
  3. Просто используйте TestAlertController.

Вот код в ipod (ios 9.3), вы можете попробовать.

class TestAlertController: UIAlertController {
    override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    let subViews = self.view.subviews[0].subviews[1].subviews[0].subviews
    for view in subViews {
        if view.isKind(of: NSClassFromString("UICollectionView")!) {
            if let modifyView = view.subviews[1].subviews[0].subviews[0].subviews[0].subviews[0] as? UILabel {
                print(modifyView)
                modifyView.tintColor = UIColor.red
            }
        }
    }
}
}

Но в симуляторе iPhone8 plus (iOS 11) все по-другому, код:

    override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if #available(iOS 9.0, *) {
        if let stackView = self.view.subviews[0].subviews[0].subviews[1].subviews[1].subviews[0].subviews[0] as? UIStackView {
            let view = stackView.arrangedSubviews[2]
            if let label = view.value(forKeyPath: "_actionContentView._label") as? UILabel {
                label.tintColor = UIColor.red
            }
            print("hard to locate...")
        }
    }
}

Вот снимок экрана: enter image description here

Этот метод должен проверяться на каждой версии iOS или, возможно, iPhone. Я не думаю, что это хороший способ. Но я не могу найти лучший путь. Может ли кто-нибудь сказать мне лучший способ?

0 голосов
/ 27 апреля 2018

Используйте .destructive вместо .default для стиля действия.

...