更改SLComposeServiceViewController上的按钮标题?

时间:2014-08-13 02:07:18

标签: ios button uiviewcontroller ios8 ios-app-extension

有没有办法更改SLComposeServiceViewController上的按钮标题?我试图更改导航项上的条形按钮项,但那些不是正确的按钮。

4 个答案:

答案 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),是的,我选择了(“取消”)和可选(“发布”) )在控制台中,这个解决方案得到正确的按钮,但无法编辑。