SORU
20 ŞUBAT 2009, Cuma


Ne'in iletişim kurmak için en iyi yolu denetleyicileri görünüm arasında?

Genel olarak objective-c, cocoa, iPhone dev yeni oldukları için, dil ve çerçeveler en iyi şekilde almak için güçlü bir istek var.

Stanford bu CS193P sınıf kullanıyorum kaynaklardan biri web üzerinde terk ettiklerini belirtiyor. Ders Notları, ödevler ve örnek kod içerir, ve tabi ki Apple tarafından verildi dev, kesinlikle göz önünde bulundurun beri "ağızdan".

Sınıf Web Sitesi:< / ^ br . http://www.stanford.edu/class/cs193p/cgi-bin/index.php

Ders 08 birden çok UİViewControllers bu UİNavigationController itildiği yığını olan bir UİNavigationController uygulaması oluşturmak için bir görev ile ilgilidir. Bu UİNavigationController çalışıyor. Bu mantıklı bir şey. Ancak, UİViewControllers arasındaki iletişim hakkında slayt stern bazı uyarılar vardır.

Bu slaytları ciddi bir alıntı yapacağım:< / ^ br . http://cs193p.stanford.edu/downloads/08-NavigationTabBarControllers.pdf

Sayfa 16/51:

Nasıl Veri Paylaşmak İçin Değil

  • Genel Değişkenler veya tekiz
    • Bu içeriruygulama temsilci
  • Doğrudan bağımlılıkları kodunuzu daha az yeniden kullanılabilir hale
    • Ve hata ayıklama ve test etmek için daha zor

Tamam. Ben de varım. Körü körüne uygulaması temsilci ve başvuru içine viewcontroller arasında app temsilci yöntemleri viewcontroller örnekleri iletişim kurmak için kullanılacak tüm yöntemler atmaz. Adil 'nuff.

Biraz daha ilerde, bu slayt bize ne anlatıyorgerekiryapın.

Sayfa 18/51:

Veri Akışı için en iyi Uygulamalar

  • Dışarı şekiltam olarakneler bildirilmesi gerekiyor
  • Girdi parametreleri tanımlayıngörünümünüz için denetleyicisi
  • Yukarı hiyerarşi iletişim gerigevşek bağlantı kullanın
    • Gözlemciler için bir genel arabirim (temsilci gibi) tanımlayın

Bu slayt sonra öğretim görevlisi sonra anlaşılan en iyi uygulamalar UİİmagePickerController ile bir örnek kullanarak gösterir yer tutucu bir slayt gibi görünen izler. Videoları mevcut olsaydı! :(

Tamam, Peki... objc-fu benim kadar güçlü değil maalesef. Ayrıca biraz yukarıda da dediğim gibi son satır kafamı karıştırdı. Bu konuda Google'da payıma düşeni yapıyorum ve iyi bir makale Gözlem/Bildirim teknikleri çeşitli yöntemler söz gibi görünen bir şey buldum:< / ^ br . http://cocoawithlove.com/2008/06/five-approaches-to-listening-observing.html

Yöntem #5 bile bir yöntem olarak temsilciler gösterir! ...Hariç. nesneleri bir seferde sadece tek bir temsilci ayarlayabilirsiniz. Yani birden fazla viewcontroller iletişim var, ne yapmalıyım?

Tamam, o kurduğu bir çete. Kolay referans benim appdelegate birden fazla viewcontroller örnekleri tarafından app temsilci olarak benim iletişim yöntemleri yapabileceğimi biliyorum ama bu tür bir şey yapmak istiyorumdoğruyol.

Bana "aşağıdaki soruları cevaplayın: tarafından . doğru şeyi yapmak yardım lütfen

  1. Bu UİNavigationController yeni bir viewcontroller yığın zorlamaya çalışıyorumkimbu itme yapılması gerekir.Hangi/doğru yerdir benim kod dosyası sınıf?
  2. Bir içinde bulunduğum anlar UİViewControllers bir veri parçası (bir ıvar değeri) etkilenmesini istiyorumfarklıUİViewController, ne "doğru" bir şekilde bunu yapmak için?
  3. Sadece uygulama öğretim üyesi, şöyle bir bakar ne bir temsilci, bir nesne, bir zaman, şimdi ver"Gözlemciler için bir genel arabirim (temsilci gibi) tanımlamak". Yalancı bir örnek burada mümkünse çok yararlı olacaktır.

CEVAP
22 ŞUBAT 2009, Pazar


Bu iyi bir soru, ve bu araştırma yaptığını görmek için onun büyük ve "doğru yapmak" yerine sadece hack birlikte. nasıl öğrenme ile ilgili gibi görünüyor

İlkUygun modeli nesneleri veri yerleştirme , önemi (MVC tasarım deseni başına) odaklanan bir önceki cevap ile aynı fikirdeyim. Genellikle kesinlikle "" veri. sunum olmadığı sürece bir kontrolör içinde durumu bilgileri koyarak kaçınmak için,

İkinci, Stanford Sayfa 10 sunumu görmek için nasıl bir örnek için programlı bir gezinti denetleyicisi üzerine bir kumanda itin. "Görme" Interface Builder kullanarak, this tutorial bir göz atın. bunu yapmak için nasıl bir örnek için

Üçüncüve belki de en önemlisi, "en iyi" Stanford sunumda bahsedilen bağlamda eğer onları düşünürsen anlamak çok daha kolay "bağımlılık enjeksiyon" desen. uygulamaları unutmayın Özetle, bu sizin denetleyicisi "" nesneleri işini yapması gereken (örneğin, referans global değişken). Yukarı bakmayalım anlamına gelir Bunun yerine, her zaman "" o denetleyici (yani, yöntemlerle ihtiyacı olan nesneleri pass) bağımlılıkları. enjekte etmelisiniz

Eğer bağımlılık enjeksiyon desen takip ederseniz, sizin denetleyicisi modüler ve tekrar kullanılabilir olacak. Ve eğer (Apple işini kolayca yeniden kullanılabilir sınıfları oluşturmaktır çalışanları olarak yani) Stanford sunum geldiğini düşünürseniz, yeniden kullanım ve modüler yüksek öncelikleri vardır. Veri paylaşımı için söz tüm bağımlılık enjeksiyon parçası.

Bu da benim tepkim olayın özü bu. Yararlı olur diye bir buton ile bağımlılık enjeksiyon desen kullanarak bir örnek ekleyeceğim.

Görünümü Denetleyicisi ile Bağımlılık Enjeksiyon Kullanmaya örnek

Diyelim ki birkaç kitap listelenir ekran inşa ediyorsun demek. Satın almak istediği ve dokunun kitapları alabilir kullanıcı bir "ödeme" ödeme ekranına gitmek için düğmesine basın.

Bu inşa etmek ve/GUI görünüm nesneleri kontrol ediyor görüntüleyen BookPickerViewController bir sınıf oluşturabilirsiniz. Tüm kitap veri alacak? Bunun için BookWarehouse bir nesneye bağlıdır söylüyorlar. Şimdi kumandanız model temelde bir nesne (BookWarehouse) ve/GUI görünüm nesneler arasında aracılık verilerdir. Diğer bir deyişle, BookPickerViewController BookWarehouse nesneye BAĞLIDIR.

Bunu yapma:

@implementation BookPickerViewController

-(void) doSomething {
   // I need to do something with the BookWarehouse so I'm going to look it up
   // using the BookWarehouse class method (comparable to a global variable)
   BookWarehouse *warehouse = [BookWarehouse getSingleton];
   ...
}

Bunun yerine, bu gibi bağımlılıkları enjekte edilmelidir:

@implementation BookPickerViewController

-(void) initWithWarehouse: (BookWarehouse*)warehouse {
   // myBookWarehouse is an instance variable
   myBookWarehouse = warehouse;
   [myBookWarehouse retain];
}

-(void) doSomething {
   // I need to do something with the BookWarehouse object which was 
   // injected for me
   [myBookWarehouse listBooks];
   ...
}

Elma adamlar "hala bağımlılık enjeksiyon konuşuyorlar." geri hiyerarşi iletişim kurmak için heyet desen kullanarak bahsederken, Bu örnekte, BookPickerViewController bilgilerini test kitabı aldım ve kontrol için hazır olduğunda ne yapmalıyım? Evet, bu gerçekten onun işi değil. Başka bir nesneye BAĞLI olduğu anlamına gelir başka bir nesne, bu iş TEMSİLCİ. Aşağıdaki gibi BookPickerViewController ınit yöntemi değiştirebiliriz

@implementation BookPickerViewController

-(void) initWithWarehouse:    (BookWarehouse*)warehouse 
        andCheckoutController:(CheckoutController*)checkoutController 
{
   myBookWarehouse = warehouse;
   myCheckoutController = checkoutController;
}

-(void) handleCheckout {
   // We've collected the user's book picks in a "bookPicks" variable
   [myCheckoutController handleCheckout: bookPicks];
   ...
}

Net sonuç bu sen bana ver BookPickerViewController sınıfı (ve ilgili GUİ/view nesneleri) ve ben kolayca benim kendi uygulama, farz BookWarehouse ve CheckoutController genel arayüzler (yani, protokoller) ben uygulamak:

@interface MyBookWarehouse : NSObject <BookWarehouse> { ... } @end
@implementation MyBookWarehouse { ... } @end

@interface MyCheckoutController : NSObject <CheckoutController> { ... } @end
@implementation MyCheckoutController { ... } @end

...

-(void) applicationDidFinishLoading {
   MyBookWarehouse *myWarehouse = [[MyBookWarehouse alloc]init];
   MyCheckoutController *myCheckout = [[MyCheckoutController alloc]init];

   BookPickerViewController *bookPicker = [[BookPickerViewController alloc] 
                                         initWithWarehouse:myWarehouse 
                                         andCheckoutController:myCheckout];
   ...
   [window addSubview:[bookPicker view]];
   [window makeKeyAndVisible];
}

Son olarak, sadece sizin BookPickerController test için değil, aynı zamanda yeniden kullanılabilir daha kolaydır.

-(void) testBookPickerController {
   MockBookWarehouse *myWarehouse = [[MockBookWarehouse alloc]init];
   MockCheckoutController *myCheckout = [[MockCheckoutController alloc]init];

   BookPickerViewController *bookPicker = [[BookPickerViewController alloc] initWithWarehouse:myWarehouse andCheckoutController:myCheckout];
   ...
   [bookPicker handleCheckout];

   // Do stuff to verify that BookPickerViewController correctly called
   // MockCheckoutController's handleCheckout: method and passed it a valid
   // list of books
   ...
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Anthony

    Eric Anthony

    13 AĞUSTOS 2011
  • MusicDeluxeTV

    MusicDeluxeT

    14 Mayıs 2010
  • RogerBuckChrist

    RogerBuckChr

    9 Temmuz 2011