Подтвердить что ты не робот

Изменить названия кнопок на SLComposeServiceViewController?

Есть ли способ изменить названия кнопок на SLComposeServiceViewController? Я попытался изменить элементы кнопки на панели навигации, но это не правильные кнопки.

4b9b3361

Ответ 1

Простое обращение с navigationController!.navigationBar делает обаяние. Это должно помочь.

self.navigationController!.navigationBar.topItem!.rightBarButtonItem!.title = "Save"

Ответ 2

Я только что нашел способ сделать это:

class CustomServiceViewController: SLComposeServiceViewController {
    override func viewDidLoad() {
        let navigationBar = view.subviews.first?.subviews?.last? as? UINavigationBar
        let postButton = navigationBar?.subviews.last? as? UIButton
        let cancelButton = navigationBar?.subviews.last? as? UIButton
        postButton?.setTitle("Done", forState: .Normal)
    }
}

Будьте предупреждены - это хрупкое решение, основанное на недокументированных внутренних элементах SLComposeServiceViewController

Ответ 3

Ответ Kasztan больше не работает с последней iOS; вот последнее хрупкое решение.

class CustomServiceViewController: SLComposeServiceViewController { override func viewDidLoad() { let navigationBar = view.subviews.last?.subviews?.last? as? UINavigationBar let postButton = navigationBar?.subviews[3] as? UIButton postButton?.setTitle("Done", forState: .Normal) } }

Ответ 4

РЕДАКТИРОВАТЬ № 3: Решение, работающее с iOS 9 и iOS 10 beta​​strong >

Предыдущий подход прекратил работу с iOS 9, но, похоже, снова работает (тестируется на iOS 9 и 10 beta 2):

1) Во-первых, вам нужно добавить расширение класса UIFont, чтобы проверить, смещен ли шрифт кнопки (это, потому что кнопка "Создать" всегда жирная); здесь.

2) Затем в viewDidAppear: нам нужен следующий код (обновленная версия кода, который я написал в Edit 2):

if let navigationBar = self.navigationController?.navigationBar {

    // First, let set backgroundColor and tintColor for our share extension bar buttons
    navigationBar.backgroundColor = UIColor.darkGrayColor()
    navigationBar.tintColor = UIColor.whiteColor()

    if let navBarSubviews = navigationBar.subviews as? [UIView] {

        for eachView in navBarSubviews {

            if let navBarButton = eachView as? UIButton {

                // Second, let set our custom titles for both buttons (Cancel and Post); checking for the title wouldn't work for localized devices, so we check if the button is bold (Post) or not (Cancel) via the UIFont class extension above.

                let buttonFont : UIFont? = navBarButton.titleLabel?.font

                if buttonFont?.isBold == true {

                    navBarButton.setTitle("Save", forState: .Normal)

                } else {

                    navBarButton.setTitle("Cancel", forState: .Normal)
                }
            }
        }
    }
}

Конечно, теперь это работает, но в будущем он, возможно, снова сломается...


РЕДАКТИРОВАТЬ # 2: я работал над устройством с iOS 8.4:)

Оказывается, я был не прав, потратив на это необоснованное количество времени, мне удалось изменить цвет кнопок и их текст.

Здесь мой код, который должен быть помещен внутри ViedDidAppear() (если вы поместите его в viewDidLoad(), это не сработает!):

    if let navigationBar = self.navigationController?.navigationBar {

        // First, let set backgroundColor and tintColor for our share extension bar buttons
        navigationBar.backgroundColor = UIColor.darkGrayColor()
        navigationBar.tintColor = UIColor.whiteColor()

        if let navBarSubviews = navigationBar.subviews as? [UIView] {

            for eachView in navBarSubviews {

                if let navBarButton = eachView as? UIButton {

                    // Second, let set our custom titles for both buttons (Cancel and Post); checking for the title wouldn't work on localized devices, so we check if the current button is emphasized (Post) or not (Cancel) via an UIFontDescriptor.

                    let fontDescriptor : UIFontDescriptor? = navBarButton.titleLabel?.font.fontDescriptor()

                    if let descriptor = fontDescriptor {

                        let fontAttributes : NSDictionary = descriptor.fontAttributes()
                        var buttonFontIsEmphasized : Bool? = fontAttributes["NSCTFontUIUsageAttribute"]?.isEqualToString("CTFontEmphasizedUsage")

                        if buttonFontIsEmphasized == true {
                            navBarButton.setTitle("Save", forState: .Normal)
                        } else {
                            navBarButton.setTitle("Cancel", forState: .Normal)
                        }
                    }
                }
            }
        }
    }

Тем не менее, я не уверен, что это должно быть сделано в приложении для доставки, и он не будет проходить App Review (он должен, тем не менее, потому что он не возится с частными API). Кроме того, следует отметить, что это может сломаться в любое время, даже если оно не должно быть столь же легко разрушаемым, как предыдущие решения (оно выполняет итерации через subviews и пытается снизить их, поэтому небольшое изменение в иерархии представлений не должно оказывать на него бесполезный); мои ожидания в том, что, даже если в будущем он перестанет работать, он не должен разрушать расширение Share.


Оригинальный ответ

Я считаю, что вы (и я) хотите сделать, больше не возможно, возможно, по дизайну. Вот почему:

Вдохновленный @Kasztan и @Paito отвечает, я пробовал это в viewDidLoad() моего ShareViewController:

    for eachView in view.subviews {
        println("1")

        for eachSubView in eachView.subviews {
            println("2")

            if let navigationBarView = eachSubView as? UINavigationBar {
                println("3")

                for eachNavBarSubView in navigationBarView.subviews {
                    println("4")

                    if let navBarButton = eachNavBarSubView as? UIButton {
                        println("5")
                        println(navBarButton.titleForState(.Normal))

                        navBarButton.setTitleColor(UIColor.redColor(), forState: .Normal)
                        navBarButton.setTitle("My text", forState: .Normal)
                        navBarButton.tintColor = UIColor.redColor()

                        navBarButton.setNeedsLayout()
                        navBarButton.layoutIfNeeded()
                    }
                }
            }
        }
    }

Не то, чтобы я полагал, что что-то вроде этого должно быть отправлено в приложении, но в качестве доказательства концепции это должно было работать и, теоретически, должно быть немного менее разрушаемым с будущими версиями ОС.

Кроме того, это не сработало для меня на iOS 8.4: Я вижу все зарегистрированные сообщения контрольной точки, от 1 до 5, некоторые из них несколько раз (как и должно быть, поскольку код пробует все возможные подзапросы).

Сообщение "5" записывается дважды, что имеет смысл, поскольку это означает, что он успешно сбрасывает обе кнопки "Отмена" и "Опубликовать", но не текст, а цвет не изменяется от значения по умолчанию.

Мое заключение заключается в том, что что-то в коде Apple не позволяет нам изменять внешний вид этих кнопок.

Конечно, если кто-нибудь найдет решение, я был бы рад понизить свой собственный ответ (если это можно сделать, я уверен,);

РЕДАКТИРОВАТЬ № 1. Одна последняя проверка, я также запустил название кнопки, после кнопок downcast (5) и да, я получил необязательный ( "Отмена" ) и необязательный ( "Опубликовать" ) ) в консоли, поэтому это решение получает правильные кнопки, но их нельзя редактировать.