2016-08-15 6 views
0

Я следую за this классом в Swift и приложениях для строительства.Swift 2: Селектор в UIPinchGestureRecognizer: Как получить доступ к func из другого класса

В 43:30 на видео инструктор учит, как настроить UIPinchGestureRecognizer, который принимает функцию из другого файла в своем Селекторе.
Это код инструктор использует:

@IBOutlet weak var faceView: FaceView! { 
     didSet { 
      faceView.addGestureRecognizer(UIPinchGestureRecognizer(target: faceView, action: #selector(FaceView.changeScale(_:)))) 
      updateUI() 
     } 
    } 

Я получаю 2 ошибки:

Expected expression in list of expressions,

и:

Expected ',' separator.

Я попытался изменить #selector к Selector не повезло.

функция changeScale:

func changeScale(recognizer: UIPinchGestureRecognizer) 
    { 
     switch recognizer.state { 
     case .Changed, .Ended: 
      scale *= recognizer.scale //scale is the displayed image scale 
      recognizer.scale = 1.0 
     default: 
      break 
     } 

Если я окружать Selector аргумент в кавычки, происходит сбой приложения, когда я ущипнуть, давая следующее сообщение об ошибке:

unrecognized selector sent to instance.

+0

где вы объявили 'changeScale'? В вашем классе 'FaceView' или в контроллере представления? – pbodsk

+0

@pbodsk Я объявил это в FaceView. – Marcel

+0

ОК ...Я просто попытался создать небольшой пример, и он работает на моей машине (которую вы, вероятно, не хотите слышать :)). Я попытался оглядеться, чтобы увидеть, есть ли у других проблемы с одинаковой проблемой, и похоже, что у некоторых были проблемы со старыми версиями Xcode, поэтому ... какую версию Xcode вы используете? Вам нужно хотя бы Xcode 7.3 (http://stackoverflow.com/questions/36347570/swift-error-expected-separator-and-expected-expression-in-list-of-expre). – pbodsk

ответ

1

Как можно видеть в комментариях выше, версия Xcode равна 7.2, а синтаксис #selector был введен в Xcode 7.3 и поэтому недоступен здесь. Это означает, что вы должны использовать синтаксис «старый» Selector.

Разница заключается в том, что вы просто передаете строки Selector с именем вашей функции, а затем : для каждого из параметров, которые требуется вашей функции. Вам необходим один параметр (recognizer), поэтому в вашем случае строка выглядит следующим образом:

"changeScale:" 

Таким образом, вы будете использовать:

Selector("changeScale:") 

И вы в конечном итоге с:

@IBOutlet weak var faceView: FaceView! { 
    didSet { 
      faceView.addGestureRecognizer(UIPinchGestureRecognizer(target: faceView, action: Selector("changeScale:"))) 
     } 
    } 

Как вы можете видеть, это склонность к ошибкам ... одна опечатка и kaboom! Вот почему новый синтаксис #selector является прекрасным улучшением ... извините ... не пытайтесь втирать его.

Надеюсь, это вам поможет.

+0

Это удаляет ошибку из xcode. Но это не вызывает функцию changeScale – rubai

2

Я бегу Xcode 8.1 (8B62) и iPhone 5 имитатор на MacBook Air (Ver 100.11.6)

Это код, который я использовал, который работает

faceView.addGestureRecognizer(UIPinchGestureRecognizer(target:faceView, 

action:#selector(FaceView.changeScale(recognizer:)))) 

Когда вы ущипнуть лицо , убедитесь, что на «коврике мыши» нажмите «Option + Left Click + Movement». Я делаю ошибку, просто нажимая «Option + Movement на коврике мыши», и она не работает.

Надеюсь, это поможет.

+0

Это работает для меня с Xcode 8.2 beta (8C30a). – rubai