Segue ke storyboard lain?

133

Apakah mungkin untuk memisahkan dari satu storyboard ke yang lain, atau untuk menanamkan storyboard di pengontrol tampilan di storyboard lain? Saya perlu menempatkan UITabBarControllerdalam UINavigationController, dan saya ingin menjaga mereka tetap bagus dan terpisah.

Ry-
sumber
1
Lihatlah jawaban ini stackoverflow.com/a/19702425/317928
vokilam
5
Pertanyaan yang bagus Memiliki satu storyboard adalah mimpi buruk untuk proyek berbasis tim. Kami secara teratur memecah proyek ke storyboard dengan "flow" (satu storyboard untuk login, satu storyboard untuk feed berita dan layar terkait, dll). Ini membantu meminimalkan jumlah konflik penggabungan, yang jika tidak akan terjadi setiap kali seorang pengembang menyentuh storyboard.
Brian Sachetta
@BrianSachetta Apa lagi yang kamu lakukan? Adakah tips serupa yang bagus untuk dibagikan?
Sayang
Itu tergantung pada struktur tim Anda. Jika Anda benar-benar ingin, Anda dapat memiliki semua antarmuka pengguna Anda dalam file .xib yang terpisah. Ini adalah bagaimana dulu sebelum storyboard ada. Ada kelebihan dan kekurangan dari pendekatan ini. Keuntungannya adalah Anda hampir tidak akan pernah mengalami konflik dengan pengembang lain dalam proyek ini. Kelemahannya adalah sulit untuk melihat aliran aplikasi secara visual.
Brian Sachetta

Jawaban:

201

Ya, tetapi Anda harus melakukannya secara terprogram:

// Get the storyboard named secondStoryBoard from the main bundle:
UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];

// Load the initial view controller from the storyboard.
// Set this by selecting 'Is Initial View Controller' on the appropriate view controller in the storyboard.
UIViewController *theInitialViewController = [secondStoryBoard instantiateInitialViewController];
//
// **OR**  
//
// Load the view controller with the identifier string myTabBar
// Change UIViewController to the appropriate class
UIViewController *theTabBar = (UIViewController *)[secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];

// Then push the new view controller in the usual way:
[self.navigationController pushViewController:theTabBar animated:YES];
lnafziger
sumber
11
Saya hanya ingin memisahkan storyboard; mereka sudah terlalu berantakan.
Ry-
11
Sama seperti bab dalam sebuah buku, saya melihat perlunya banyak storyboard.
finneycanhelp
48
Ketika Anda memiliki banyak pengembang yang bekerja pada aplikasi yang sama, menjadi sangat berguna untuk memiliki banyak storyboard karena menyelesaikan konflik kontrol versi di storyboard xml kadang-kadang cukup menyakitkan.
Lee
14
Di iOS 9 dan Xcode 7, referensi lintas-storyboard sekarang didukung. :-)
Quinn Taylor
1
Lihat jawaban milczi, Anda dapat melakukannya sekarang dengan sangat mudah di UI!
Tim
117

Dari Xcode 7 dan seterusnya, Anda dapat melakukan ini secara grafis dengan menggunakan Referensi Storyboard:

referensi

Tambahkan Referensi Papan Cerita ke papan cerita Anda. Buat segue antara ViewController dan Storyboard Referensi (ctrl + seret)

Kemudian isi kolom ini.

masukkan deskripsi gambar di sini

Di mana "Tutorial" adalah "Tutorial.storyboard" file dan "MainTutorialController" adalah bidang "Storyboard ID" Anda di ViewControllerSettings

milczi
sumber
1
Info bagus, namun pertanyaannya diberi tag ios5 jadi ini tidak berlaku.
lnafziger
10
@Inafziger ya tapi pertanyaan ini muncul di bagian atas hasil pencarian untuk orang yang menggunakan iOS 9
Brian Ogden
Ini tersedia dari XCode 7 dan seterusnya. Lihat info lebih lanjut di stackoverflow.com/questions/30772145/…
Simon Pickup
Ini berhasil, tetapi saya juga perlu menyimpan bilah navigasi, itu ditampilkan tanpa bilah navigasi, apakah ada cara untuk menjaga navigasi dan tombol untuk memindahkannya kembali pada sejarah, tidak peduli dari mana storyboard itu berasal?
Gil Beyruth
Ini berfungsi untuk saya di iOS 10. Saya memang mencatat bahwa saya memerlukan satu referensi storyboard per segue dan tidak dapat menghubungkan banyak segues ke satu titik referensi.
Mark Reid
10

Anda tidak dapat benar-benar melakukan segues secara manual karena UIStoryboardSegue adalah kelas abstrak. Anda perlu mensubklasifikasikan dan mengimplementasikannya performagar dapat melakukan apa saja. Mereka benar-benar dimaksudkan untuk dibuat di storyboard. Anda dapat mendorong pengontrol tampilan secara manual, yang merupakan solusi yang baik. Jawaban lnafziger melakukan ini dengan baik:

UIStoryboard *secondStoryBoard = [UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil];
UIViewController *theTabBar = [secondStoryBoard instantiateViewControllerWithIdentifier:@"myTabBar"];
[self.navigationController pushViewController:theTabBar animated:YES];

Namun, satu hal yang perlu diperhatikan adalah Anda mengatakan ingin menjaga hal-hal baik dan terpisah. Ide storyboard adalah untuk memungkinkan Anda untuk menjaga hal-hal yang terpisah saat melakukan semua pekerjaan desain Anda di satu tempat. Setiap pengontrol tampilan bagus dan terpisah dalam storyboard dari yang lain. Idenya adalah untuk menyimpan semuanya di satu tempat. Letakkan saja dengan baik sehingga terorganisir, dan Anda akan baik-baik saja. Anda tidak boleh memisahkannya kecuali Anda memiliki alasan yang sangat bagus untuk melakukannya.

kita masih muda
sumber
6
menggabungkan storyboard tidak berfungsi dengan baik, jadi di lingkungan multi-pengembang, mungkin menarik untuk menggunakan storyboard terpisah. Juga kinerjanya bisa sangat buruk di proyek-proyek besar dengan storyboard tunggal.
calimarkus
1
Kami menggunakan banyak storyboard, tetapi intinya adalah Anda tidak dapat benar-benar melakukannya dan memisahkannya. Apple mendesainnya sehingga Anda bisa melakukan semuanya di satu tempat, jadi idenya adalah menggunakan satu saja (bukan berarti Anda tidak bisa). Kinerja seharusnya tidak menjadi masalah. Storyboard dikompilasi menjadi file nib yang terpisah untuk setiap pengontrol tampilan. Anda harus mendapatkan kinerja yang sangat bagus dari storyboard. Kinerja akan sama baiknya jika Anda memiliki xibs terpisah untuk setiap pengontrol tampilan.
wbyoung
3
Dalam kasus saya, masalah kinerja biasanya dalam Xcode ... Implementasi editor storyboard Apple saat ini lemah.
Adam
1
Storyboard 60 adegan membutuhkan waktu 13 detik untuk dibuka pada Mac Pro 2014. Saya telah mengajukan radar.
Robert Atkins
7

Anda seharusnya tidak menempatkan UITabBarControllers di dalam UINavigationController. Ia meminta bug seperti autorotation / view unloading dll, karena Apple tidak mendukung jenis penahanan ini:

Namun, ketika menggabungkan pengontrol tampilan, urutan penahanannya penting; hanya pengaturan tertentu yang valid. Urutan penahanan, dari anak ke orang tua, adalah sebagai berikut:

  • Pengontrol tampilan konten, dan pengontrol tampilan wadah yang memiliki batas fleksibel (seperti pengontrol tampilan halaman)
  • Pengontrol tampilan navigasi
  • Pengontrol bilah tab
  • Pengontrol tampilan terpisah
Danra
sumber
1
Saya sepenuhnya setuju, dan karena berbagai alasan. Menempatkan TabBarController di dalam NavigationController bukanlah ide yang baik, karena delegasi tidak akan memecat dengan benar untuk tampilan yang terkandung di dalamnya, dan pengguna akhir akan memiliki waktu yang mengerikan menavigasi antarmuka. Mereka akan mengalami kesulitan untuk kembali ke controller yang mengarah keluar dari antarmuka TabBar / Navigasi. Sebaliknya, OK, A NavigationController di dalam TabBarController. Itu selalu yang terbaik untuk tidak membingungkan pengguna akhir dan mendengarkan saran Apel!
Hubert Kunnemeyer
1
Namun aplikasi iPhone Music asli melakukan hal itu (bagian "Sedang Bermain").
Enzo Tran
FYI: Aplikasi musik iPhone tidak memiliki TabbarController di layar "Now Playing".
sanjana
4

Ini adalah versi cepat:

let targetStoryboardName = "Main"
let targetStoryboard = UIStoryboard(name: targetStoryboardName, bundle: nil)
if let targetViewController = targetStoryboard.instantiateInitialViewController() {
    self.navigationController?.pushViewController(targetViewController, animated: true)
}
DudeOnRock
sumber
-1

apakah Anda mencoba yang berikut ini:

2 / klik untuk memilih pengontrol tampilan Anda yang ditautkan ke pengontrol navigasi Anda dan di menu atas: editor -> embed in -> Pengontrol Tab Bar

Catatan: Saya tidak mengujinya karena saya menggunakan yang sebaliknya: membuat aplikasi bilah tab dan menempatkan pengontrol navigasi di dalamnya).

moksi
sumber