Başka bir film şeridine mi bakıyorsunuz?


133

Bir film şeridinden diğerine bakmak veya bir film şeridini başka bir film şeridindeki görünüm denetleyicisine gömmek mümkün mü? Bir yerleştirmeniz gerekir UITabBarControllerbir de UINavigationController, ben güzel onları tutmak ve ayırmak istiyorum.



5
Harika bir soru. Bir film şeridine sahip olmak ekip tabanlı projeler için bir kabus. Projeleri düzenli olarak "flow" (giriş için bir storyboard, haber akışı için bir storyboard ve ilgili ekranlar vb.) Bir geliştirici film şeridine her dokunduğunda gerçekleşecek birleşme çakışmalarının sayısını en aza indirmeye yardımcı olur.
Brian Sachetta

@BrianSachetta Başka ne yapıyorsunuz? Paylaşmak için başka iyi benzer ipuçları var mı?
Bal

Takım yapınıza bağlıdır. Gerçekten isterseniz, tüm kullanıcı arabirimlerinizi ayrı .xib dosyalarında kullanabilirsiniz. Görsel senaryo taslakları var olmadan önce böyle olmuştu. Bu yaklaşımın artıları ve eksileri vardır. Sonuç olarak, projedeki diğer geliştiricilerle neredeyse hiç çatışma yaşamayacaksınız. Dezavantajı, uygulama akışını görsel olarak görmek zor olabilir.
Brian Sachetta

Yanıtlar:


201

Evet, ama programlı olarak yapmanız gerekiyor:

// 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];

11
Görsel senaryo taslaklarını gerçekten ayrı tutmak istiyorum; zaten çok fazla dağınık durumdalar.
Ry-

11
Tıpkı bir kitaptaki bölümler gibi, birden fazla film şeridine ihtiyaç olduğunu görüyorum.
finneycanhelp

48
Aynı uygulama üzerinde çalışan birden fazla geliştiriciniz olduğunda, film şeridi xml'deki sürüm kontrolü çakışmalarını çözmek bazen çok acı verici olduğu için birden fazla film şeridine sahip olmak çok yararlı olur.
Lee

14
İOS 9 ve Xcode 7'de çapraz hikaye tahtası referansları artık desteklenmektedir. :-)
Quinn Taylor

1
Milczi'nin cevabını görün, bunu artık arayüzde çok kolay bir şekilde yapabilirsiniz!
Tim

117

Xcode 7'den itibaren bunu bir Storyboard Referansı kullanarak grafiksel olarak yapabilirsiniz:

referans

Film şeridinize Storyboard Referansı ekleyin. ViewController ve Storyboard Referansı arasında segue oluşturma (ctrl + sürükle)

Ardından bu alanları doldurun.

resim açıklamasını buraya girin

"Tutorial", "Tutorial.storyboard" dosyası ve "MainTutorialController", ViewControllerSettings'deki "Storyboard ID" alanınızdır


1
İyi bilgi, ancak soru ios5 olarak etiketlendiğinden bu geçerli değildir.
lnafziger

10
@Inafziger evet ancak bu soru iOS 9 kullanan kişiler için arama sonuçlarının en üstünde görünüyor
Brian Ogden

Bu, XCode 7'den itibaren mevcuttur. Daha az bilgi bak stackoverflow.com/questions/30772145/...
Simon Pickup

Bu işe yaradı, ama aynı zamanda gezinme çubuğunu tutmam gerekiyor, gezinme çubuğu olmadan gösteriyor, bir gezinti ve düğmeyi tarihe geri taşımak için herhangi bir yol var mı, hangi film şeridinin geldiği önemli değil mi?
Gil Beyruth

Bu iOS 10'da benim için çalışıyor. Segue başına bir storyboard referansına ihtiyacım olduğunu ve bir referans noktasına birden fazla segue bağlayamadığımı not ettim.
Mark Reid

10

Manuel olarak segue yapamazsınız çünkü UIStoryboardSegue soyut bir sınıftır. Bir performşey yapabilmesi için alt sınıflara ayırmanız ve uygulamanız gerekir . Gerçekten görsel senaryo taslaklarında oluşturulması gerekiyor. Görünüm denetleyicisini manuel olarak itebilirsiniz, bu da iyi bir çözümdür. lnafzoder'in cevabı bunu iyi yapıyor:

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

Ancak dikkat edilmesi gereken bir şey, şeyleri güzel ve ayrı tutmak istediğinizi söylemiş olmanızdır. Film şeridi fikri, tüm tasarım işlerinizi tek bir yerde yaparken işleri ayrı tutmanıza izin vermektir. Her görünüm denetleyicisi hoş ve film şeridi içinde diğerlerinden ayrılmıştır. Bütün fikir hepsini tek bir yerde tutmak. Sadece güzelce düzenleyin, böylece organize edilir ve gitmek için iyi olacaksınız. Bunu yapmak için gerçekten iyi bir nedeniniz yoksa ayırmamalısınız.


6
storyboard'ları birleştirmek çok iyi çalışmıyor, bu nedenle çok geliştiricili bir ortamda, ayrı storyboard'ların kullanılması ilginç olabilir. Ayrıca tek bir film şeridi ile büyük projelerde performans oldukça kötüleşebilir.
calimarkus

1
Birden fazla film şeridi kullanıyoruz, ama asıl nokta bunu gerçekten yapamazsınız ve aralarında segue yapabilirsiniz. Apple, her şeyi tek bir yerde yapabilmeniz için tasarladı, bu yüzden fikir sadece bir tane kullanmaktır (yapamazsınız). Performans sorun olmamalı. Film şeridi, her görünüm denetleyicisi için ayrı uç dosyalarına derlenir. Görsel senaryo taslaklarından çok iyi bir performans elde etmelisiniz. Performans, her görünüm denetleyicisi için ayrı xib'leriniz olduğu kadar iyi olacaktır.
wbyoung

3
Benim durumumda, performans sorunu genellikle Xcode'da ... Apple'ın storyboard editörünün mevcut uygulaması zayıf.
Adam

1
60 sahneli bir Storyboard'un 2014 Mac Pro'da açılması 13 saniye sürüyor. Bir radar verdim.
Robert Atkins

7

UITabBarControllers'ı bir UINavigationController'a yerleştirmemelisiniz. Apple bu tür bir çevreyi desteklemediğinden , hatalı otomatik döndürme / görünüm boşaltma vb. Gibi hatalar istiyor :

Ancak, görünüm denetleyicilerini birleştirirken sınırlama sırası önemlidir; sadece belirli düzenlemeler geçerlidir. Çocuktan ebeveyne çevreleme sırası aşağıdaki gibidir:

  • İçerik görünümü denetleyicileri ve esnek sınırlara sahip konteyner görünümü denetleyicileri (sayfa görüntüleme denetleyicisi gibi)
  • Navigasyon görünüm denetleyicisi
  • Sekme çubuğu denetleyicisi
  • Bölünmüş görünüm denetleyicisi

1
Tamamen katılıyorum ve birçok nedenden dolayı. Bir TabBarController'ı bir NavigationController'ın içine koymak iyi bir fikir değildir, çünkü delegeler, içerdikleri görünümler için doğru şekilde tetiklenmeyecek ve son kullanıcının arayüzde gezinmek için korkunç bir zamanı olacaktır. TabBar / Gezinme arabiriminden çıkan denetleyiciye geri dönmekte zorlanırlar. Diğer bir yol, TabBarController içinde bir NavigationController Tamam. Son kullanıcıyı karıştırmamak ve Elma önerilerini dinlemek her zaman en iyisidir!
Hubert Kunnemeyer

1
Ve yine de yerli iPhone Müzik uygulaması tam olarak bunu yapıyor ("Now Playing" kısmı).
Enzo Tran

Bilginize: iPhone müzik uygulamasında "Şimdi yürütülüyor" ekranında TabbarController yoktur.
sanjana

4

İşte hızlı bir sürüm:

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

-1

aşağıdakileri denedin mi

2 / gezinti denetleyicinize bağlı ve üst menüdeki görünüm denetleyicinizi seçmek için tıklatın: düzenleyici -> gömme -> Sekme Çubuğu denetleyicisi

Not: Test etmedim çünkü tam tersini kullanıyorum: sekmeli çubuk uygulamaları yapmak ve navigasyon denetleyicisini içine koymak).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.