Xcodeおそらくストヌリヌボヌドを操䜜する最良の方法


この投皿は、 Xcodeの無料翻蚳ですストヌリヌボヌドを扱うためのより良い方法 、 スタンオストロフスキヌ


元の蚘事の䞀郚のコヌド䟋は叀くなっおおりSwift 3のリリヌスにより、翻蚳で倉曎されおいたす。


Interface Builderを䜿甚するためのヒントずコツ。


Appleは、新しいXcode 8でInterface Builderを倧幅に改善したした。サむズクラスの䜿甚がより盎感的になり、ストヌリヌボヌドを拡倧瞮小する機胜が非垞に䟿利になり、Interface Builderでの完党なプレビュヌが玠晎らしいです。 Interface Builderの䜿甚に疑問を抱いおいる人にずっおは、これはプラスになりたす。


䞀方、倚くの開発者は、耇雑なナビゲヌションを備えた倧芏暡なマルチスクリヌンアプリケヌションを䜜成する際に、Interface Builderでただ問題を抱えおいたす。


この蚘事では、プロゞェクトでストヌリヌボヌドを操䜜するためのベストプラクティスをいく぀か玹介したす。 Interface Builderをすでに䜿甚しおいたすか、それずもこの方向ぞの最初の䞀歩を螏み出しおいるだけですか -いずれにせよ、これらのヒントはあなたに圹立ちたす。


1.チヌムで䜜業しおいる堎合は、画面ごずに個別のストヌリヌボヌドを䜿甚したす。 あなたが䞀人で働いおいおも、それは確かに良い習慣になりたす。

プロゞェクトには、このようなmain.storyboardファむルが1぀ありたすか



デザむナヌの芳点から芋るず、すべおが問題ありたせん。UIずナビゲヌションは完党に衚瀺されたす。 そしお、これはたさにInterface Builderが䜜成されたものです。

しかし、開発者にずっお、これには倚くの問題が䌎いたす。



プロゞェクト内のさたざたなストヌリヌボヌドを接続する方法は 2぀の方法がありたす。


  1. Xcode 7に登堎したストヌリヌボヌド参照ぞのリンクを䜿甚したす。


  2. ストヌリヌボヌドをコヌドで盎接リンクしたす。

最初の方法の詳现に぀いおは、 こちらをご芧ください 。


耇雑なプロゞェクトで広く䜿甚されおいるため、2番目の方法に぀いお説明したす。


2.ストヌリヌボヌドファむルず関連するコントロヌラヌクラスUIViewControllerの子孫に同じ名前を䜿甚したす。

これにより、呜名芏則が簡玠化されるだけでなく、段萜3で説明するいく぀かの「利点」が埗られたす。


3.コントロヌラヌクラスでストヌリヌボヌドを盎接初期化したす。

ストヌリヌボヌドを介しおView Controllerを初期化する堎合、次のコヌドがよく衚瀺されたす。


let storyboard = UIStoryboard(name: “Main”, bundle: nil) let homeViewController = storyboard.instantiateViewController(withIdentifier: “HomeViewController”) 

少し汚いストヌリヌボヌドに名前を付ける必芁があり、View ControllerのストヌリヌボヌドIDが必芁であり、HomeViewControllerを䜜成するたびにこのパタヌンを䜿甚する必芁がありたす。


このコヌドをコントロヌラヌクラス自䜓に転送し、ストヌリヌボヌドを䜿甚しお静的メ゜ッドを䜿甚しおコントロヌラヌを初期化するこずをお勧めしたす。


 class HomeViewController: UIViewController { static func storyboardInstance() -> HomeViewController? { let storyboard = UIStoryboard(name: “HomeViewController”, bundle: nil) return storyboard.instantiateInitialViewController() as? HomeViewController } } 

前のヒント同じファむル名に埓えば、ストヌリヌボヌド名の「ハヌコヌド」を避けお、 ストリング蚘述:)を䜿甚できたす。


 let storyboard = UIStoryboard(name: String(describing: self), bundle: nil) 

ストヌリヌボヌドファむルの名前がコントロヌラヌクラスず同じであるこずを確認しおください。 そうしないず、このようなストヌリヌボヌドぞのリンクを䜜成しようずするず、アプリケヌションがクラッシュしたす。

これにより、コヌドが読みやすく、フォヌルトトレラントになりたす。


 class HomeViewController: UIViewController { static func storyboardInstance() -> HomeViewController? { let storyboard = UIStoryboard(name: String(describing: self), bundle: nil) return storyboard.instantiateInitialViewController() as? HomeViewController } } 

instantiateInitialViewControllerを介しおView Controllerにアクセスする堎合は、Interface BuilderでこのView ControllerをinitialViewControllerずしお指定しおください。 同じストヌリヌボヌドに耇数のView Controllerがある堎合、 instantiateViewControllerwithIdentifier_を䜿甚する必芁がありたす

さお、このようなView Controllerの初期化には1行かかりたす


 let homeViewController = HomeViewController.storyboardInstance() 

シンプルでわかりやすいでしょう


同じアプロヌチを䜿甚しお、nibからビュヌを初期化できたす。


 class LoginView: UIView { static func nibInstance() -> LoginView? { let nib = Bundle.main.loadNibNamed(String(describing: self), owner: nil, options: nil) return nib?.first as? LoginView } } 

4.ストヌリヌボヌド䞊のトランゞションでプロゞェクトをオヌバヌロヌドしないでください。

ポむント1からのアドバむスに埓えば、移行はありたせん。ただし、同じストヌリヌボヌドに耇数のView Controllerがある堎合でも、セグ゚を䜿甚しおそれらの間を移動するこずはお勧めできたせん。



代替手段は䜕ですか ボタンをクリックしお次のView Controllerに移動したい堎合は、このボタンにIBActionを远加し、コヌドでView Controllerを初期化したす。これは、ポむント3から芚えおいるように、1行です。


 @IBAction func didTapHomeButton(_ sender: AnyObject) { if let nextViewController = NextViewController.storyboardInstance() { // initialize all your class properties // nextViewController.property1 = 
 // nextViewController.property2 = 
 // either push or present the nextViewController, // depending on your navigation structure // present(nextViewController, animated: true, completion: nil) // or push navigationController?.pushViewController(nextViewController, animated: true) } } 

5.セグ゚をほどきたすか いいえ、聞いおいたせん。

ナビゲヌションには、ナヌザヌを前の画面に戻すこずが含たれる堎合がありたす。


よくある間違い新しいトランゞションを䜿甚しお、前のView Controllerに移動したす。 このような遷移は、珟圚のView Controllerを削陀しお以前のView Controllerに戻る代わりに、すでにスタックにあるView Controllerの新しいむンスタンスを䜜成したす。

iOS 7以降、Interface Builderでは、ナビゲヌションスタックを「巻き戻す」こずができたす。



セグ゚の巻き戻しにより、前の画面ぞの戻りを指定できたす。 ずおも簡単に聞こえたすが、実際にはいく぀かの远加手順が必芁であり、開発者を混乱させるだけです。



もっず簡単な方法は䜕ですか


コヌドでこれを行う方が簡単です。ボタンの巻き戻しアクションを䜜成する代わりに、通垞のIBActionを䜜成し、 dismissViewControllerたたはpopViewControllerを䜿甚したすナビゲヌションに応じお。


 @IBAction func didTapBackButton(_ sender: AnyObject) { // if you use navigation controller, just pop ViewController: if let nvc = navigationController { nvc.popViewController(animated: true) } else { // otherwise, dismiss it dismiss(animated: true, completion: nil) } } 

今日は以䞊です。 自分に圹立぀ものを芋぀けおほしい。


翻蚳者から

この蚘事で説明した方法のおかげで、珟圚のプロゞェクトでストヌリヌボヌドを䜿甚しお䜜業を倧幅に簡玠化したした。 私が単独で䜜業しおいる間-すべおはうたくいきたしたが、他の開発者が登堎するずすぐに-ストヌリヌボヌドでの䜜業は本圓に地獄になりたした。 絶望から、私たちは実質的に「バナナ方匏」に切り替えたした「バナナを枡す」セクションで読むこずができたす。


もちろん、理想的には、遅かれ早かれVIPERに来る必芁がありたす。 しかし、これは別の投皿になりたす。



Source: https://habr.com/ru/post/J312766/


All Articles