2017-01-24 5 views
-1

Я пытаюсь изучить базовую iOS Swift3 и использовать метод раскадровки. Я работал над кодом в the tutorial on this website.Segue не имеет имени ViewController

Создав ссылки для раскадровки для FirstCustomSegue, я кодирую следующее: Я добавил комментарии для всех 6 ошибок:

class FirstCustomSegue: UIStoryboardSegue { 

override func perform() { 
    // Value of type 'FirstCustomSegue' has no member 'sourceGameViewController' 
    var firstVCView = self.sourceGameViewController.view as UIView! 
    var secondVCView = self.destinationGameViewController.view as UIView! 

    // Cannot call value of non-function type 'UIScreen' 
    let screenWidth = UIScreen.mainScreen().bounds.size.width 
    let screenHeight = UIScreen.mainScreen().bounds.size.height 

    secondVCView.frame = CGRectMake(0.0, screenHeight, screenWidth, screenHeight) 

    // Cannot call value of non-function type 'UIApplication' 
    let window = UIApplication.sharedApplication().keyWindow 
    window?.insertSubview(secondVCView, aboveSubview: firstVCView) 

    // Value of type 'FirstCustomSegue' has no member 'sourceGameViewController' (This is in the (Finished) line, of course) 

    UIView.animateWithDuration(0.4, animations: {() -> Void in 
     firstVCView.frame = CGRectOffset(firstVCView.frame, 0.0, -screenHeight) 
     secondVCView.frame = CGRectOffset(secondVCView.frame, 0.0, -screenHeight) 

    }) { (Finished) -> Void inself.sourceGameViewController.presentGameViewController(self.destinationGameViewController as UIViewController, 
       animated: false, 
       completion: nil) 
    } 
} 

} 

кажется мне, как будто есть недостающее соединение где-то, но я не могу найти его. Возможно, некоторые из них - это изменение в iOS10? Некоторые поиски предположили, что это может быть проблемой с битами UIScreen.mainScreen(), но я не могу найти ничего, что бы разрешило проблемы.

+0

В учебнике вы следующее IOS 8, который является кодирование в Swift 2.x. Вы, с другой стороны, кодируете в Swift 3. всякий раз, когда вы видите это ** Невозможно вызвать значение нефункционного типа «UIScreen», это означает, что вещь, которую вы вызываете **, не является ** функцией, поэтому вам следует удалить '()'. если вы наберете 'UIScreen.', а затем начнете вводить m ... вы увидите, что он имеет только свойство main, а не как функцию. Такая же проблема для вашего 'UIApplicaton' должна быть' UIApplication.shared' ... правило большого пальца - это когда вы используете старые учебники, не копируете и не вставляете, а вводите их и смотрите, обновляется ли sytanx. – Honey

+0

Кроме того, ошибка ** Значение типа «FirstCustomSegue» не имеет исходного элемента sourceGameViewController ** означает, что ваш FirstCustomSegue ** не имеет ** никакого * свойства * (также известного как член) с именем 'ViewController'. Возможно, вы назвали свою собственность чем-то еще и ее опечаткой или не обладаете таким свойством во ВСЕХ – Honey

+0

Спасибо - это очень полезно. Теперь я знаю, как продвигаться вперед с этими вещами! Весьма признателен. – CAgrippa

ответ

1

Я переписал ваш код в стиле Swift 3.0. Но вы используете Xcode 8? Если вы используете Xcode 8, компилятор может помочь вам исправить ошибки синтаксиса.

class FirstCustomSegue: UIStoryboardSegue { 

    override func perform() { 
     let firstVCView: UIView = self.source.view 
     let secondVCView: UIView = self.destination.view 

     let screenWidth = UIScreen.main.bounds.size.width 
     let screenHeight = UIScreen.main.bounds.size.height 
     secondVCView.frame = CGRect(x: 0.0, y: screenHeight, width: screenWidth, height: screenHeight) 

     let window = UIApplication.shared.keyWindow 
     window?.insertSubview(secondVCView, aboveSubview: firstVCView) 

     UIView.animate(withDuration: 0.4, animations: { 
      firstVCView.frame = firstVCView.frame.offsetBy(dx: 0.0, dy: -screenHeight) 
      secondVCView.frame = secondVCView.frame.offsetBy(dx: 0.0, dy: -screenHeight) 
     }, completion: { [unowned self] finished in 
      self.source.present(self.destination, animated: false, completion: nil) 
     }) 
    } 
} 

Вы также можете преобразовать свой код в последний синтаксис Swift самостоятельно.
Edit> Преобразовать> Для текущего Swift Синтаксис ...
https://i.stack.imgur.com/niayG.png

0

Вы должны использовать

UIApplication.shared

и

UIScreen.main

в Swift 3. (Не еще комментариев.)

+0

Выдает одно и то же сообщение об ошибке: «Невозможно вызвать значение non-function type X» – CAgrippa

+0

Я скопировал ваш класс и переименовал «UIScreen.mainScreen(). Bounds.size.width» в «UIScreen.main.bounds.size. width ", он определенно компилируется. – hoshy

Смежные вопросы