2011-07-01 12 views
6

İki farklı hedefe dayanan bir Xcode 4 projem var. Böyle her hedef için farklı bir kod çalıştırabilir böylece yapı ayarlarında bazı sabitleri tanımladığınız:Bir arabirim bildiriminde bir temsilci şartlı olarak nasıl bildirebilirim?

#ifdef VERSION1 
// do this 
#else 
// do that 
#endif 

uygulamanın bir versiyonunda, ben başka bir görünüm denetleyicisi açıp olmaya ana görünümü denetleyicisi gerek onun temsilci, ancak diğer sürüm bu denetleyiciyi kullanmaz ve kodunu derlememeli veya temsilcisini oluşturmaya çalışmamalıdır. Böyle ana görünümü denetleyicisi başlığını kurdum: alma etiketi etrafında koşullu çalışıyor, ancak nasıl bir sürümünde SpecialViewControllerDelegate olmak için bu sınıf ancak diğer değil ilan edebilir

#ifdef VERSION2 
#import "SpecialViewController.h" 
#endif 

@interface MainViewController : UIViewController <MPMediaPickerControllerDelegate, SpecialViewControllerDelegate> { 
// etc. 

?

+0

olası yinelenen (http://stackoverflow.com/questions/6514136/how-can-you-conditionally-include-protocols-during-compiliation) –

+0

Vay, ben tam olarak bu terimleri aradım ama görmedim. Bu soruya da güzel bir çözümü olan bu linke bağlanıyor: http://stackoverflow.com/questions/5177040/how-to-use-different-interface-declarations-at-compile-time-without-confusing-int – arlomedia

+0

I sadece onu buldum çünkü geçen gün okumayı hatırladım. SO arama çoğu durumda Google’dan (kasten) daha düşüktür. –

cevap

10

Yalnızca sürümler arasındaki delegeleri değiştirmek için #define preprocessor yönergesini kullanın. Burada "VERSION2" için bir örnek var.

#ifdef VERSION2 
#import "SpecialViewController.h" 
#define ARGS PMediaPickerControllerDelegate, SpecialViewControllerDelegate 
#endif 

@interface MainViewController : UIViewController <ARGS> 
[Nasıl koşullu compiliation sırasında protokolleri içerebilir?] Arasında
+0

İlginç, temsilci olarak uygulanması gereken yöntemlerle nasıl ilgileniyorsunuz? Bunların yanı sıra #ifdef? –

+0

Sorunun dilbilgisini anladığımdan emin değilim. Delegeler olarak uygulanan yöntemler? Belki de bir yöntem örneği yapıştırabilirsiniz ve bu, buna cevap vermenin yolunu belirlememe yardımcı olur. –

+0

Bazı protokoller belirli yöntemleri uygulamanızı gerektirir, örn. 'UITableViewDataSource' uygulamasının - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath; ' –

1

Temsilci atamadığınız sürece, uygulamadan ayrılmanız gerekir. VERSION1'deki SpecialViewController'ınız (eğer V1'de bir SpecialViewController varsa bile) bir temsilciye sahip olmayacak, böylece aramaları hiçbir yere gitmeyecek ve bu da hiçbir yan etkiye yol açmayacaktır.

#ifdef VERSION2 
specialViewController.delegate = self; 
#endif 

Bu yaklaşım işe yaramazsa, neredeyse her hedef için farklı bir MainViewController uygulamanız olması gerektiği gibi görünüyor.

+0

SpecialViewController üstbilgisini sürüm 1'de almak istemiyorum çünkü bu, uygulamanın bu sürümüne derlenmesi gerekmeyen bir sürü başka kod içeriyor. Bunu belirtmek için sorumu güncelleyeceğim. (Üstbilgiyi dahil etmesem ancak arabirim bildiriminden ayrılırsa, derleyici "SpecialViewControllerDelegate için protokol bildirimi bulamıyor." Hatasıyla durur.) – arlomedia

İlgili konular