2015-04-06 42 views
0

我嘗試控制器Swift無法同時滿足prepareForSegue中的約束錯誤?

之間傳遞數據

第一控制器:

class CreateStatmentFieldsController: UITableViewController, DetailsDelegate { 

    @IBOutlet weak var violationLabel: UILabel! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Uncomment the following line to preserve selection between presentations 
     // self.clearsSelectionOnViewWillAppear = false 

     // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
     // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func violationLabelDelegateMethodWithString(string: String) { 
     violationLabel.text = string 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
     if (segue.identifier == "violationSegue") { 
      let controller = segue.destinationViewController as CreateStatmentViolationController 
      controller.delegate = self 
     } 
    } 

第二個控制器:

protocol DetailsDelegate { 
    func violationLabelDelegateMethodWithString(string: String) 
} 

class CreateStatmentViolationController: UITableViewController { 

    var delegate: DetailsDelegate! 

    @IBOutlet weak var backButton: UIBarButtonItem! 
    let violations = ["Парковка вторым рядом", "Парковка под знаком \"остановка запрещена\"", "Парковка на тротуаре", "Парковка на пешеходном переходе", "Парковка на месте для инвалидов"] 


    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    @IBAction func donePressed(b:UIBarButtonItem) { 
     self.dismissViewControllerAnimated(true, completion: {}) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     tableView.deselectRowAtIndexPath(indexPath, animated: true) 

     let row = indexPath.row 
     delegate.violationLabelDelegateMethodWithString("sa")//violations[row] 

     self.dismissViewControllerAnimated(true, completion: {}) 
    } 

    // MARK: - Table view data source 
// 
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     // #warning Potentially incomplete method implementation. 
     // Return the number of sections. 
     return 1 
    } 
// 
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete method implementation. 
     // Return the number of rows in the section. 
     return violations.count 
    } 


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCellWithIdentifier("vilolationCell", forIndexPath: indexPath) as UITableViewCell 
     let row = indexPath.row 
     cell.textLabel?.text = violations[row] 

     // Configure the cell... 

     return cell 
    } 

但後來我打開secont控制器我有錯誤:

Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7fdf9a455e70 H:[UIView:0x7fdf9a49ed70(400)]>", 
    "<NSLayoutConstraint:0x7fdf9a490c80 H:|-(0)-[UIView:0x7fdf9a49ed70] (Names: '|':UIScrollView:0x7fdf9a4958d0)>", 
    "<NSLayoutConstraint:0x7fdf9a490e00 UIScrollView:0x7fdf9a4958d0.centerX == UIView:0x7fdf9a49ed70.centerX>", 
    "<NSLayoutConstraint:0x7fdf9a490730 H:[UIScrollView:0x7fdf9a4958d0]-(0)-| (Names: '|':UIView:0x7fdf9a463bb0)>", 
    "<NSLayoutConstraint:0x7fdf9a491230 H:|-(0)-[UIScrollView:0x7fdf9a4958d0] (Names: '|':UIView:0x7fdf9a463bb0)>", 
    "<NSLayoutConstraint:0x7fdf9a4ae900 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fdf9a463bb0(375)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fdf9a455e70 H:[UIView:0x7fdf9a49ed70(400)]> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
2015-04-07 01:45:52.768 pin[8690:51798] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7fdf9a49ef70 H:[UIView:0x7fdf9a5a7250(390)]>", 
    "<NSLayoutConstraint:0x7fdf9a495c00 H:[UIView:0x7fdf9a49ed70]-(0)-| (Names: '|':UIScrollView:0x7fdf9a4958d0)>", 
    "<NSLayoutConstraint:0x7fdf9a490c80 H:|-(0)-[UIView:0x7fdf9a49ed70] (Names: '|':UIScrollView:0x7fdf9a4958d0)>", 
    "<NSLayoutConstraint:0x7fdf9a490e00 UIScrollView:0x7fdf9a4958d0.centerX == UIView:0x7fdf9a49ed70.centerX>", 
    "<NSLayoutConstraint:0x7fdf9a493b00 H:|-(5)-[UIView:0x7fdf9a5a7250] (Names: '|':UIScrollView:0x7fdf9a4958d0)>", 
    "<NSLayoutConstraint:0x7fdf9a480580 H:[UIView:0x7fdf9a5a7250]-(5)-| (Names: '|':UIScrollView:0x7fdf9a4958d0)>", 
    "<NSLayoutConstraint:0x7fdf9a490730 H:[UIScrollView:0x7fdf9a4958d0]-(0)-| (Names: '|':UIView:0x7fdf9a463bb0)>", 
    "<NSLayoutConstraint:0x7fdf9a491230 H:|-(0)-[UIScrollView:0x7fdf9a4958d0] (Names: '|':UIView:0x7fdf9a463bb0)>", 
    "<NSLayoutConstraint:0x7fdf9a4ae900 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fdf9a463bb0(375)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fdf9a49ef70 H:[UIView:0x7fdf9a5a7250(390)]> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
2015-04-07 01:45:52.774 pin[8690:51798] Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead. 

如果我刪除了「prepareForSegue」func,所有工作,第二視圖ope n並且完美地接近,但我需要將數據發送給第一控制器。

回答

0

這個錯誤似乎是非常直接的,除非它是過分簡化。

因此,這些都是根據調試器的元兇 -

"<NSLayoutConstraint:0x7fdf9a455e70 H:[UIView:0x7fdf9a49ed70(400)]>", 
"<NSLayoutConstraint:0x7fdf9a490c80 H:|-(0)-[UIView:0x7fdf9a49ed70] (Names: '|':UIScrollView:0x7fdf9a4958d0)>", 

"<NSLayoutConstraint:0x7fdf9a495c00 H:[UIView:0x7fdf9a49ed70]-(0)-| (Names: '|':UIScrollView:0x7fdf9a4958d0)>", 
"<NSLayoutConstraint:0x7fdf9a490c80 H:|-(0)-[UIView:0x7fdf9a49ed70] (Names: '|':UIScrollView:0x7fdf9a4958d0)>", 

在這兩種調試器打印的UIView:出現0x7fdf9a49ed70。這可能需要一些玩弄,但似乎這個視圖的高度明確設置爲400。然後,它被限制兩次到它的超級視圖的頂部,一次到超級視圖的底部。

在那個打印輸出下,它對這些感到沮喪。

"<NSLayoutConstraint:0x7fdf9a49ef70 H:[UIView:0x7fdf9a5a7250(390)]>", 
"<NSLayoutConstraint:0x7fdf9a493b00 H:|-(5)-[UIView:0x7fdf9a5a7250] (Names: '|':UIScrollView:0x7fdf9a4958d0)>", 
"<NSLayoutConstraint:0x7fdf9a480580 H:[UIView:0x7fdf9a5a7250]-(5)-| (Names: '|':UIScrollView:0x7fdf9a4958d0)>", 

所以再次,一個視圖被限制在它的superView的頂部和底部。該觀點還有一個明確的高度設定爲390分。

看起來,在segue期間的某個時間點,甚至在segue之後,superView的高度並不等於390或400,因此約束條件無法滿足。如果我是你,我或者不明確地設置視圖的高度,只限制頂部和底部或者設置高度並將它們限制在或者頂部或者底部。所有這三個約束都是不必要的,在這種情況下不可能同時進行。

相關問題