2012-10-24 21 views
50

'बाधा प्रारूप पार्स करने में असमर्थ' मैं एक subview है कि मैं स्क्रीन को घुमाने के दौरान बंद हो जाता है रखना चाहते हैं, तो मैं NSLayoutConstraint प्रकार डाल करने का फैसला किया है: Superview को
शीर्ष

ट्रेलिंग अंतरिक्ष स्पेस टू सुपरव्यू
बटन स्पेस सुपरव्यू
मैं UITableViewCell के उप-वर्ग में हूं। मैं कोड लिखा था, लेकिन मैं निम्नलिखित त्रुटि मिलती है:
'NSInvalidArgumentException', कारण:

'NSInvalidArgumentException', reason: 'Unable to parse constraint format: 
self is not a key in the views dictionary. 
H:[self.arrows]-5-| 


CustomCell.m में मेरे कोड है:

self.arrows = [[Arrows alloc]initWithFrame:CGRectMake(self.contentView.bounds.size.width-30, self.bounds.origin.y+4, 30, self.contentView.bounds.size.height-4)]; 

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(self.arrows, self.contentView); 
NSMutableArray * constraint=[[NSMutableArray alloc]init]; 
[constraint addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H: [self.arrows]-5-|" options:0 metrics:nil views:viewsDictionary]]; 
[constraint addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-1-[self.arrows]" options:0 metrics:nil views:viewsDictionary]]; 
[constraint addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"[V: [self.arrows]-1-|" options:0 metrics:nil views:viewsDictionary]]; 
[self.arrows addConstraints:constraint]; 

उत्तर

121

ऐसा लगता है कि autolayout दृश्य प्रारूप को पार्स इंजन व्याख्या करने के तरीके लग रहा है valueForKeyPath: का उपयोग करने जैसी कुंजी की बजाय आपके वीएफएल बाधा में एक कुंजीपैथ होने के लिए "."।

NSDictionaryOfVariableBindings(...) आपके पैरामीटर को ब्रांड्स में जो कुछ भी लेता है उसे ले जाएगा और ऑब्जेक्ट के साथ एक शाब्दिक कुंजी में इसका मूल्य (मूल्य: @{"self.arrow" : self.arrow}) में अनुवाद करेगा। VFL के मामले में, autolayout सोच रही है आप एक subdictionary (या subobject) arrow की एक प्रमुख है के साथ अपने दृश्य शब्दकोश में self नाम के एक कुंजी है,

@{ 
    @"self" : @{ @"arrow" : self.arrow } 
} 

जब आप सचमुच व्यवस्था की व्याख्या करना चाहता था आपकी कुंजी "self.arrow" के रूप में।

आमतौर पर, जब मैं एक उदाहरण चर इस तरह मनुष्य उपयोग कर रहा हूँ, मैं आम तौर पर अपने ही शब्दकोश बनाने के बजाय इतनी तरह NSDictionaryOfVariableBindings(...) का उपयोग कर अंत:

NSDictionary *views = @{ @"arrowView" : self.arrow } 

या

NSDictionary *views = NSDictionaryOfVariableBindings(_arrow); 

कौन होगा आपको स्वयं के बिना अपने वीएफएल में दृश्य का उपयोग करने की अनुमति देता है और आप अभी भी जानते हैं कि आप किस बारे में बात कर रहे हैं:

NSArray *arrowHorizConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[arrowView]-5-|" options:0 metrics:nil views]; 

या

NSArray *arrowHorizConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[_arrow]-5-|" options:0 metrics:nil views]; 

एक सामान्य नियम के रूप में, मैं उन में एक बिंदु (.) के साथ कुंजी किसी भी प्रणाली भ्रम या डिबगिंग बुरे सपने से बचने के लिए शब्दकोश के लिए नहीं सीखा है।

+1

आपको बहुत बहुत धन्यवाद है –

+25

सुंदर हास्यास्पद है कि डॉक्स का उपयोग करते हुए 'NSDictionaryOfVariableBindings' शब्दकोश बनाने के लिए का उदाहरण देते हैं, लेकिन यह है कि यह किसी भी संपत्ति या IBOutlets साथ काम नहीं करेंगे उल्लेख नहीं है –

+0

जोनाथन, मैं इस से बहुत उलझन में था। दस्तावेज़ विशेष रूप से उस विधि का उपयोग करने के लिए राज्य करते हैं। मैंने अभी सोचा कि यह स्वयं को हटाने के लिए पर्याप्त स्मार्ट था। स्वचालित रूप से कुंजी का हिस्सा। – Nailer

7

मेरी चाल केवल एक स्थानीय चर घोषित करना है जो संपत्ति के लिए सिर्फ एक और सूचक है, और इसे NSDictionaryOfVariableBindings में डाल दें।

@interface ViewController() 
@property (strong) UIButton *myButton; 
@property (strong) UILabel *myLabel; 
@end 

... 

UIButton *myButtonP = self.myButton; 
UILabel *theLabelP = self.myLabel; 
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(myButtonP, myLabelP); 

P प्रत्यय "सूचक" के लिए है।

+2

यह NSDictionaryOfVariable बाइंडिंग्स के बिंदु को अस्वीकार करता है, जो चीजों को कम करने के लिए है। 'NSDictionary * views = @ {@" myButton "का उपयोग क्यों नहीं करें: self.myButton, @" myLabel ": self.myLabel} 'इसके बजाए? यह छोटा है। –

+0

यदि आपके पास अन्य विचारों की लंबी सूची है और 'self.view' के संदर्भ को सम्मिलित करना चाहते हैं, तो यह बिंदु को बिल्कुल अस्वीकार नहीं करता है। – davidf2281

+0

_myButton और _myLabel का उपयोग करने के बजाय ऐसा क्यों करें? या ivars नाम अलग करने के लिए संश्लेषण? –

-1

सुनिश्चित करें कि आप अपने मुख्य दृश्य में आवश्यक सबव्यूव जोड़ने के बाद बाधाएं जोड़ते हैं। इस मुद्दे से संबंधित ज्ञान प्राप्त करने में कुछ समय लगा।

1

सबसे आसान समाधान है कि आप अपनी कक्षा से चर के लिए गेटर्स से बचें और सुपरक्लास से वैरिएबल को स्थानीय चर के रूप में फिर से परिभाषित करें।अपने उदाहरण के लिए एक समाधान

UIView *contentView = self.contentView; 
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_arrows, contentView);