Soru IBOutlet sıfır, ancak storyboard, Swift bağlı


Swift 1.1 ve Xcode 6.2'yi kullanma.

Tekil, özel içeren bir UIStoryboard'um var UIViewController alt sınıf. Üzerinde bir tane var. @IBOutlet tip bağlantısı UIView bu denetleyiciden UIView  alt sınıf film şeridinde. Ayrıca bu görüşün alt görünümleri için benzer satış noktalarına sahibim. Şekil A'ya bakınız.

Fakat çalışma zamanında bu özellikler sıfırdır (Şekil B). Her ne kadar ben arayüzleri Arayüz Oluşturucu'ya bağladığımı anladım.

Düşünceler:

  • Bir alt sınıfın alt sınıfını kullanmamın, başlangıçta karışıklık yaratan bir şey olması mümkün mü? Herhangi bir başlatıcıyı geçersiz kılmıyorum
  • awakeFromNib: nedense aranmıyor
  • Belki de alt gösterimlere altyazılara bağlanmaz

Denediğim şeyler:

  • Eşleştirme @IBOutlet ve storyboard öğesi türleri tam olarak (yerine UIView)
  • Mülk ve çıkış siliniyor ve yeniden eklendi

Figure A

Şekil A *

Figure B

Şekil B

* Gizlenmiş kod Figure A geçerli:

@IBOutlet private var annotationOptionsView: UIView!
@IBOutlet private var arrivingLeavingSwitch: UISegmentedControl!

Teşekkür ederim.


76
2018-03-28 19:09


Menşei


Neden değişmiyor? için - Shaan Singh
clearView nildir, çünkü storyboard ile bağlantılı değildir (kodun solundaki daireye bakınız, bir delikli, bağlı olmadığını gösterir), ekran görüntüsünde annotationOptionView bildirimini göremiyorum. - Javier Flores Font
@JavierFloresFont: clearView Nil olmasını beklerim. Bu, henüz düzeltmem gereken bir şey. Ayrıca şekil A'nın dipnotuna bakın. @ShaanSingh Olmalı! Çünkü hikaye tahtalarından gelen bağlantılar çalışma zamanında ayarlanmış ve sıfır olmamalıdır. - Stefan Arambasich
Bu denetleyici nasıl yüklenir? Bize soran kodu gösterin veya ona bağlanan segue'i açıklayın. - rob mayoff
Doğru hikaye tahtasını alıyor: let vc = UIStoryboard(name: "LocationPickerModal", bundle: nil) .instantiateViewControllerWithIdentifier("LocationPickerModalViewController") as LocationPickerModalViewController - Stefan Arambasich


Cevaplar:


Genellikle bu, görünüm denetleyicinizin henüz görünüm hiyerarşisini henüz yüklemediğinden gerçekleşir. Bir görünüm denetleyicisi, yalnızca bir şey gönderdiğinde görünüm hiyerarşisini yükler. view mesaj. Sistem, görüntü hiyerarşisini ekrana koyma zamanı geldiğinde böyle yapar; prepareForSegue:sender: ve viewWillAppear: geri döndü.

VC'niz görünüm hiyerarşisini henüz yüklemediğinden, çıkışlarınız hala sıfırdır.

VC'yi görüş hiyerarşisini yüklemek için zorlayarak self.view.


102
2018-03-28 20:41



Bu gerçekleşirken viewWillAppear: Bu çıkışta ilk kez bir şey yapıyorum denir. Manzaraya ulaşmak benim için bir şey yapmıyor. Hala yok. - Stefan Arambasich
Teşekkürler! Bu benim için de çalıştı. var v = viewcontroller.view; görünüm hiyerarşisini yüklemek zorunda kaldı. Güzel küçük hile! ;) - Yordi Uytersprot
@YordiUytersprot Bu satırı nereye koyardınız? - Async-
Peki, bir viewcontroller'ı başlatırsanız: vc = self.storyboard? .İnstantianteViewControllerWithIdentifier ("StoryboardIDfromVC") olarak mı? CustomVC; view = vc.view; // Şu anda IBOutlets'e buradan CustomVC'den erişebilirsiniz .. vc.customTextField.text = "Lalala"; Umarım size yardımcı olur! :) - Yordi Uytersprot
Bu konuya sık sık koşuyorum ve her zaman aynı. Ve ben her zaman ilk beş dakika ya da öylesine merak ediyorum ... ;-) - cybergen


Ürün> Temiz'i çalıştırmayı denediniz mi? Benim için çok benzer bir problem çözüldü.


25
2018-04-06 01:23



Yaptım. Üzgünüm, cevabımı işaretlemek istedi. Sadece sildikten sonra çalışmaya başladı DerivedData proje için klasör. - Stefan Arambasich
Benim görüşümün hiyerarşisinin ortasındaki iki çıkışım sıfırdı .. Ürün -> Temiz benim için çalıştı! - Rikco
Yardımcı olduğuma sevindim - ThottChief
Teşekkürler, işe yaradı, ben kullanıcı Ürün -> Temiz Oluşturma Klasörü ... - Ivan
obj c, sadece projeyi temizlemek için çalıştım ... bir saatten fazla harcanmış olduğuna inanamıyorum ve projeyi temizlemeyi bile düşünmemiştim: / ama teşekkür ederim! - greenhouse


Görünüm denetleyicinizi bir Storyboard veya NIB'den mi başlattınız veya doğrudan bir başlatıcı aracılığıyla başlattınız mı?

Sınıfınızı doğrudan başlatıcı ile başlattıysanız, çıkışlar bağlanmayacaktır. Interface Builder, sınıflarınızın özelleştirilmiş örneklerini oluşturur ve bu örnekleri tekrarlayan kod çözme için NIB'lere ve Storyboard'lara kodlar, sınıfları kendileri tanımlamaz. Sorununuz buysa, yalnızca UIStoryboard veya UINib üzerindeki yöntemleri kullanmak için denetleyicinizi oluşturduğunuz kodu değiştirmeniz gerekir.


14
2018-03-28 21:49



Ben oluşturuyorum UIStoryboard örnek ve çağrı instantiateViewControllerWithIdentifier üstünde. - Stefan Arambasich


Film şeridi, eklediğim başka kullanıcı arayüzlerini tanımamıştı. Çalışma zamanında tüm referanslar sıfırdı. Bu yüzden türetilmiş veri klasörümü temizledim ve sonra bu bağlantılar tekrar çalıştı.


12
2018-03-29 02:04



Cevap bu. Bunu bir süre için yaptım, yapı klasörünü ve her şeyi temizledim. Benim durumumda viewDidLoad() tüm bağlantılar yapıldı, ancak viewWillAppear() neredeyse hepsi nil (bazen bir veya iki hala bağlı). Her şeyi denedim ve sonunda türetilmiş veri klasörünü sildim, yeniden oluşturdum ve her şey yolundaydı. - ruttopia
3 yıl sonra bile, Xcode 9.2 hala aynı lanet olası böcek. Çok teşekkür ederim. - Kemal Can Kaynak


Benim durumumda oldu, çünkü geçersiz kıldım loadView ViewController alt sınıfımda yöntem, ancak eklemek unuttum [super loadView]

-(void)loadView {
// blank
}

Geçersiz kıldığınızda loadView yönteminde, alt görüntülemelerinizi yapmak sizin sorumluluğunuzdur. Bunu geçersiz kıldığınız için, arayüz oluşturucudan gelen görüşler, kakao nesnelerine dönüştürme şansı bulamaz ve böylece çıkışlar sıfır kalır.

Eğer viewView alt sınıfında loadView uygularsanız, o zaman sizin sorumluluğunuz, UI öğelerini storyboard / xib'den kodlara yükler.

Ya da sadece arayın

[super loadView];

Böylece, süper sınıf, storyboard / xib'i kod içine yükleme şansını yakalar.


10
2018-01-13 09:38





Bu, özel koleksiyon görünüm hücremde bana oluyordu. Benim registerClassforReuseIdentifier yöntemini registerNib ile değiştirmem gerekiyor. Bu benim için sorunumu çözdü.


8
2017-11-26 22:16



Haklısın. Swift Programlama Dili'ndeki ARC sayım içeriğini detaylı olarak okudum. Nedeni bulamıyorum, neden IBOutlet zayıf özelliği hala nil. Sonunda, '@IBOutlet swift nil' için google'um ve cevabınızı SO'da bulabilirsiniz. Ardından, Xcode şablonunun viewDidLoad'da 'self.collectionView! .RegisterClass' eklenmiş satırını işaretledim. O zaman işe yarıyor. Hayatımı kurtardın. - charles.cc.hsu


Arayabilirsin controller.view IBOutlets'i başlatmak için görünümü yüklemeye zorlamak için değerleri atayabilirsiniz.

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if (segue.identifier == "identifier") {
        let controller = segue.destinationViewController as! YourController
        let _ = controller.view //force to load the view to initialize the IBOutlets

        controller.your_IBOutlet_property = xxx
        ...
        controller.delegate = self
    }
}

6
2017-08-08 03:12