2017-01-21 2 views
0

У меня есть этот вид всплеска, и у меня возникают проблемы с use3dtouch, потому что у меня есть ошибка, говорящая мне, что у splashview нет члена-члена 'use3dtouch'. Вот код.Элемент экземпляра не может быть использован

Вот изображение ошибки

The error

import Foundation 
import UIKit 

class VPSplashView : UIView { 
var vp = VPSplashView() 
private lazy var __once:() = { 
     if VPSplashView.traitCollection.forceTouchCapability ==  UIForceTouchCapability.unavailable 
     { 
      let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(VPSplashView.longPressed(_:))) 
      self.addGestureRecognizer(longPressRecognizer) 
      VPSplashView.use3DTouch = false 
     } else { 
      VPSplashView.use3DTouch = true 
     } 

    }() 

static func addSplashTo(_ view : UIView, menuDelegate: MenuDelegate) -> VPSplashView{ 
    let splashView = VPSplashView(view: view) 
    splashView.backgroundColor = UIColor.clear 
    splashView.isExclusiveTouch = true 

    if (view.isKind(of: UIScrollView.classForCoder())){ 
     (view as! UIScrollView).canCancelContentTouches = false 
    } 

    splashView.menu?.delegate = menuDelegate 
    return splashView 
} 

// MARK: Initialization 
var menu : VPSplashMenu? 

fileprivate var use3DTouch : Bool = true 

var onceToken: Int = 0 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

init(view: UIView){ 
    super.init(frame:view.bounds) 
    view.addSubview(self) 
    self.menu = VPSplashMenu.init(center: self.center) 
} 

func setDataSource(_ source: MenuDataSource!){ 
    self.menu?.dataSource = source 
} 

override func layoutSubviews() { 
    super.layoutSubviews() 
    self.superview?.bringSubview(toFront: self) 

    if (self.superview != nil){ 
     self.setup() 
    } 
} 

fileprivate func setup(){ 
    _ = self.__once; 
} 

// MARK: Long Press Handling 
func longPressed(_ sender: UILongPressGestureRecognizer) 
{ 
    switch sender.state { 
    case .began: 
     let centerPoint = sender.location(in: self) 
     menu?.movedTo(centerPoint) 
     menu?.showAt(self) 
     menu?.squash() 

    case .ended: 
     menu?.cancelTap() 
     menu?.removeFromSuperview() 
    case .changed: 
     let centerPoint = sender.location(in: self) 
     menu?.handleTap((menu?.convert(centerPoint, from: self))!) 
    default: 
     menu?.removeFromSuperview() 
    } 
} 

// MARK: Touch Handling 
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if (use3DTouch == true){ 
     var centerPoint : CGPoint = CGPoint.zero 
     for touch in touches { 
      centerPoint = touch.location(in: self) 
      menu?.movedTo(centerPoint) 
      menu?.showAt(self) 
     } 
    } 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if (use3DTouch == true){ 
     for touch in touches { 
      let centerPoint = touch.location(in: self) 
      if (menu?.shown == false){ 
       menu?.movedTo(centerPoint) 
       if (touch.force > minimalForceToSquash){ 
        menu?.squash() 
       } 
      } else { 
       menu?.handleTap((menu?.convert(centerPoint, from: self))!) 
      } 
     } 
    } 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if (use3DTouch == true){ 
     menu?.hide() 
    } 
} 

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if (use3DTouch){ 
     menu?.hide() 
    } 
} 
} 
+0

, как я должен делать это – Rosalind

+0

вы можете помочь мне – Rosalind

+0

, так что я должен делать «вар SplashV = VPSplashView (use3dTouch) – Rosalind

ответ

0

Ваш добавленный код осветленной некоторые важные вещи, чтобы написать ответ ...

  • traitCollection является свойство экземпляра который указан в UITraitEnvironment, где UIView соответствует

  • use3DTouch является экземпляром свойство, которое объявляется в VPSplashView явно

  • longPressed(_:) это метод экземпляра, который объявлен в VPSplashView в явном виде

Третий не имеет решающего значения в этом случае, но первый два явно связаны с сообщением об ошибке, которое вы получили: Участник экземпляра не может быть использован.

Когда вы получаете доступ к членам экземпляра (в данном случае, свойствам экземпляра), вам необходимо указать ссылку на экземпляр до .memberName, а не имя класса.

В вашем случае, self, кажется, подходящий пример:

private lazy var __once:() = { 
    //### 
    if self.traitCollection.forceTouchCapability ==  UIForceTouchCapability.unavailable 
    { 
     let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(self.longPressed(_:))) 
     self.addGestureRecognizer(longPressRecognizer) 
     //### 
     self.use3DTouch = false 
    } else { 
     //### 
     self.use3DTouch = true 
    } 
}() 

Но вы делаете вещи гораздо более сложным образом, чем это необходимо, так что вам, возможно, потребуется еще несколько исправлений.

Одним из важнейшей вещи эта линия:

var vp = VPSplashView() 

Это может вызвать некоторые проблемы во время выполнения (даже если вы решили некоторое время компиляции проблемы) и vp не используются. Лучше удалите его.

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