2014-06-08 26 views
10

Być może robię coś naprawdę głupiego, ale wydaje mi się, że nie mogę używać Kreatora interfejsu do łączenia zmiennych IBOut do widoków niestandardowych, ale tylko w Swift.Swift, iboutlet i niestandardowe formanty

Stworzyłem klasę o nazwie MyView, która rozciąga się od UIView. W moim kontrolerze mam zmienną MyView (zadeklarowaną jako @IBOutlet var newView: MyView). Wchodzę do IB i przeciągam UIView na okno i nadaję mu klasę MyView.

Ilekroć zrobiłem podobny w Celu C, jestem wtedy w stanie kliknąć przycisk Kontroler widoku w górnej części okna aplikacji, wybierz zmienną i przeciągnij ją do kontrolki, aby połączyć te dwa elementy razem. Kiedy próbuję go w Swift, nie chce rozpoznać, że widok jest tam.

Jeśli zmienię klasę zmiennej w kontrolerze na UIView, działa poprawnie. Ale nie z moim niestandardowym widokiem.

Czy ktoś inny ma ten problem? I czy to jest funkcja, czy tylko mój idiotyzm?

Kodeks Kontrolera

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet var newView:MyView 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

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

kod dla widoku

import UIKit 

class MyView: UIView { 

    init(frame: CGRect) { 
     super.init(frame: frame) 
     // Initialization code 
    } 

    /* 
    // Only override drawRect: if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override func drawRect(rect: CGRect) 
    { 
     // Drawing code 
    } 
    */ 

} 
+0

Mam również ten problem, myślę, że to błąd i powinieneś go zgłosić. –

Odpowiedz

11

miałem podobny problem i myślę, że jest to częściowo kwestią buforowanie i częściowo tylko/Swift problem Xcode6. Pierwszym krokiem, który znalazłem, było to, aby upewnić się, że plik .swift kontrolera widoku zostanie załadowany do edytora asystenta przy wyborze "automatyczny".

Po znalezieniu Xcode, że oba pliki są połączone, czasami mogłem sterować przeciąganiem z widoku/przycisku/etc. od IB do pliku .swift, ale często musiał przeciągać z pustego kręgu w rynnie linii @IBOutlet var newView:MyView do widoku, który chciałem dopasować do.

Jeśli nie można uzyskać plik do załadowania w Assistant Editor potem okazało się, że robi, co następuje często działa:

  1. Zdjąć niestandardowej klasy z widoku IB
  2. Clean projekt (cmd + K)
  3. Zamknij/ponownie otwórz Xcode
  4. Prawdopodobnie znowu czyścisz?
  5. Dodaj klasę niestandardową powrotem do widoku
  6. Mam nadzieję, że działa :)

Jeśli to wydaje Ci pół drogi/nigdzie dodać komentarz a ja zobaczę, czy to wyzwala cokolwiek innego zrobiłem

+1

Dzięki. Żaden z nich nie naprawił bezpośredniego problemu (przeciągnięcie z istniejącego @IBOutlet do niestandardowego widoku w oknie IB), ale dostarczył alternatywne podejście - przeciąganie z okna MyView in IB do edytora asystenta, który tworzy (i linki) odpowiedniego IBOutlet. Wydaje się, że osiąga taką samą ogólną potrzebę. – hobart

+0

Hakowanie z pustego kręgu w rynnie załatwiło sprawę! dzięki! – jomafer

3

W moim przypadku brakowało import UIKit, po dodaniu tej linii mogłem ponownie utworzyć IBOutlet z Storyboard.

0

Miałem podobny problem do opisanego w tym wątku. Być może znalazłeś jakieś rozwiązanie, ale nie ktokolwiek, kto spotka się z tym w przyszłości.Znalazłem klucz jest do korzystania z „wymaganą funkcję init” w następujący sposób:

required init(coder aDecoder: NSCoder) { 
    print("DrawerView: required init") 
    super.init(coder: aDecoder)! 
    screenSize = UIScreen.mainScreen().bounds 
    screenWidth = screenSize.width 
    screenHeight = screenSize.height 
    self.userInteractionEnabled = true 
    addCustomGestureRecognizer() 
} 

Ta pełna klasy mojego widoku niestandardowego:

import UIKit Fundacji import

klasa DrawerView : UIView {

var screenSize: CGRect! 
var screenWidth: CGFloat! 
var screenHeight: CGFloat! 

var drawerState: Int = 0 

override init (frame : CGRect) { 
    print("DrawerView: main init") 
    super.init(frame : frame) 
} 

override func layoutSubviews() { 
    print("DrawerView: layoutSubviews") 
    super.layoutSubviews() 
} 

convenience init() { 
    self.init(frame:CGRect.zero) 
} 

required init(coder aDecoder: NSCoder) { 
    print("DrawerView: required init") 
    super.init(coder: aDecoder)! 
    screenSize = UIScreen.mainScreen().bounds 
    screenWidth = screenSize.width 
    screenHeight = screenSize.height 
    self.userInteractionEnabled = true 
    addCustomGestureRecognizer() 
} 

func addCustomGestureRecognizer(){ 
    print("DrawerView: addCustomGestureRecognizer") 
    let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(self.handleDrawerSwipeGesture(_:))) 
    swipeDown.direction = UISwipeGestureRecognizerDirection.Down 
    self.addGestureRecognizer(swipeDown) 
    let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(self.handleDrawerSwipeGesture(_:))) 
    swipeUp.direction = UISwipeGestureRecognizerDirection.Up 
    self.addGestureRecognizer(swipeUp) 
    print("DrawerView self: \(self)") 
} 

func minimizeDrawer(){ 
    UIView.animateWithDuration(0.25, delay: 0.0, options: .CurveEaseOut, animations: { 
     //   let height = self.bookButton.frame.size.height 
     //   let newPosY = (self.screenHeight-64)*0.89 
     //   print("newPosY: \(newPosY)") 
     self.setY(self.screenHeight*0.86) 
     }, completion: { finished in 
      self.drawerState = 0 
      for view in self.subviews { 
       if let _ = view as? UIButton { 
        let currentButton = view as! UIButton 
        currentButton.highlighted = false 
       } else if let _ = view as? UILabel { 
        let currentButton = view as! UILabel 
        if self.tag == 99 { 
         currentButton.text = "hisotry" 
        } else if self.tag == 999 { 
         currentButton.text = "results" 
        } 
       } 
      } 
    }) 
} 

func handleDrawerSwipeGesture(gesture: UIGestureRecognizer) { 
    print("handleDrawerSwipeGesture: \(self.drawerState)") 
    if let swipeGesture = gesture as? UISwipeGestureRecognizer { 
     switch self.drawerState{ 
     case 0: 
      if swipeGesture.direction == UISwipeGestureRecognizerDirection.Down { 
       // nothing to be done, mini and swiping down 
       print("mini: !") 
      } else { 
       // mini and swiping up, should go to underneath city box 
       UIView.animateWithDuration(0.25, delay: 0.0, options: .CurveEaseOut, animations: { 
        let toYPos:CGFloat = 128 + 64 + 8 
        self.setY(toYPos) 
        }, completion: { finished in 
         self.drawerState = 1 
         for view in self.subviews { 
          if let _ = view as? UIButton { 
           let currentButton = view as! UIButton 
           currentButton.highlighted = true 
          } else if let _ = view as? UILabel { 
           let currentLabel = view as! UILabel 
           currentLabel.text = "close" 
          } 
         } 

       }) 
      } 
      break; 
     case 1: 
      if swipeGesture.direction == UISwipeGestureRecognizerDirection.Down { 
       // open and swiping down 
       self.minimizeDrawer() 
      } else { 
       // open and swiping up, nothing to be done 
      } 
      break; 
     default: 
      break; 
     } 
    } 
} 

}

Mam nadzieję, że to pomaga ...

Powiązane problemy