2017-07-20 4 views
0

Je travaille sur le cours de développement de Stanford IOS en ligne et j'ai un bug que je ne sais pas comment gérer. Lorsque je passe à la vue de détail dans le contrôleur de vue partagée, je suis en mesure de définir les paramètres du détail UIView à partir du détail UIViewController dans le didSet de sortie à la vue. Plus tard, lorsque j'essaie d'accéder ou de muter la vue de détail du contrôleur, la variable de vue (outlet) est nulle même si la vue est toujours à l'écran et répond aux gestes. Cette méthode est la préparation de la vue du maître dans le contrôleur d'affichage diviséVoir le point de vente après le segue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    let destinationViewController = segue.destination 
    if let graphViewController = destinationViewController as? GraphViewController { 
     if let identifier = segue.identifier{ 
      switch identifier { 
      case "DisplayGraph": 
       graphViewController.function = funcForGraphView(_:) 
      default: 
       break 
      } 
     } 
    } 
} 

Ceci est le contrôleur de vue de détail. J'ai commenté les parties intéressantes.

class GraphViewController: UIViewController { 
@IBOutlet weak var graphView: GraphView!{ 
    didSet{ 
     graphView.addGestureRecognizer(UITapGestureRecognizer(target: graphView, action: #selector(graphView.tap(recognizer:)))) 
     graphView.addGestureRecognizer(UIPanGestureRecognizer(target: graphView, action: #selector(graphView.pan(recognizer:)))) 
     graphView.addGestureRecognizer(UIPinchGestureRecognizer(target: graphView, action: #selector(graphView.zoom(recognizer:)))) 
     graphView.function = cos //I can set variables in the view here 
     // After this didSet I am no longer able to set or read any variables from the graphView 
    } 
} 
var function: ((Double)->(Double))? { 
    didSet{ 
     if let newfunction = function { 
      graphView.function = newfunction // I can not set or access variables in the view here since for some reason graphView is nil 
     } 
    } 
} 

Et ceci est la variable pertinente dans la vue détaillée

var function: ((Double) -> Double)? { 
    didSet{ 
     setNeedsDisplay() 
    } 
} 

Storyboard Picture Toute aide serait grandement appréciée et nous espérons que ce n'est pas une question stupide. Si plus d'informations seraient utiles, faites le moi savoir. Merci!

Répondre

0

Il sera nul parce que votre vue n'est pas complètement chargée pendant que vous êtes dans le panneau de contrôle. de sorte que vous besoin de passer comme ci-dessous:

Dans GraphViewController

var yourValue : ((Double)->(Double))? 

override func viewDidLoad() { 
     super.viewDidLoad() 
     self.function = yourValue 
} 

Valeur de consigne tandis que la navigation

if let identifier = segue.identifier{ 
      switch identifier { 
      case "DisplayGraph": 
       graphViewController.yourValue = funcForGraphView(_:) 
      default: 
       break 
      } 
     } 
+0

Merci beaucoup qui était beaucoup d'aide. – harryejp

+0

@harryejp Marquer comme accepter si vous travaillez pour vous – KKRocks