2016-07-22 4 views
4

Ich habe gerade die Xcode 8 Beta heruntergeladen, damit ich einige der neuen iOS 10 Frameworks in meine App einbinden kann. Bei der Konvertierung meines Codes von Swift 2 nach Swift 3 sind jedoch mehrere Fehler aufgetreten. Ich habe alle bis auf einen super nervigen behoben."Kann Wert von Nichtfunktionsart nicht nennen"

Ich erhalte die Fehlermeldung:

Cannot call value of non-function type 'JSQMessagesCollectionView!' at the following line of code:

let cell = super.collectionView(collectionView, cellForItemAtIndexPath: indexPath) as! JSQMessagesCollectionViewCell 

Hier meine ganze Funktion für Kontext ist:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell{ 
    let cell = super.collectionView(collectionView, cellForItemAtIndexPath: indexPath) as! JSQMessagesCollectionViewCell 

    let message = messages[indexPath.item] 

    if message.senderId == senderId { 
     cell.textView!.textColor = UIColor.whiteColor() 
    } else { 
     cell.textView!.textColor = UIColor.blackColor() 
    } 

    return cell 
} 

Hat jemand eine Idee?

Ps.s. Wenn das hilft, hier mein ganzer Codeblock ist:

import UIKit 
import Firebase 
import JSQMessagesViewController 

class ChatViewController: JSQMessagesViewController { 

    // MARK: Properties 

    var rootRef = FIRDatabase.database().reference() 
    var messageRef: FIRDatabaseReference! 

    var messages = [JSQMessage]() 
    var outgoingBubbleImageView: JSQMessagesBubbleImage! 
    var incomingBubbleImageView: JSQMessagesBubbleImage! 

    var userIsTypingRef: FIRDatabaseReference! // 1 
    private var localTyping = false // 2 
    var isTyping: Bool { 
     get { 
      return localTyping 
     } 
     set { 
      // 3 
      localTyping = newValue 
      userIsTypingRef.setValue(newValue) 
     } 
    } 
    var usersTypingQuery: FIRDatabaseQuery! 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Change the navigation bar background color to blue. 
     // navigationController!.navigationBar.barTintColor = UIColor.init(red:252/255, green: 87/255, blue: 68/255, alpha: 1) 
     navigationController!.navigationBar.barTintColor = UIColor.init(red:250/255, green: 69/255, blue: 85/255, alpha: 1) 


     title = "RoastChat" 
     setupBubbles() 
     // No avatars 
     collectionView!.collectionViewLayout.incomingAvatarViewSize = CGSize.zero 
     collectionView!.collectionViewLayout.outgoingAvatarViewSize = CGSize.zero 

     // Remove file upload icon 
     self.inputToolbar.contentView.leftBarButtonItem = nil; 

     messageRef = rootRef.child("messages") 
    } 

    func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 
     observeMessages() 
     observeTyping() 
    } 

    func viewDidDisappear(animated: Bool) { 
    super.viewDidDisappear(animated) 
    } 


    func collectionView(collectionView: JSQMessagesCollectionView!, 
           messageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageData! { 
     return messages[indexPath.item] 
    } 

    func collectionView(collectionView: JSQMessagesCollectionView!, 
           messageBubbleImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageBubbleImageDataSource! { 
     let message = messages[indexPath.item] // 1 
     if message.senderId == senderId { // 2 
      return outgoingBubbleImageView 
     } else { // 3 
      return incomingBubbleImageView 
     } 
    } 

    func collectionView(collectionView: UICollectionView, 
           numberOfItemsInSection section: Int) -> Int { 
     return messages.count 
    } 

    func collectionView(collectionView: JSQMessagesCollectionView!, 
           avatarImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageAvatarImageDataSource! { 
     return nil 
    } 

    private func setupBubbles() { 
     let factory = JSQMessagesBubbleImageFactory() 
     outgoingBubbleImageView = factory?.outgoingMessagesBubbleImage(
      // UIColor.init(red:250/255, green: 69/255, blue: 85/255, alpha: 1)) 
      with: UIColor.init(red:47/255, green: 53/255, blue: 144/255, alpha: 1)) 

     incomingBubbleImageView = factory?.incomingMessagesBubbleImage(
      with: UIColor.jsq_messageBubbleLightGray()) 
    } 

    func addMessage(id: String, text: String) { 
     let message = JSQMessage(senderId: id, displayName: "", text: text) 
     messages.append(message!) 
    } 

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell{ 
     let cell = super.collectionView(collectionView, cellForItemAtIndexPath: indexPath) as! JSQMessagesCollectionViewCell 

     let message = messages[indexPath.item] 

     if message.senderId == senderId { 
      cell.textView!.textColor = UIColor.whiteColor() 
     } else { 
      cell.textView!.textColor = UIColor.blackColor() 
     } 

     return cell 
    } 

    func didPressSendButton(button: UIButton!, withMessageText text: String!, senderId: String!, 
            senderDisplayName: String!, date: NSDate!) { 

     let itemRef = messageRef.childByAutoId() // 1 
     let messageItem = [ // 2 
      "text": text, 
      "senderId": senderId 
     ] 
     itemRef.setValue(String(messageItem)) // 3 

     // 4 
     JSQSystemSoundPlayer.jsq_playMessageSentSound() 

     // 5 
     finishSendingMessage() 

     isTyping = false 

    } 

    private func observeMessages() { 
     // 1 
     let messagesQuery = messageRef.queryLimited(toLast: 25) 
     // 2 
     messagesQuery.observe(.childAdded) { (snapshot: FIRDataSnapshot!) in 
      // 3 
      let id = snapshot.value!["senderId"] as! String 
      let text = snapshot.value!["text"] as! String 

      // 4 
      self.addMessage(id: id, text: text) 

      // 5 
      self.finishReceivingMessage() 
     } 
    } 

    private func observeTyping() { 
     let typingIndicatorRef = rootRef.child("typingIndicator") 
     userIsTypingRef = typingIndicatorRef.child(senderId) 
     userIsTypingRef.onDisconnectRemoveValue() 

     // 1 
     usersTypingQuery = typingIndicatorRef.queryOrderedByValue().queryEqual(toValue: true) 

     // 2 
     usersTypingQuery.observe(.value) { (data: FIRDataSnapshot!) in 

      // 3 You're the only typing, don't show the indicator 
      if data.childrenCount == 1 && self.isTyping { 
       return 
      } 

      // 4 Are there others typing? 
      self.showTypingIndicator = data.childrenCount > 0 
      self.scrollToBottom(animated: true) 
     } 
    } 

    func textViewDidChange(textView: UITextView) { 
     super.textViewDidChange(textView) 
     // If the text is not empty, the user is typing 
     isTyping = textView.text != "" 
    } 

    func collectionView(collectionView: JSQMessagesCollectionView!, attributedTextForCellBottomLabelAtIndexPath indexPath: NSIndexPath!) -> AttributedString! { 
     return AttributedString(string:"test") 
    } 

} 
+0

Sie können Ihren Beitrag bearbeiten, also "löschen und erneut posten" ist kein guter Weg. Und wiederum, haben Sie nicht eine Eigenschaft wie 'var collectionView: JSQMessagesCollectionView!' In Ihrer Klasse? – OOPer

+0

Entschuldigung. In meinem Netzwerk ist etwas passiert, und ich dachte, mit meinem Post ist etwas schief gelaufen. –

+0

Nein, ich habe keine Eigenschaft wie diese –

Antwort

7

Versuchen Sie, die Methode als:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: NSIndexPath) -> UICollectionViewCell{ 
    let cell = super.collectionView(collectionView, cellForItemAt: indexPath) as! JSQMessagesCollectionViewCell 

    let message = messages[indexPath.item] 

    if message.senderId == senderId { 
     cell.textView!.textColor = UIColor.whiteColor() 
    } else { 
     cell.textView!.textColor = UIColor.blackColor() 
    } 

    return cell 
} 

Wenn Sie eine überschriebene Methode korrekt schreiben, beschwert sich Swift über das fehlende Schlüsselwort override. Wenn Sie also keine Warnungen oder Fehler in dieser überschriebenen Methode finden, verwenden Sie sehr wahrscheinlich die Methodensignatur.

Und viele UICollectionViewDataSource s Methoden werden umbenannt, in swift3 "cellForItemAtIndexPath" hat diese Unterschrift:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

So kann Swift keine Methodendefinition findet collectionView(_:cellForItemAtIndexPath:) passend, so die Annahme, collectionView gäbe es eine Eigenschaft sein. (Leider ist es in JSQMessagesViewController deklariert.)

Sie haben möglicherweise diese Art von Implementierungen Mismatching-Methode in Ihrer Klasse. Prüfe sie alle besser.

0

Ok, das ist, wie Zelle richtig erstellen und wiederverwenden:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("reuseId", forIndexPath: indexPath) as! UICollectionViewCell 

    //update cell subviews here 
    return cell 
} 

In Ihrem Fall sollten Sie erstellen und das Rück JSQMessagesCollectionViewCell Instanz

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("reuseId", forIndexPath: indexPath) as! JSQMessagesCollectionViewCell 
+1

Wie hilft mir das im Zusammenhang mit meinem Problem? –

+0

Ich fürchte, dein Fehler ist wegen 'Super' Anruf ... –

Verwandte Themen