2017-05-21 3 views
0

私はいくつかのビューコントローラをUINavigationControllerに埋め込んでいます。各viewControllerのナビゲーションバーのタイトルの外観をカスタマイズしたいと思います。 setCustomTitleInNavBarに電話する最良の方法は何ですか? viewDidLoadで呼び出された場合、selfはまだ初期化されておらず、アプリケーションはクラッシュします。 ViewWillAppearのタイトルは、ユーザーに表示されているときはまだ表示されていません。これが正しい方法でない場合は、別の実装方法をアドバイスしてください。ナビゲーションバーの外観を変更するメソッドを呼び出す必要がありましたか? Swift 3

class CustomMethods { 
    func setCustomTitleInNavBar(textValue:String, VC:UIViewController) -> UIView { 
    let titleLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 40, height: 40)) 
    titleLabel.text = textValue 
    titleLabel.adjustsFontSizeToFitWidth = true 
    titleLabel.textAlignment = NSTextAlignment.center 
     VC.navigationItem.titleView = titleLabel 
      return VC.navigationItem.titleView! 
    } 
} 


//call method on the current view controller to modify the nav bar title 
    class someViewController: UIViewController { 
    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(true) 
     setCustomTitleInNavBar(textValue: "Where to come?", VC: self) 
    } 
} 
+0

あなたは 'navBar'のタイトルを設定するのに役立ちます方法とプロトコルを作成します。それぞれのVCにプロトコルを実装し、メソッドを 'viewDidLoad'で呼び出します。このメソッドにデフォルトの実装を追加して、デフォルトのタイトルを設定することができます。 – BoilingLime

答えて

1

は、プロトコルを介してそれを実装する方法です:

// Protocol 
protocol NavigationBarSetUpProtocol: class { 

    // Add more param if needed 
    func setupNavigationBar(with title: String) 
} 

// Default implemention 
extension NavigationBarSetUpProtocol where Self: UIViewController { 

    // Default implementation 
    func setupNavigationBar(with title: String) { 

     // configure you VC navigation item with : self.navigationItem.titleView = ... 
    } 

} 

// VC A 
class ViewControllerA: UIViewController, NavigationBarSetUpProtocol { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     setupNavigationBar(with: "HOME") 
    } 

} 

// VC B 
class ViewControllerB: UIViewController, NavigationBarSetUpProtocol { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     setupNavigationBar(with: "PROFILE") 
    } 

} 
1

あなたは

navigationItem.title = "あなたのタイトル" のviewDidLoadで

を呼び出すことができます。ここで

+0

私のアプリには30以上のviewControllerがあり、title変数にはより多くの属性があります。つまり、関数呼び出しではなく同じコードを30回書くとコードベースが増加します。 – bibscy

+0

コードベースを減らすのに役立つprepareForSegueで呼び出すことさえできます – pesch

関連する問題