2009-04-20 21 views
21

Objective-C'de Delegeler gibi şeylerin anonim uygulamalarını ilan etmek mümkün mü? Ben terminoloji hakkım var, ama burada bir java örnek:Objective-C'de anonim delege uygulaması?

myClass.addListener(new FancyInterfaceListener({ 
    void onListenerInterestingAction(Action a){ 
     ....interesting stuff here 
    } 
}); 

Bu yüzden geçirmek istiyorsanız biraz saçma görünüyor aynı sınıfta başka bir yöntemi, beyan etmek zorunda bir UIActionSheet çağrıyı işlemek için örneğin veri, çünkü bu verileri global değişken olarak saklamak zorundayım. İşte soran bir onay iletişim ile bir şeyler silme bir örnek senin emin:

-(void)deleteItem:(int)indexToDelete{ 
    UIActionSheet *confirm = [[UIActionSheet alloc] initWithTitle:@"Delete Item?" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:nil]; 
    [confirm showInView:self.view]; 
    [confirm release]; 
} 

ve aynı sınıfta UIActionSheetDelegate:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    if (buttonIndex == 0){ 
     [[Settings sharedSettings] removeItemAtIndex:/*need index variable here*/]; 
     [drinksTable reloadData]; 
    } 
} 

Ne yapmak isterler satır içi beyan olduğunu Aynı java örneğinde olduğu gibi. Mümkün mü?

+0

Sadece bu tür durumlar için (burada) https://github.com/GojaN/AnonymusDelegate) için uygun bir çözüm yazıyorum. Bunun bir kavram kanıtı olduğunu unutmayın. –

+0

Evet, üçüncü taraf kitaplıkları ile yapabilirsiniz, tam cevabımı buradan okuyabilirsiniz: http://stackoverflow.com/a/33096839/440168 – k06a

cevap

17

Şu anda Objective-C'de bunu yapmanın bir yolu yoktur. Apple, dil için (gerçekten anonim sınıflardan daha çok lambda kapatma gibi) blok ekleme çabaları üzerine bir çalışma yayınladı. Muhtemelen anonim delege ile benzer bir şey yapabileceksiniz.

Bu arada, çoğu Kakao programcısı temsilci yöntemlerini temsilci sınıfında ayrı bir kategoriye ekler. Bu, kodu daha düzenli tutmaya yardımcı olur. Ana sınıfından dan kategorinin beyanı ve uygulanmasını ayıracak editör penceresinde

@interface MyClass (UIActionSheetDelegate) 
- (void)actionSheet:(UIActionSheet*)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex; 
@end 

@implementation MyClass 
//... normal stuff here 
@end 

@implementation MyClass (UIActionSheetDelegate) 
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    if (buttonIndex == 0){ 
     [[Settings sharedSettings] removeItemAtIndex:/*need index variable here*/]; 
     [drinksTable reloadData]; 
    } 
} 
@end 

XCode metodu pop-up: sizin örnekte sınıf için .m dosyasında böyle bir şey yapardı.

+0

Uyguladığınız her protokol için arayüz beyanına sahip olmanız gerekiyor mu? Eğer öyleyse, bu çok daha fazla iş.(Benim arayüzde uygulanan bir protokolde asla uygulanmadıklarını, sadece protokolün "uygulanmasının" yeterli olduğunu bildiren öncül yeterliydi). –

+1

Hayır, çoklu protokolleri bildirebilirsiniz, sadece arayüzde bir virgül kullanabilirsiniz. Ayrıca, bu gibi bir kategoriyi kullanmak yerine, gördüğüm çoğu kod (bu özellik, özellik için tasarlanmamıştır) - alt sınıfı olmadan, uygulamanızın olmadığı sınıfları genişletmenize izin verecek şekilde tasarlanmıştır), kodu #pragma mark' direktifiyle dosyadaki kendi bölümüne ayırır. –

4

Objective-C'nin Java gibi anonim sınıflar hakkında bir fikri yoktur, bu yüzden Java kodunda olduğu gibi "inline" sınıfı oluşturamazsınız.

+0

Yeterince adil, başka bir yöntem oluşturmadan bunu daha zarif yapmak için herhangi bir yol var mı? aynı sınıfta? Ya iki farklı UIActionSheets istediysem? – rustyshelf

+0

İki eylem sayfası için, temsilci yöntemi olarak adlandırılan hangisini görmek için etiket özelliğini kullanırsınız. Böyle bir durumla karşılaşırsanız, o denetleyicinin sorumluluğu çok büyük olabilir. Sahip olduğunuzdan daha zarif bir şey yok. Öğe dizinini bildiğim kadarıyla takip etmelisin. – Jab

1

Anonim sınıfların Objective-C'de uygulanabileceğine inanıyorum, ancak çok NSProxy sihir ve IMP delilik alacaktır. Bu benim şu anki projelerimden biri.

2

Buna rastladığımda farklı bir şey arıyordum, ancak UIALERTVIEW + BLOCKS için bir arama yaparsanız, satır içi UIALERTVIEW'leri yapmak için birkaç isabet bulacaksınız. Kullandığım bu: ALERTVIEW w/blocks

0

Temsilci arabirimini uygulayan bir sınıfa ne dersiniz? Başlatma sırasında bir blok alırdı. Temsilci tanımında bu bloğu çağırır.

Bu, birden çok UIActionSheets'in kimlikle karşılaştırmak zorunda kalmadan aynı anda varolmasına izin verir.