SORU
27 EKİM 2010, ÇARŞAMBA


iPhone: bazı Arayüz Oluşturucu parçaları ve bazı kodu olan yeniden kullanılabilir bir bileşen (kontrol) Oluşturmak

Yeniden kullanılabilir bir bileşen (özel denetim) iPhone için oluşturmak istiyorum. Birkaç standart kontrolleri bir Görünüm, ve sonra bazı ilişkili kodu danışıklı oluşur. Benim hedeflerim:

  1. Interface Builder özel benim kontrol subviews ortaya koymak için kullanmak mümkün olmak istiyorum;
  2. Nedense sonra oldukça kolay ve diğer Görünümler içine çıkan özel bileşen, el ile çıkışları bir grup yeniden zorunda kalmadan ve sürükle-bırak ben her şeyi paketi istiyorum. (Biraz manuel bir yeniden kablolama iyi, ben sadece tonlarca yapmak istemiyorum.)

Bana inanman için daha ne gerekiyor daha somut ve özel olarak anlatayım. Benim app, ben bazen bir web hizmeti kullanıcı girdi verileri doğrulamak için vurmak gerekir. Web servisinden yanıt beklerken, bir spinner (bir aktivite göstergesi) görüntülemek istiyorum. Eğer web hizmetleri bir başarı kodu ile yanıt verir, "başarı" işareti. bir ekran istiyorum Eğer web hizmeti hata kodu ile yanıt verir, bir hata simgesi ve bir hata mesajı görüntülemek istiyorum.

Bu tek kullanımlık şekilde bunu yapmak oldukça kolaydır: sadece oluşturmak bir UİView içeren bir UİActivityİndicatorView, iki Uİİmages (bir başarı simgesi ve bir hata simgesi) ve bir UİLabel için hata iletisi. Burada bir ekran görüntüsü, ilgili kısımları kırmızı ile işaretli:

alt text

Ben o çıkışları parçaları tel ve benim denetleyicisi kodu koydum.

Ama nasıl onları yeniden böylece bu parçaları -- kod ve görüşlerini ... ... küçük bir koleksiyon paketi. Burada bana partway oraya buldum, ama o kadar iyi değil bir kaç şey:

  • Kütüphanenin Özel Nesneler bölümüne görüş ve denetimleri koleksiyonu sürükleyebiliyorum; daha sonra, daha sonra, onları geri diğer görüşleri üzerine sürükleyin olabilir. Ama (a) unutursa olan görüntüler ile ilgili iki Uİİmages, (b) daha çok el ile yeniden kablolama dört ya da beş çıkışları, ve (c) en önemlisi, bu iyi değil yanınızda kodu. (Belki de orada kod Tel için kolay bir yol var mı?)
  • Eğer yardımı olacaksa bir İBPlugin yaratabilir; emin değilim, ve bir sürü iş gibi görünüyor bence de İBPlugins iPhone bir gelişme olup olmadığını bana tam olarak net değil.
  • "Hmm, kod denetleyici gibi kokuyor burası ile ilgili," özel bir denetleyici (*1 ör*) ilişkili XİB dosyası ile oluşturmaya çalıştım. çok düşündüm Bu gerçekten çok umut verici görünüyor, ama bu noktada ne kadar, diğer görüşleri üzerine Interface Builder içinde, bu bileşeni sürüklemek için çözemiyorum. WebServiceValidatorController bir denetleyici, bir görünüm, bir görünüm içine bir Belge Penceresi içinde, ama değil sürükleyin.

Çok belirgin bir şey eksik hissediyorum

CEVAP
31 Ocak 2011, PAZARTESİ


Benzer bir sorunu çözüyorum. etmek istedim:

  • yeniden, kendi kendine yeten "modül sınıfları" karmaşık bir görünüm birden çok UİKit projelere (ve diğer iç içe geçmiş widget modülü sınıfları!) uygulama. widget oluşturun Üst düzey müşteri sınıfların bu widget dersleri önemsemiyor ne UİLabel, ne bir UİİmageView DAHİLİ olarak içinde widget, müşteri sınıflar sadece bakımı ile ilgili kavramları gibi "gösteriliyor puanı" veya "gösteren takım logosu."

  • widget modülü bir sınıf içinde, widget ve kargaburun çıkışları ınterface builder kullanarak UI yatıyordu

  • bir widget daha yüksek düzey müşteriler için, vb İB için özel tasarım eklentileri gerek kalmadan ınterface builder içinde müşterinin görüş alanında widget çerçeve yerleştirmek için mümkün istedim.

Onları UİViewController amacı olması hiç mantıklı değil. bu aletler üst düzey devamı: Sonra da Apple tavsiyesi bir anda görünür bir ekran üzerinde birden fazla VC için var. Ayrıca, çok tavsiye ve görüş "MVC! gibi dolaşıyor MVC! Görünümü ve kontrol ayırmalısınız! "İnsanların güçlü UİView sınıflara ya da hiç UİView bir alt sınıf içinde uygulama mantığı yerleştirilmesi önerilmez. MVC!

Ama yine de (alt UİView) yapmaya karar verdim. Ben blok etrafında birkaç kez (ama oldukça yeni, hala iPhone SDK/UİKit), ve ben çok hassas bir tasarım bu çirkin, ve bu sorunlara neden olabilir, ve ben açıkçası göremiyorum sorun ile sınıflara UİView ve ekleme çıkışları ve eylemleri. Aslında yeniden kullanılabilir widget UİView bir alt sınıfı olmak yerine UİViewController tabanlı hale getirmesi için pek çok avantajı vardır:

  • Müşteri görünümünde widget sınıfın ınterface builder düzeni doğrudan bir örnek yerleştirin ve widget manzara UİView çerçeve müşteri sınıfı xib gelen yüklendiğinde düzgün başlatılır. Bu çok daha temiz bana daha koyarak bir "yer tutucu görünüm" müşteri, sonra başlatmasını widget modülü programlı ve ayar widget çerçeve için yer tutucu, ve sonra değiştirmeyi tutucu görüntülemek için widget görünüm.

  • Arayüz oluşturucu widget bileşenleri ortaya koymak için temiz ve basit bir xib dosyası oluşturabilirsiniz. Dosyanın Sahibi widget sınıf ayarlanır. Uç dosyası içeren bir kök (vanilya) UİView nerede GUI olduğunu ortaya koydu, ve sonra awakeFromNib: yöntemin widget, bu uç görünümü eklenir widget kendisi gibi bir küme. Çerçeve boyutu ayarlamaları eğer gerekli ise burada, widget kodu içinde tamamen ele olabilir. Bunun gibi

- (void) awakeFromNib
{
    [[NSBundle mainBundle] loadNibNamed:@"MyWidgetView" owner:self options:nil];
    [self addSubview:self.view];
}
  • Widget kendi kendine initialzes kullanıcı arayüzü kullanarak NSBundle. loadNibNamed:sahibi:seçenekler yöntemi kendi awakeFromNib yöntem, yani entegrasyon widget içine müşteri sınıfları temiz: sadece bir damla UİView içine müşteri görünümünde İB, değişiklik UİView sınıfa MyWidgetView ve müşteri ınit veya viewDidLoad kurmak herhangi bir varsayılan widget ekranı kullanarak widget API öyle yazın kendini (setScore: setTeamİmage: vb.)

Aslında bu şekilde bir UİView bir yeniden yapmak için sınıflara arasında çıkan kodu fark yok gibi geliyor bana "" ve bir UİViewController kullanarak. widget Her iki durumda da .h dosyaları, widget sınıf üyeleri, çıkışları, eylem bildirimleri ve özel API bildirimleri içerir. Her iki durumda da .m dosya eylemi uygulamaları ve özel API uygulaması içerir. Ve görünümü xib dosyasında kontrol -- ayrılır!

Yani, özetle, bu kadar karmaşık yeniden görüntülemek Aletler ambalaj için yapıyorum

  • Widget sınıfı UİView bir alt sınıfı
  • Oluşturmak istediğiniz yere widget, doğrudan araçlar kütüphaneden bir UİView sürükleyerek İB ve sınıf değiştirme uygulaması diğer görünümlerde "MyWidgetClass."
  • Kök vanilya UİView içinde bir uç olarak İB sizin widget UI tasarım.
  • widget sınıfın awakeFromNib: yöntem, xib widget UI yük ve [self addSubview:self.theXibRootView]

  • Bir UİViewController gibi widget kodu: çıkışları, eylemleri, özel API

Avantajları bu yaklaşım üzerinde ne yeniden kullanılabilir aletler, ve oluşturmak için diğer yapısal sistemleri hakkında işitme ilgi duyarım.

Eğer widget müşteri sınıfı için olay rapor gerekiyorsa, sadece müşteri self, widget temsilci setleri nerede temsilci bir protokol kullanmak için, sadece bir UİViewController gibi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • chrmoe

    chrmoe

    7 Kasım 2006
  • pilslajt

    pilslajt

    20 HAZİRAN 2008
  • bored before i even began

    bored before

    30 Mart 2009