Есть ли способ изменить названия кнопок на SLComposeServiceViewController? Я попытался изменить элементы кнопки на панели навигации, но это не правильные кнопки.
Изменить названия кнопок на SLComposeServiceViewController?
Ответ 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 betastrong >
Предыдущий подход прекратил работу с 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) и да, я получил необязательный ( "Отмена" ) и необязательный ( "Опубликовать" ) ) в консоли, поэтому это решение получает правильные кнопки, но их нельзя редактировать.