2013-01-04 31 views
6

मेरे पास 10.8.2 पर एक्सकोड के नवीनतम संस्करण में इंटरफ़ेस बिल्डर के माध्यम से तालिका दृश्य के NSTableCellView के सेटअप के साथ एक दृश्य-आधारित NSTableView है।पुनः लोड करने पर एनएसटीबल व्यू के साथ असंतोषजनक बाधाएं

जब मैं NSTableView पर -reloadData कहते हैं, इसके साथ दुर्घटनाओं:

Unable to simultaneously satisfy constraints: 
(
    "<NSAutoresizingMaskLayoutConstraint:0x105cb8bf0 h=--& v=--& V:[NSTableRowView:0x105ca7020(0)]>", 
    "<NSAutoresizingMaskLayoutConstraint:0x10596aa30 h=--& v=-&- V:[GroupTableRowView]-(2)-| (Names: GroupTableRowView:0x100185860, '|':NSTableRowView:0x105ca7020)>", 
    "<NSAutoresizingMaskLayoutConstraint:0x1058d9770 h=--& v=-&- V:|-(1)-[GroupTableRowView] (Names: GroupTableRowView:0x100185860, '|':NSTableRowView:0x105ca7020)>" 
) 

Will attempt to recover by breaking constraint 
<NSAutoresizingMaskLayoutConstraint:0x10596aa30 h=--& v=-&- V:[GroupTableRowView]-(2)-| (Names: GroupTableRowView:0x100185860, '|':NSTableRowView:0x105ca7020)> 

मैं उनकी कमी के रूप में शामिल किसी भी दृश्य NSTableView द्वारा प्रबंधित किया जाता पर स्वत: आकार बदलने मुखौटा अनुवाद बंद नहीं कर सकते। यह स्पष्ट है कि बाधाएं विरोधाभासी हैं क्योंकि NSTableRowView में संभवतः 0 ऊंचाई नहीं हो सकती है जबकि GroupTableRowView पर अन्य दो बाधाओं को संतुष्ट करता है जो पर्यवेक्षण (पंक्ति दृश्य?) के बीच अनिवार्य पैडिंग निर्दिष्ट करते हैं। मुझे यकीन नहीं है कि इसे कैसे हल किया जाए, किसी भी अंतर्दृष्टि की सराहना की जाएगी। धन्यवाद!

अद्यतन: मुझे एक कामकाज मिला। मुद्दा यह है कि किसी कारण से NSTableRowView को तालिका दृश्य पर -reloadData को कॉल करते समय {0, 0} का फ्रेम आकार भेजा जा रहा था। मैं NSTableRowView उपclass में -setFrameSize: को ओवरराइड करता हूं और आकार {0,0} नहीं होने पर केवल प्रतिक्रियाकर्ता श्रृंखला को संदेश पास करता है।

- (void)setFrameSize:(NSSize)newSize 
{ 
    if (!NSEqualSizes(newSize, NSZeroSize)) 
     [super setFrameSize:newSize]; 
} 

उपवर्ग का उपयोग करने के लिए कस्टम उपवर्ग का एक उदाहरण वापस जाने के लिए NSTableViewDelegate के -tableView:rowViewForRow: विधि को लागू।

- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row 
{ 
    id rowView = [[GroupTableRowView alloc] init]; 
    // configure any custom properties 
    return rowView; 
} 

तालिका दृश्य आईबी में पूरी तरह से बनाया गया है, तो आप बस एक नया NSView अपने तालिका दृश्य में खींचें और इसे अपने NSTableRowView उपवर्ग के लिए कस्टम वर्ग है की स्थापना की और बदल सकते हैं यह NSTableViewRowViewKey

+0

टक्कर। दृश्य आधारित तालिका दृश्यों का उपयोग करते समय मैंने एक ही समस्या में भाग लिया है। क्या आपने अपनी समस्या पर कोई प्रगति की है? –

+0

मैंने अपने प्रश्न को एक समाधान के साथ अपडेट किया। मैं अभी भी देख रहा हूं कि NSTableCellView को {{0,0} 'क्यों भेजा जा रहा है, लेकिन मैं इसे ऐप्पल को बग रिपोर्ट सबमिट करने के लिए डेमो ऐप में पुन: उत्पन्न नहीं कर सकता। – Andrew

+0

@ एंड्रयू मुझे लगता है कि यह वास्तव में समाधान है, इसके लिए धन्यवाद! – NSAddict

उत्तर

1

को उपयोगकर्ता इंटरफ़ेस आइटम पहचानकर्ता है मेरे पास एक ही समस्या थी और यह हमेशा मुझे पागल कर देता था ..

मैंने इसे आपके कोड का उपयोग करके हल किया है, लेकिन के बजाय NSTableRowView उपclassing। तालिका को स्वचालित रूप से अपनी कस्टम पंक्ति दृश्य का उपयोग करने दें, अपनी तालिका में एक कस्टम NSView जोड़ें। अपनी कक्षा को अपनी कस्टम पंक्ति दृश्य में सेट करें और, महत्वपूर्ण, इसके पहचानकर्ता को NSTableViewRowViewKey पर सेट करें।

इस विशेष पहचानकर्ता के साथ, तालिका स्वचालित रूप से इसे एक पंक्ति दृश्य के रूप में उपयोग करती है।

+0

आप सही हैं, मैं वापस गया और अपना कोड देखा और मैं वास्तव में NSTableRowView subclassing हूँ। धन्यवाद! – Andrew

1

मुझे एक समान समस्या थी, लेकिन पंक्ति ऊंचाई की बजाय स्तंभ चौड़ाई के साथ। reloadData के तुरंत बाद दृश्य-आधारित NSTableView एस की कोशिकाओं पर असंतोषजनक ऑटोलायआउट बाधाएं बढ़ रही थीं। मेरे मामले में, यह NSTableColumn पर न्यूनतम चौड़ाई सेटिंग के कारण सेल में बाधाओं के लिए न्यूनतम चौड़ाई रखने के लिए बहुत छोटा था। तो इसी तरह की किसी भी समस्या के लिए, मैं पहले इसे सत्यापित करूँगा।

"रोचक" बात यह है कि इस reloadData के लिए केवल एक मुद्दा था, सामान्य लेआउट के लिए नहीं है, क्योंकि वहाँ NSTableView है कि यह सामान्य रूप से कभी भी एक सेल है कि छोटे बनाने के प्रयास करने से रोका की चौड़ाई पर बाधाओं थे। लेकिन जब reloadData को बुलाया गया था, तो जाहिर है, पहले यह स्पष्ट रूप से फिट करने के लिए कॉलम का आकार बदलने से पहले (यदि आपके पास टेबल सेट करने के लिए सेट किया गया है) से पहले फ्रेम फ्रेम आकार के साथ अपने फ्रेम आकार के साथ एक नया सेल बनाता है। तो भले ही सब ठीक काम करने के लिए दिखाई दिया, फिर भी reloadData के बाद असंतोषजनक बाधाओं के बारे में त्रुटि को थका दिया जाएगा, क्योंकि सेल दृश्य की प्रारंभिक चौड़ाई पैडिंग आदि के लिए बहुत छोटी थी।

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

+0

बहुत बहुत धन्यवाद! इसने मुझे दर्दनाक डिबगिंग के घंटे बचाए। –