Film şeridi Xcode 6'da uyarlanabilir bölüm. İtme kullanımdan kaldırıldı mı?


121

Xcode 6 arayüz oluşturucu varsayılan olarak yeni "boyut sınıflarını kullan" onay kutusuna sahiptir. Görünümleri uyarlanabilir hale getirir. görüntü açıklamasını buraya girin

Film şeridimde 2 görünüm arasında geçiş yapmaya çalıştığımda yeni seçeneklerim var: görüntü açıklamasını buraya girin

eski yerine:

görüntü açıklamasını buraya girin

Artık "push" ve "modal" yerine "göster" ve "modsal olarak göster" var. Eski seçenekler, kullanımdan kaldırıldı olarak işaretlenmiştir. "Göster" seçeneğini seçtim, çünkü segment ayarlarında "göster" (ör. İtme)

görüntü açıklamasını buraya girin

Ama zorlamaz. Segue animasyonu alttan slayt gibi görünür (modal) ve gezinme çubuğu kaybolur.

Soru şu: "Şov" un push gibi çalışmasını nasıl sağlayabilirim? Mümkün mü yoksa onun yerine "push (kullanımdan kaldırıldı)" mı kullanmalıyım? Yeni segment türleri hakkında nereden bilgi bulabilirim? İOS8 geliştirici kitaplığında bulduğum tek şey Storyboard'lar Kullanıcı Arayüzünüzü Tasarlamanıza Yardımcı Oluyor, ancak "göster" segmenti hakkında bilgi yok.

GÜNCELLEME

Yeni proje yaratmaya çalıştım ve "gösteri" gerçekten "itme" gibi çalışıyor. Sanırım projemdeki sorun, gezinme denetleyicisini böyle bir kodla yeniden kullanmamdan kaynaklanıyor olabilir, ancak nasıl düzelteceğimi bilmiyorum.

if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] ) {
    SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;
    
    swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {
        
        UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
        [navController setViewControllers: @[dvc] animated: NO ];
        [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
    };
    
}

Bundan sonra MainViewController'dan sonra NewViewController'ı itmeye çalışıyorum. görüntü açıklamasını buraya girin

GÜNCELLEME 2:

Görünüşe göre sadece iOS 7, iOS 7.1 sorunu.

Yanıtlar:


97

Evet, "İtme" yerine "Göster" i kullanın

"Şovun" itme gibi çalışmasını nasıl sağlayabilirim? Mümkün mü yoksa onun yerine "push (kısıtlanmış)" kullanmalı mıyım?

Olması gerekiyor; benim için yapar. Xcode 6 beta 2 kullanıyorum ve test etmek için tek görünüm şablonunu kullandım (IB 'VC_A'da önceden yapılmış görünüm denetleyicisini çağırıyorum). Daha sonra başka bir görünüm denetleyicisi ('VC_B') ekledim. Daha sonra VC_B'yi ve diğerini VC_B'den VC_A'ya geri göstermek için VC_A'ya bir düğme ekledim. Film şeridine ilk görünüm denetleyicisi olarak bir gezinme denetleyicisi eklediğimde ve VC_A'yı rootViewController yaptığımda, hem 'itme' hem de 'gösterme' aynı etkiye sahip. Başlangıçta bir gezinme denetleyicim yoksa ve 'göster'i kullanıyorsam, VC_B'nin aşağıdan yukarıya doğru kaymasıyla anlattığınızı anlıyorum. 'İtmeyi' denersem, itme yapmak için gezinme denetleyicim olması gerektiğinden dolayı bir çökme yaşarım.

Yeni segment türleri hakkında nereden bilgi bulabilirim?

Ben de bazı bilgiler buldum Yani 'ne Arayüz Oluşturucu Yenilikler' oturumu burada . Slaytlara bakarsanız, bir slaytta (41) değişiklikten bahsettiğini göreceksiniz. Bu oturum videosunu izlerken, uyarlanabilir bölümler hakkında konuşmaya başladıkları 38: 00 dakikasına atlayabilirsiniz. Örneğin, yeni bir görünüm denetleyicisinin sunumunun nasıl yapılacağına karar verirken 'göster' uyarlanabilir bölümün bağlamı hesaba kattığını açıklarlar.


Cevabınız için teşekkür ederim. Yeni proje oluşturmaya çalıştım ve "show" gerçekten navigasyon denetleyicili push gibi çalışıyor. Benim projemde bu dersten gelen kenar çubuğuyla karmaşık bir yapıya sahibim appcoda.com/ios-programming-sidebar-navigation-menu ve push işleri, göstermez. Bunun nedeni gezinti denetleyicisini yeniden kullanmam olabilir. Sorumu yeniden kullanım koduyla güncelledim.
John Kakon

Bu yüzden güncellemenize bakarken gördüğüm ilk şey, özel bir segment beklediğiniz: 'SWRevealViewControllerSegue' yani evet, muhtemelen bunlar yerleşik olduğundan 'göster' veya 'itme' kullanmak mantıklı değil kendi özel kodunuzu çalıştırmak istediğiniz halde segmentler. Örnek projeyi indirdiğimde, film şeridi dosyasındaki bölümlerde 'özel' seçimini bile gösteriyor.
Spencer Hall

Bu segmenti kastetmedim. "MainViewController" ın yanında yeni UIViewController oluşturmaktan bahsediyordum (Navigasyon Denetleyicisi var ve benim "güncellemem" sadece oraya nasıl ulaşacağımı gösteriyor) ve yeni View'u MainViewController'a aktarmaya çalışıyor. Storyboard Ekran Görüntüsü Örnek projede "boyut sınıflarını kullan" seçeneğini etkinleştirirseniz, NewViewController'ı oluşturursanız ve MainViewController ile NewViewController arasında "show" ile geçiş yapmayı denerseniz minnettar olacağım. Neden bahsettiğimi göreceksin.
John Kakon

Bunu şimdi yaptım ve en azından benim için "gösteri" aynı "itme" gibi işledi.
Spencer Hall

9
Görüntü denetleyicinizin tüm yollarının köklerinde bir UINavigationController olduğundan emin olarak hatayı aşabilirsiniz. Bu, storyboard'unuza asla erişilemeyecek bir UINavigationController koymak anlamına gelse bile. Görünüşe göre kablolama davranışı anlamak için kullanılıyor.
Scott Robertson

33

Zaten kabul edilmiş bir cevap var, ancak biraz daha fazla bilgi vermek istedim, muhtemelen daha önce mevcut olmayan bilgiler.

Daha önce bahsedildiği gibi, "itme" ve "modal" segmentler kullanımdan kaldırıldı ve sırasıyla "göster" ve "mod olarak mevcut" ile değiştirildi. Apple'ın belgelerine göre, yeni segmentler boyut sınıflarına uyarlanan segmentlere ayrıldı. Daha eski olanlar yalnızca iOS 8'den daha eski iOS sürümlerini desteklemek için kullanılmalıdır.

Aşağıdaki bağlantıdaki belge bunu ve eski ve yeni mevcut tüm bölümlerin açıklamasını açıklamaktadır.

Bir Storyboard'da Sahneler Arasına Segue Ekleme

Gelecekte URL'nin değişmesi durumunda, her yeni segment için verilen açıklama budur:

Göstermek

İçeriği ekranın içeriğine bağlı olarak ayrıntıda veya ana alanda sunun. Uygulama bir ana ve ayrıntı görünümü gösteriyorsa, içerik ayrıntı alanına aktarılır. Uygulama yalnızca ana öğeyi veya ayrıntıyı görüntülüyorsa, içerik, geçerli görünüm denetleyici yığınının üstüne itilir.

Detayları göster

Ayrıntı alanında içeriği sunun. Uygulama bir ana ve ayrıntı görünümünü görüntülüyorsa, yeni içerik mevcut ayrıntının yerini alır. Uygulama yalnızca ana öğeyi veya ayrıntıyı görüntülüyorsa, içerik, geçerli görünüm denetleyici yığınının üst kısmının yerini alır.

Modal Olarak Sunma

İçeriği modsal olarak sunun. Bir sunum stili (UIModalPresentationStyle) ve bir geçiş stili (UIModalTransitionStyle) seçme seçenekleri vardır.

Popover olarak göster

İçeriği, mevcut bir görünüme sabitlenmiş bir açılır pencere olarak sunun. Açılır pencere görünümünün bir kenarında gösterilen olası okun yönlerini belirtmek için bir seçenek vardır (UIPopoverArrowDirection). Bağlantı görünümünü belirtme seçeneği de vardır.


24

TLDR; Doğru itmeyen Segue'yu silin ve bir UIView / UIControl'den hedef görünüm denetleyicisine sürükleyerek film şeridinde yeniden oluşturun.

Diğer cevaplarda yanlış bir şey yok, ancak bu, neler olduğunu, olduğunu nasıl doğrulayabileceğinizi ve gelecekte sorunu nasıl hafifletebileceğinizi açıklıyor.

Arka fon

Benim durumumda, ilk görünüm denetleyicim olarak bir UINavigationController'a sahip olmama rağmen (kök olarak içeriğim UIViewController'imle), Show Segues'imden hiçbiri çalışmıyordu.

Gösteri Segue Neden ve Nasıl Kesiliyor?

Show segmenti, film şeridinin kaynak xml'sindeki segment ile ilişkili bir eylem olduğunda kırılır. Buna neden olan tipik bir senaryo, daha önce kodda çağrılan manuel bir segmentten bir segmenti yeniden tanımlamış olmanız olabilir. Bu, aşağıdaki bitleri storyboard xml'de bırakır.

<connections>
    <segue destination="85t-Z1-hxf" kind="show" identifier="ToOptions" action="showDetailViewController:sender:" id="gdZ-IX-KcN">
</connections>

Nota Bene Film şeridini xml olarak görüntülemek için; Film şeridi dosyasını sağ tıklayın ve Aç> Kaynak Kodu'nu seçin . Geri dönmek için Farklı aç> Arayüz Oluşturucu - Storyboard'u kullanın

Film şeridinden segmenti kullanırken herhangi bir özel eylemi yerine getirmek için, hazırlamaya dokunabilir ve hedef görünüm denetleyicisini durdurabilir ve bu konumdan herhangi bir yöntemi çağırabilirsiniz. Her halükarda, bu küçük hatanın yan etkisi (hata, segmenti yeniden tanımladığınızda xml'de doğru şekilde ayarlanmamış olmasıdır ~ yani, segmenti bir UIView'den çalışan bir segmente (veya UIControl) bir hedef görüntüleme denetleyicisine).

Maalesef en doğrudan çözüm başarısız oluyor. Dolayısıyla, sadece edecek Film Şeridi 'içinden eylem için xml özelliğini kaldırarak DEĞİL sorunu çözmek. Bunun yerine , film şeridindeki segmenti basitçe silmeli ve yeniden oluşturmalıdır .

Film şeridi xml yeniden oluşturulduğunda artık belirli bölümle ilişkili bir eyleme sahip olmayacak ve Gösteri bir Push olarak yürütülecektir.

Doğru Göster Segue için Örnek Xml

  <connections>
    <segue destination="RbV-Au-WV9" kind="show" identifier="ToOptions" id="5dm-os-bcS"/>
  </connections>

hafifletme

Yinelemeyi önlemek için, hedef görünüm denetleyicisine dayalı gerekli eylemleri eklemek için preparforSegue kullanarak mümkünse manuel olmayan storyboard segmentlerine bağlı kalmanız yeterlidir. Veya karıştırmanız ve eşleştirmeniz gerekiyorsa, Şov bölümlerinizin film şeridi xml'de ekli herhangi bir eylem olmadığını doğrulamak için önlem alın. Daha eski projelerle uğraşıyorsanız, birkaç sorun keşfettiğim için Storyboard kaynak koduna özel dikkat göstermelisiniz.


3
Saatler sonra, bu muhtemelen başka saatlerimi kurtardı. Olarak aç storyboard: İşte yukarıda dayalı önereceğim olduğunu Kaynak Kodu , aramak tür = "gösterisi" hat şöyle bir şey varsa ve görünüm = eylem ": gönderici: showDetailViewController" , eğer öyleyse, gelen silme herşey eylem = kapanana kadar " . Gerçekten çok büyük bir storyboard'ım var ve etkilenen sekme bu eylem parametresini içermiyordu, ancak başka bir ilgisiz satır içeriyordu. Eylemi sildikten sonra, tüm uyarlanabilir seque'ler beklendiği gibi tekrar çalıştı. Etkilenen sekmeyi silmedim. t iş.
Marcus

Bu beni de kurtardı.
Adam Bardon

1
XML'deki action niteliğini silmek arkadaşım için çalıştı.
Brent Royal-Gordon

beni de kurtardı
Jimmy George Thomas

Xml dosyasındaki eylem özniteliği silindi ve işte çalışıyor. Bu gönderi olmadan sorunu asla bulamazdım.
krizzzn

20

As Scott Robertson burada yorumladı , bu bakışlar iOS 7'de bir böcek gibi.

Görünüşe göre, iOS 8'de geçiş çalışma zamanında (doğru davranış) çıkarılırken, iOS 7'de geçiş tasarım zamanında çıkarılır (hatalı davranış).

En basit çözüm, film şeridine kullanılmayan bir gezinme denetleyicisi eklemek ve söz konusu görüntü denetleyicisinin bu gezinme denetleyicisinin bir parçası olması için onu bağlamaktır. Gezinme denetleyicisini gerçekte somutlaştırmanız gerekmez, yalnızca buggy görünüm denetleyicisine bunun bir gezinme denetleyicisine gömülü olduğunu bilmek için ihtiyacınız vardır.

Not: Gezinme çubuğunu simüle etmek bu amaçlar için yeterli değildir; aslında itme yığınında bir gezinti denetleyiciniz olmalıdır.

Hatayı yeniden oluşturmak için:

  1. Boyut sınıflarını kullanan yeni bir storyboard oluşturun.
  2. İki görünüm denetleyicisi oluşturun (gezinme denetleyicisi yok).
  3. Örneğin, bir düğmeye bağlı bir Göster (örn. Push) segmenti aracılığıyla ilk görünüm denetleyicisinin ikinci görünüm denetleyicisini göstermesini sağlayın.
  4. Kodda, ilk görünüm denetleyicisini gösterin, ancak initWithRootViewController:yöntem aracılığıyla bir gezinme denetleyicisine gömün .
  5. Uygulamayı iOS 7'de çalıştırın.
  6. İtmeyi gerçekleştirmesi gereken düğmeye dokunun.
  7. İOS 7'de bir itme yerine mod geçişi alacaksınız. İOS 8'de doğru, itme davranışını elde edeceksiniz.

görüntü açıklamasını buraya girin

Hatayı düzeltmek için:

  1. Film şeridine bir gezinme denetleyicisi ekleyin ve ilk görünüm denetleyicisini kök görünüm denetleyicisi olacak şekilde ayarlayın. (Not: ikincisini kök görünüm denetleyicisi olarak eklemek bu hatayı DÜZELTMEZ.)
  2. Gezinme denetleyicisinin erişilemez olduğuna ilişkin uyarıyı bastırmak ve yalnızca geçici bir çözüm olarak var olduğunu kendiniz belgelemek için ona bir önemsiz tanımlayıcı verin. (örneğin workaround for show segues in iOS 7).

görüntü açıklamasını buraya girin

Gezinme denetleyicisinin ikinci resme nasıl eklendiğine ve gelen okların nasıl olmadığına dikkat edin (yani, onu görünüm denetleyicisi tanımlayıcısını kullanmaktan başka bir şekilde başlatmanın bir yolu yoktur).


1
Teşekkürler, NavigationController ile yaptığım numara, NavigationControllers ViewController-Stack'in kökünü değiştirirken benim için yaptı
Peter Pint

1
En iyi çözüm. Teşekkürler
Ирина Голованов

13

Buna geç kaldığımı biliyorum ama öğrendiklerimi paylaşmak istedim. Bu aslında bir hatadır ve bugün hala mevcuttur (2014-12-18).

Burada bununla ilgili bir makale yazdım .

Kolayca yeniden üretilebilir; ShowSegue çağırmadan önce yığına programlı olarak bir görünüm denetleyicisini itmediğiniz sürece iOS8'de, iOS7.x'te bile gayet iyi çalışır .

Yığını yalnızca storyboard bağlantılarını kullanarak iterseniz, işe yarayacaktır; fakat görünüşe göre eğer kod aracılığıyla bir şekilde iterseniz, itilenin navigationControllerözelliği UIViewControllerolacaktır nilve aradığınızda Show, yığını kontrol etmek için gezinme olmadığı için onun bir modal olduğunu varsayacaktır.

Şimdiye kadarki tek geçici çözüm, kod yoluyla itme (uygulanabilir değil) veya artık kullanımdan kaldırılmış olanı kullanmaktır Push.

Bir radar kaydettim (makaledeki bağlantı). Apple'ın bu sorunu çözmesi umuduyla çiftleri dosyalamaktan çekinmeyin.


3
Bu benim sorunumdu, teşekkürler! Kullanımdan kaldırılmış push kullanmak bu durumda daha az kötü bir çözüm gibi görünüyor.
Moshe Gottlieb

Başka bir geçici çözüm, film şeridine (kullanılmayan) bir gezinme denetleyicisi eklemektir. Bkz stackoverflow.com/questions/24184003/...
Senseful

Nop! Burada oluyor ve nedeni programlı bir itme değil. Benim durumumda bir Showsegment gerçekleştiriyorum , ardından ikinci Showsegmentte mod olarak sunuluyor, Çözüm?
Frade

@Frade, bunun yeniden üretilebilir olduğu bir github deposuna bağlanabilir misiniz? Hangi iOS sürümünü kullanıyorsunuz?
esttorhe

özel proje .. ShowiOS 7'de bir viewController'ın bir (saniyesini) gerçekleştirmeye çalışırken olur
Frade

2

Xcode 7 ve iOS 7.1.2'deki segmentlerle aynı sorunu yaşadım. Segmentleri göster (iOS 8'deki yeni özellik) , iOS 7'deki modal segmentler gibi çalışır ve Storyboard'unuzda Xcode ile segment türünü tanımladığınızda Görünüm Denetleyicilerinizi Gezinme Denetleyicisi yığınına itmenize izin vermez. Bu nedenle self.navigationController ürününüz sıfıra dönecektir, çünkü View Controller yığına itilmemiştir ve onu açamazsınız.

Uygulamanızın iOS 7 üzerinde çalışmasına ihtiyaç duyduğunuzda Apple'ın Xcode'da bu durum için neden herhangi bir bildirim eklemediğini anlamıyorum . Push yönteminin Kullanımdan Kaldırıldığını söylüyorlar, ancak Göster, iOS 7 ile düzgün çalışmıyor.

Sorunu çözmek için ne yaptım:

MYShowSegue sınıfını .h ile oluşturdum

#import <UIKit/UIKit.h>

@interface MYShowSegue : UIStoryboardSegue

@end

Ve tek bir perform yöntemine sahip .m dosyası :

#import "MYShowSegue.h"

@implementation MYShowSegue

- (void) perform {

    if ([[[self sourceViewController] navigationController] respondsToSelector:@selector(showViewController:sender:)]) {

        id sender = nil;
        [[[self sourceViewController] navigationController] showViewController:[self destinationViewController] sender:sender];
    }else{

        [[[self sourceViewController] navigationController] pushViewController:[self destinationViewController] animated:YES];
    }
}

@end

Öykü Panonuzdaki her bölüm için bir Özel tür belirlemeniz ve bunun için yeni bir sınıf seçmeniz gerektiğinden, benim durumumda bu MYShowSegue idi.

Özel Segue Örneği

Bu çözüm, iOS 7 uygulamalarınız için tam destek almanıza yardımcı olacak , Görünümlerinizi itmek için pushViewController yöntemini kullanacaklar ve iOS 8,9 vb. İçin segmentiniz yeni (iOS 8) yöntemle çalışacaktır. segmentiniz showViewController çalışacaktır.

Öykü Panonuzdaki tüm bölümleriniz için aynısını yapmayı unutmayın.


Güzel çözüm - benim için çalıştı ("kullanılmayan" bir gezinme denetleyicisi eklemek yerine ...
Laurenz Glück

1

Bu hala iOS 10.x'te oluyor

Segmentleri silmek ve yeniden başlatmak benim için hiçbir şeyi çözmedi:

Sorun: Gerekli işlevsellik, yalnızca bir 'itme' (aslında bir gösteri Detayı) olarak çalışan 7 segmentti, ancak aslında yalnızca eklediğim ilk segment itecek, diğerlerinin tümü modsal olarak davranacaktı. Bu, Interface Builder'ın her bir segmenti aynı şekilde tanımlamasına rağmen.

Çözüm: Eylemi olmayan 6 segmente eklemek zorunda kaldım.

Orijinal Storyboard XML

<connections>
  <segue destination="tIr-4a-WfZ" kind="showDetail" identifier="A" action="showViewController:sender:" id="8yd-Ne-7KA"/>
  <segue destination="4mB-YE-5dM" kind="showDetail" identifier="B" id="Uod-JC-786"/>
  <segue destination="Qh5-bJ-KcE" kind="showDetail" identifier="C" id="3PW-nV-hWl"/>
  <segue destination="EI6-f4-QBB" kind="showDetail" identifier="D" id="WUK-ju-KDm"/>
  <segue destination="nTz-N4-fpW" kind="showDetail" identifier="E" id="Id6-bW-Huc"/>
  <segue destination="JEp-CH-6dW" kind="showDetail" identifier="F" id="G0L-XW-7f4"/>
  <segue destination="AET-S1-O6h" kind="showDetail" identifier="G" id="3NK-93-wTy"/>
</connections>

Bunu showViewController: gönderen ekleyerek değiştirdim

<connections>
  <segue destination="tIr-4a-WfZ" kind="showDetail" identifier="A" action="showViewController:sender:" id="8yd-Ne-7KA"/>
  <segue destination="4mB-YE-5dM" kind="showDetail" identifier="B" action="showViewController:sender:" id="Uod-JC-786"/>
  <segue destination="Qh5-bJ-KcE" kind="showDetail" identifier="C" action="showViewController:sender:" id="3PW-nV-hWl"/>
  <segue destination="EI6-f4-QBB" kind="showDetail" identifier="D" action="showViewController:sender:" id="WUK-ju-KDm"/>
  <segue destination="nTz-N4-fpW" kind="showDetail" identifier="E" action="showViewController:sender:" id="Id6-bW-Huc"/>
  <segue destination="JEp-CH-6dW" kind="showDetail" identifier="F" action="showViewController:sender:" id="G0L-XW-7f4"/>
  <segue destination="AET-S1-O6h" kind="showDetail" identifier="G" action="showViewController:sender:" id="3NK-93-wTy"/>
</connections>
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.