2012-03-20 12 views
7

मैं अपने ऐप में एक नया आइटम जोड़ने के लिए एक व्यू कंट्रोलर लिख रहा हूं। यह मोनो टच के लिए एकदम सही फिट है। डियालॉग, क्योंकि यह मेरे आइटम की प्रासंगिक संपत्ति के क्षेत्र के साथ तालिका आधारित इंटरफ़ेस के साथ आसानी से किया जा सकता है।एक दृश्य नियंत्रक में आप MonoTouch.Dialog दृश्य को कैसे समाहित करते हैं?

इस कोड मैं ऐड आइटम दृश्य दिखाने के लिए वर्तमान में है (सरलीकृत, लेकिन मूल विचार रहता है):

Item item = new Item(); 
TapHandler handler = new TapHandler(); 
BindingContext bc = new BindingContext(handler, item, "Add Item"); 
DialogViewController dv = new DialogViewController(bc.Root, true); 
this.NavigationController.PushViewController(dv, true); 

है कि काम करता है, मैं अगर मैं दृश्य के विवरण को संपुटित सकता है पसंद करेंगे अपने स्वयं के दृश्य नियंत्रक में है, तो कोड ऐसा दिखाई दे सकता:

UIViewController controller = new AddItemViewController(); 
this.NavigationController.PushViewController(controller, true); 

हालांकि, मैं समझ नहीं है कि यह कैसे लागू करने के लिए। मैंने सोचा था कि करने के लिए तार्किक बात DialogViewController का उप-वर्ग बनाना होगा। हालांकि, DialogViewController के सभी रचनाकारों को RootElement की आवश्यकता होती है। इसे प्राप्त करने के लिए, आपको सबसे पहले BindingContext बनाना होगा। चूंकि आप बेस कन्स्ट्रक्टर को कॉल करने से पहले कोई कोड नहीं चला सकते हैं, यह काम खत्म नहीं करता है।

मेरे दूसरा दृष्टिकोण UIViewController के उपवर्ग लागू, DialogViewController बनाते हैं, और मेरी उपवर्ग this.AddChildViewController(dv) और this.View.AddSubView(dv.View) का उपयोग कर के एक बच्चे के रूप संवाद दृश्य नियंत्रक को जोड़ने के लिए किया गया था। हालांकि यह प्रारंभ में काम करता है, यदि आपके पास UINavigationController में नया व्यू कंट्रोलर है, और आप दिनांक तत्व पर क्लिक करते हैं, तो दिनांक दृश्य नेविगेशन नियंत्रक पदानुक्रम के बजाय एक मॉडल पॉपअप के रूप में दिखाई देता है। (यह समझ में आता है, क्योंकि DialogViewController इस डिजाइन में NavigationController पदानुक्रम का हिस्सा नहीं है)।

वहां से मैं अटक गया हूं। मैं उदाहरणों में इस तरह मोनो टच का उपयोग करने के किसी भी उदाहरण नहीं मिला। क्या ऐसा करना संभव है? या यदि यह नहीं है, तो क्या एक अच्छा कारण है कि इस तरह के कोड लिखना बुरा विचार क्यों है?

उत्तर

3

मुझे ऐसा करने का एक तरीका मिला, हालांकि यह थोड़ा गन्दा लगता है (मुझे विचार देने के लिए धन्यवाद poupou)। मैं सिर्फ आधार निर्माता कॉल में अशक्त करने के लिए रूट निर्धारित करते हैं, और फिर यह सेट सीधे contructor विधि में दूर:

class NewItemViewController : DialogViewController 
{ 
    private Item _item; 
    public NewItemViewController(bool pushing) : base(null, pushing) 
    { 
     _item = new Item(); 
     BindingContext bc = new BindingContext(this, _item, "Add Item"); 
     this.Root = bc.Root; 
     // more setup 
    } 
    // more methods 
} 

मुझे पता है आप रूट वस्तु बदलने के लिए, बस इसे उपयोग नहीं कर सका था।

5

आप आधार निर्माता

काफी सही नहीं है यही कारण है कि कॉल करने से पहले किसी भी कोड नहीं चला सकते हैं के रूप में।

यह आदर्श नहीं है, लेकिन आप इस तरह DialogViewController से विरासत और एक खाली RootElement उदाहरण के साथ इसे प्रदान कर सकते हैं,:

public class AddItemViewController : DialogViewController { 
    public AddItemViewController() : base (new RootElement()) { } 
} 

बाद में आप Root संपत्ति के लिए अपने चीजें जोड़ने के (या एक नया RootElement सेट) कर सकते हैं, जैसे

void Populate() 
{ 
    this.Root.Add (new Section() { ... }); 
} 
+0

धन्यवाद, मैंने मैन्युअल रूप से निर्माता में रूट तत्व का उपयोग करने के बारे में नहीं सोचा था। मैंने अपना खुद का जवाब दिया जो कि कन्स्ट्रक्टर में एक नया रूट तत्व स्थापित करके प्रतिबिंब एपीआई के साथ काम करता है। –

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