2014-06-08 12 views
10

मैं कुछ सचमुच बेवकूफ कर रहा हूं, लेकिन मैं कस्टम दृश्यों में आईबीओलेटलेट चर को जोड़ने के लिए इंटरफेस बिल्डर का उपयोग करने में सक्षम नहीं हूं, लेकिन केवल स्विफ्ट में।स्विफ्ट, iboutlet और कस्टम नियंत्रण

मैंने MyView नामक एक क्लास बनाई है, जो UIView से फैली हुई है। मेरे नियंत्रक में, मुझे एक MyView चर मिला है (@IBOutlet var newView: MyView) के रूप में घोषित किया गया है। मैं आईबी में जाता हूं और खिड़की पर एक UIView खींचता हूं और इसे MyView का एक वर्ग देता हूं।

जब भी मैंने उद्देश्य सी में ऐसा किया है, तो मैं ऐप विंडो के शीर्ष पर व्यू कंट्रोलर बटन पर क्लिक करने में सक्षम हूं, चर का चयन करें और दोनों को एक साथ जोड़ने के लिए इसे नियंत्रण में खींचें। जब मैं इसे स्विफ्ट में आज़माता हूं, तो यह पहचानने से इंकार कर देता है कि दृश्य वहां है।

यदि मैं नियंत्रक में चर के वर्ग को UIView में बदलता हूं, तो यह ठीक काम करता है। लेकिन मेरे कस्टम व्यू के साथ नहीं।

क्या किसी और को यह समस्या मिली है? और क्या यह एक विशेषता है, या सिर्फ मेरी मूर्खता है? दृश्य

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

मुझे भी इस समस्या का सामना करना पड़ रहा है, मुझे लगता है कि यह एक बग है और आपको इसकी रिपोर्ट करनी चाहिए। –

उत्तर

11

के लिए नियंत्रक

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. 
    } 
} 

कोड के लिए

कोड मैं एक ऐसी ही समस्या थी गया है, और मुझे लगता है कि यह आंशिक रूप से एक कैशिंग मुद्दा और आंशिक रूप से सिर्फ एक Xcode6/स्विफ्ट मुद्दा है। मुझे प्राप्त पहला चरण आवश्यक था कि "स्वचालित" चुनते समय दृश्य नियंत्रक में दृश्य नियंत्रक। स्विफ्ट फ़ाइल लोड की जाएगी।

एक्सकोड के साथ यह पता चलता है कि दोनों फाइलें जुड़ी हुई हैं, मैं कभी-कभी दृश्य/बटन/आदि से नियंत्रण-खींच सकता हूं। आईबी से .swift फ़ाइल में, लेकिन @IBOutlet var newView:MyView लाइन के गटर में खाली सर्कल से अक्सर खींचना पड़ा था, जिसे मैं चाहता था कि मैं इसे मिलान करना चाहता हूं।

आप सहायक संपादक में लोड करने के लिए फ़ाइल नहीं मिल सकता है तो मैंने पाया कि निम्नलिखित कर अक्सर काम करेगा:

  1. (आईबी दृश्य
  2. स्वच्छ परियोजना से कस्टम वर्ग निकालें cmd + k)
  3. एक्सकोड को बंद/दोबारा खोलें
  4. संभवतः फिर से साफ करें?
  5. दृश्य पर वापस कस्टम कक्षा जोड़ें
  6. आशा है कि यह काम करता है :)

है कि आप आधे रास्ते पाने के लिए लगता है/कहीं कोई टिप्पणी दें और अगर यह किसी और मैंने किया था कुछ भी चलाता है मैं देखेंगे

+1

धन्यवाद। इसमें से कोई भी वास्तव में प्रत्यक्ष समस्या को ठीक नहीं करता है (आईबी विंडो में एक मौजूदा @IBOutlet से कस्टम दृश्य में खींच रहा है), लेकिन एक वैकल्पिक दृष्टिकोण प्रदान किया - आईबी विंडो में MyView से सहायक संपादक में खींच रहा है, जो बनाता है (और लिंक) प्रासंगिक आईबीओलेट। ऐसा लगता है कि वही समग्र आवश्यकता प्राप्त होती है। – hobart

+0

गटर में खाली सर्कल से हुकिंग चाल चल रही थी! धन्यवाद! – jomafer

3

मेरे मामले में import UIKit गायब था, इस लाइन को जोड़ने के बाद मैं स्टोरीबोर्ड से फिर से आईबीओटलेट बना सकता था।

0

मुझे इस धागे में वर्णित एक के लिए एक ही समस्या है। हो सकता है कि आपको शायद कोई समाधान न मिले, लेकिन भविष्य में इसका सामना करने वाले किसी भी व्यक्ति को।मैंने पाया कुंजी के रूप में निम्नानुसार "आवश्यक init" समारोह का उपयोग करने के लिए है:

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() 
} 

यह मेरा कस्टम दृश्य का पूरा वर्ग:

आयात UIKit आयात फाउंडेशन

वर्ग 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; 
     } 
    } 
} 

}

उम्मीद है कि यह मदद करता है ...

संबंधित मुद्दे