2010-05-03 8 views
10

मैं एक नए ऐप पर काम कर रहा हूं जिसे मैं आईफोन और आईपैड के लिए सार्वभौमिक बनाना चाहता हूं। मैंने "विंडो-आधारित ऐप बनाएं" विज़ार्ड के साथ शुरुआत की, और इसने "आईफोन" और "आईपैड" समूहों में अलग-अलग ऐप प्रतिनिधियों को बनाया। चूंकि मैं पहले से ही आईफोन देव से परिचित था, मैंने अपनी परियोजना का वह हिस्सा किया, और अब मैं कुछ आईपैड सामान करने के लिए तैयार हूं।मैं आईफोन 3.1.3 सिम्युलेटर पर एक सार्वभौमिक ऐप कैसे चला सकता हूं?

तो ... मैंने अपने आईपैड प्रतिनिधि को UISplitViewController जोड़कर शुरू किया, सक्रिय एसडीके को 3.2 पर स्विच करें, और यह काम करता है! लेकिन जब मैं 3.1.3 पर वापस स्विच करता हूं, और इसे सिम्युलेटर में चलाने की कोशिश करता हूं, बिल्ड और गो विफल रहता है। शुरुआत के लिए, मैं देखता हूं:

...path.../iPad/AppDelegate_Pad.h:13: error: expected specifier-qualifier-list before 'UISplitViewController'

मुझे अपना बेस एसडीके 3.2 पर सेट हो गया है और मेरा परिनियोजन लक्ष्य 3.1.3 पर सेट है। मैंने सोचा कि वह पर्याप्त था। लेकिन मैं यह भी इस विधि दस्तावेज में पाया है सशर्त संकलित करने के लिए:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200 
    MyIPadViewController* vc; 
// Create the iPad view controller 
#else 
    MyIPhoneViewController* vc; 
// Create the iPhone view controller 
#endif 

तो मैं इस हर जगह क्या करना चाहिए? ऐसा लगता है कि जोड़ने के लिए बहुत सारे कोड की तरह लगता है (कि मैं 4.0 के लिए थोड़े समय में छुटकारा पा रहा हूं) इसलिए मुझे लगता है कि मुझे कुछ गलत करना होगा। और, मुझे यह भी नहीं पता कि यह @property या @ सिंथेसिस घोषणाओं जैसी चीज़ों के लिए कैसे काम करता है।

tl; प्रश्न का डॉ संस्करण - क्या मुझे कहीं सेटिंग याद आती है?

+0

प्रोजेमर द्वारा उत्तर अधिक उपयुक्त है, इसे स्वीकार करें ताकि पाठकों को सही उत्तर मिल सके। –

उत्तर

23

इसके विपरीत काफी। एक सार्वभौमिक ऐप आईफोन और आईपैड पर एक ही बाइनरी चलाता है ताकि आप दो संस्करणों के बीच अंतर करने के लिए सशर्त संकलन का उपयोग नहीं कर सकें।

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    // iPad-specific code 
} else { 
    // iPhone-specific code 
} 
+0

तो मैं एक हेडर फ़ाइल की तरह कुछ कैसे जोड़ूं, जहां मैं UISplitViewController प्रकार का एक चर घोषित कर रहा हूं? मुझे लगता है कि इसमें एक if/else ब्लॉक होना चाहिए? – bpapa

+0

नहीं, आप इसे घोषित कर सकते हैं। आईफोन डिवाइस 3.2 के लिए बनाएं और यह आपके 3.0/3.1 डिवाइस पर चलेगा। –

+0

यदि आप आईफोन 3.1 सिम्युलेटर में अपने ऐप का परीक्षण करना चाहते हैं तो सशर्त संकलन ब्लॉक उपयोगी हैं, हालांकि (क्योंकि 3.2 सिम्युलेटर आईफोन मोड में सार्वभौमिक ऐप चलाने का समर्थन नहीं करता है)। –

39

मैं इस सी समारोह का उपयोग करने में मदद करने कोड संक्षिप्त रखें:: लेकिन आप मैक्रो एप्पल दस्तावेज में हवाला देते उपयोग करने की आवश्यकता

BOOL isPad() { 
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); 
} 

एक और बात मैं करता हूँ, जब मैं विभिन्न xib फ़ाइलें आईफोन बनाम आईपैड के लिए।

// Load/create the Delete table cell with delete button 
self.deleteCell = [Utilities loadNib:stripPadSuffixOnPhone(@"DeleteCell~ipad") 
          ClassName:@"DeleteCell" 
        Owner:self]; 

हालात ऐसे ही और अधिक सरल और बहुत कम सशर्त, कोडिंग कर सकते हैं: मैं एक stripPadSuffixOnPhone() फ़ंक्शन मदद करता है कि सरल कोड रखने की है। फिर भी दो बार सब कुछ परीक्षण करना है।

+0

यदि आप अपनी 'उपयोगिता' कक्षा को हमारे साथ साझा करते हैं तो यह बहुत अच्छा होगा! : पी :);) – rptwsthi

+2

वे [github] पर हैं (https://github.com/progrmr/SDK_Utilities/tree/master/Utils) – progrmr

0

यहाँ क्या मेरे लिए काम करता है:

  1. एसडीके 3.2 उपयोग करके आपके एप्लिकेशन बनाएँ।
  2. सक्रिय एसडीके को आईफोन सिम्युलेटर 3.1.3 (या जो कुछ भी) पर स्विच करें।
  3. रन मेनू से डीबग (बिल्ड और डीबग नहीं) का चयन करें।

3.2 के तहत निर्मित द्विआधारी 3.x सिम्युलेटर में पुनर्निर्माण के बिना स्थापित किया जाएगा। जब आप समाप्त कर लें तो अपने सक्रिय एसडीके को 3.2 पर वापस सेट करना न भूलें।

+0

3.2 एसडीके का स्टॉक इंस्टॉल 3.1.x एसडीके हटा देता है, तो आप उन्हें सक्रिय एसडीके के रूप में सेट नहीं कर सकता है। –

संबंधित मुद्दे