问题
I have successfully chain linked delegate methods from CollectionViewController -> MenuTableViewController -> ListViewController. In ListViewController extension I call changeTitleView() but it is not working. The data, however is successfully passed because print(title) correctly prints passed information. changeTitle() executes properly if called from within ListViewController
class ListViewController {
var navigationTitle: String?
@objc func changeTitle(title: String) {
let titleLabel = UILabel()
let attributes: NSDictionary = [
NSAttributedStringKey.font:UIFont(name: "HelveticaNeue", size: 20)!,
NSAttributedStringKey.foregroundColor: UIColor(red: 0.1137, green: 0.1137, blue: 0.149, alpha: 0.8) /* #1d1d26 */,
NSAttributedStringKey.kern:CGFloat(2.0)
]
let attributedTitle = NSAttributedString(string:
title.uppercased(), attributes: attributes as? [NSAttributedStringKey : AnyObject])
titleLabel.attributedText = attributedTitle
titleLabel.sizeToFit()
self.navigationItem.titleView = titleLabel
}
}
extension ListViewController: HandleTitleView {
@objc func changeTitleView(title: String) {
print(title)
self.navigationTitle = title
changeTitle(title: navigationTitle!)
}
Additional information:
1) I am passing information through SWRevealController so not all data is within the same navigation stack. ListViewController is on top of MenuTableViewController and CollectionViewController is instantiated from MenuTableViewController and then dismissed
2) I created a button in ListViewController that calls changeTitle() and it successfully changes the navigationItem.titleView so I know the method works.
Thanks in advance
回答1:
Did you try like below
class ListViewController {
var navigationTitle: String? {
didSet{
if(navigationTitle != nil) {
changeTitle(title: navigationTitle!)
}
}
}
@objc func changeTitle(title: String) {
let titleLabel = UILabel()
let attributes: NSDictionary = [ NSAttributedStringKey.font:UIFont(name: "HelveticaNeue", size: 20)!, NSAttributedStringKey.foregroundColor: UIColor(red: 0.1137, green: 0.1137, blue: 0.149, alpha: 0.8) /* #1d1d26 */, NSAttributedStringKey.kern:CGFloat(2.0) ]
let attributedTitle = NSAttributedString(string: title.uppercased(), attributes: attributes as? [NSAttributedStringKey : AnyObject])
titleLabel.attributedText = attributedTitle titleLabel.sizeToFit()
self.navigationItem.titleView = titleLabel
}
}
extension ListViewController: HandleTitleView {
@objc func changeTitleView(title: String) {
print(title)
self.navigationTitle = title
// changeTitle(title: navigationTitle!)
}`
回答2:
@objc func changeTitle(title: String) {
let titleLabel = UILabel()
let attributeFontSaySomething : [String : Any] = [NSFontAttributeName : UIFont(name: "HelveticaNeue", size: 20) ?? UIFont.systemFont(ofSize: 20) ,NSForegroundColorAttributeName :UIColor(red: 0.1137, green: 0.1137, blue: 0.149, alpha: 0.8),NSKernAttributeName : CGFloat(2.0) ]
var attributes = attributeFontSaySomething
let attStringSaySomething = NSAttributedString(string: title.uppercased(), attributes: attributes)
titleLabel.attributedText = attStringSaySomething
titleLabel.sizeToFit()
self.navigationItem.titleView = titleLabel
}
and you can download the code from this link
Link
来源:https://stackoverflow.com/questions/46656677/method-being-called-but-not-executing-properly