有没有办法更改SLComposeServiceViewController上的按钮标题?我试图更改导航项上的条形按钮项,但那些不是正确的按钮。
答案 0 :(得分:11)
只需从navigationController访问!.navigationBar即可实现魅力。以下内容应该有所帮助。
self.navigationController!.navigationBar.topItem!.rightBarButtonItem!.title = "Save"
答案 1 :(得分:0)
我刚刚找到了办法:
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
的无证内部
答案 2 :(得分:0)
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)
}
}
答案 3 :(得分:0)
编辑#3:适用于iOS 9和iOS 10测试版的解决方案
之前的方法已停止使用iOS 9,但以下似乎再次起作用(在iOS 9和10 beta 2上测试):
1)首先,您需要添加一个UIFont类扩展来检查按钮字体是否为粗体(这是因为Post按钮始终是粗体); here's how
2)然后,在viewDidAppear:
中,我们需要以下代码(我在编辑2中编写的代码的更新版本):
if let navigationBar = self.navigationController?.navigationBar {
// First, let's 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's 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's 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's 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)。 此外,应该注意的是这可能会随时中断,即使它不像先前的解决方案那样容易破解(它遍历子视图并尝试向下转换它们,因此在视图层次结构不应该使它无用);我的期望是,即使将来它停止工作,也不应该使Share扩展崩溃。
原始回答
我相信你(和我)想要做的事情已经不可能了,可能是设计。原因如下:
受到@Kasztan和@Paito答案的启发,我在我的ShareViewController的viewDidLoad()
中尝试了这个:
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 :最后一次检查,我也按下按钮标题,按下了按钮(5),是的,我选择了(“取消”)和可选(“发布”) )在控制台中,这个解决方案得到正确的按钮,但无法编辑。