2012-07-03 15 views
5

बदलें मैं एक कस्टम नियंत्रण पर काम कर रहा हूं जो विभिन्न हैंडल प्रस्तुत करता है। मैं यह सुनिश्चित करना चाहता हूं कि चयनित हैंडल में एक जेड-इंडेक्स ग्राटर है, फिर अन्य हैंडल करते हैं।एनएसवी व्यू सबव्यू ऑर्डर

क्या दृश्य आदेश स्वैप करने का कोई तरीका है? मुझे यह फ़ंक्शन sortSubviewsUsingFunction:context: मिला लेकिन मुझे समझ में नहीं आया कि यह सही समाधान है या नहीं।

+0

आप सभी सबव्यूव के माध्यम से लूप कर सकते हैं और उन्हें प्राप्त कर सकते हैं और आप दृश्य पर प्रत्येक एन्डेक्स को सम्मिलित कर सकते हैं ... –

उत्तर

-5

जैसा कि मैं आपसे प्रश्न पूछता हूं, आप जो भी देखते हैं उसे लूप कर सकते हैं और उन्हें सरणी में जोड़ सकते हैं, तो आपके पास उन्हें इंडेक्स के साथ देखने के लिए उन्हें जोड़ने का विकल्प है .. और आपके पास निम्न कार्य हैं।

[self.view insertSubview:view1 atIndex:2] 
[self.view insertSubview:view1 aboveSubview:0] 
[self.view insertSubview:view1 belowSubview:1] 

तो आप इसके आदेश के रूप में आप की जरूरत स्वैप कर सकते हैं ..

+4

ऐसा लगता है कि ओपी 'एनवीवीव' के बारे में पूछ रहा था, यह केवल 'UIView के –

-3

हाँ, sortSubviewsUsingFunction:context: तुम क्या करने के लिए देख रहे हैं क्या कर सकते हैं, लेकिन यह overkill हो सकता है अगर सभी आप चाहें तो एक विशेष के लिए है दूसरों (अनियंत्रित) के शीर्ष पर बैठने के लिए देखें। उस स्थिति में, आपको UIView की विधि देखना चाहिए। इस तरह, आप संभाल को लाने के लिए अपने IBAction में कुछ इस तरह कर सकता है:

[self.view bringSubviewToFront: handle]; 

कि संभाल मान लिया जाये कि एक वस्तु है कि है UIView से/विरासत है। यदि यह वह नहीं है जिसे आप ढूंढ रहे हैं, तो हर तरह से, sortSubviewsUsingFunction:context: के साथ जाएं, इस स्थिति में आपको प्रत्येक सबव्यू के लिए अलग-अलग टैग गुणों को बदलने की आवश्यकता होगी, और तदनुसार क्रमबद्ध करें।

+0

के लिए है ओएसएक्स गैर आईओएस पर ... लेकिन +1 क्योंकि मैं इसी तरह के कार्यों की खोज कर सकता हूं। – MatterGoal

+0

आह, उस स्थिति में, यह थोड़ा हैकिश दिखता है, लेकिन आप निम्न कार्य करने के लिए हमेशा एक श्रेणी जोड़ सकते हैं: http://stackoverflow.com/questions/4236304/os-x-version-of-bringsubviewtofront –

+0

धन्यवाद, मुझे यह समझने की जरूरत है कि प्रदर्शन के संदर्भ में यह समाधान बेहतर है, तो sortSubviewsUsingFunction – MatterGoal

5

यह बहुत आसान है, आप एक ऐसे फ़ंक्शन का उपयोग कर सकते हैं जो 2 सबव्यूज़ की तुलना उन्हें पुन: व्यवस्थित करने के लिए करता है। यहां व्यू के टैग के आधार पर एक सरल समाधान:

[mainView sortSubviewsUsingFunction:(NSComparisonResult (*)(id, id, void*))compareViews context:nil]; 

... 

NSComparisonResult compareViews(id firstView, id secondView, void *context) { 
    int firstTag = [firstView tag]; 
    int secondTag = [secondView tag]; 

    if (firstTag == secondTag) { 
     return NSOrderedSame; 
    } else { 
     if (firstTag < secondTag) { 
      return NSOrderedAscending; 
     } else { 
      return NSOrderedDescending; 
     } 
    } 
} 
+0

मुझे खेद है, लेकिन मैं तुलना दृश्य समारोह के प्रोटोटाइप को समझ नहीं पा रहा हूं। क्या यह उद्देश्य-सी और सी के मिश्रण का उपयोग करता है? – MatterGoal

4

कोको ने ओएसएक्स 10.10 के बाद से एक नया एपीआई पेश किया।
यह आईओएस के समान है, आप नीचे या ऊपर प्रदर्शित होने के लिए एक और दृश्य पारित कर सकते हैं।

[self.view addSubview:myView positioned:NSWindowBelow relativeTo:myViewInBackground]; 

documentation चेकआउट; मेरे अनुभव में NSWindowBelow और NSWindowAbove हालांकि उलट दिया गया था।

+1

आपको माता-पिता से पहले child.removeFromSuperview() का उपयोग करने की आवश्यकता नहीं होगी।स्वैप करने के लिए addSubview (बच्चे, सूचकांक)? और फिर एनएसवी व्यू क्लास में सॉर्टस्यूब्यूज यूजिंगफंक्शन का उपयोग करने के लिए और अधिक उपयुक्त नहीं होगा? कुछ परीक्षण के बाद – eonist

+0

। बस दृश्य जोड़ना फिर से काम करता है। हटाने की जरूरत नहीं है। – eonist

+0

डॉक्स का कहना है कि यह 10.0 से 10.10 के बाद से रहा है। तो 10.10 से नीचे के लक्ष्यों के साथ भी प्रयोग योग्य। – Daniel

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