質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

510閲覧

記載してあるのに、Value of type ファイル名 has no member 関数名

amazon_106

総合スコア50

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/06/03 11:12

編集2019/06/03 11:43

同じファイル内にある関数Aをself.関数Aで呼び出したい

エラーメッセージ

Value of type 'ChatController' has no member 'fetchMessage'

該当コード

func observeMessages() { guard let currentUid = Auth.auth().currentUser?.uid else { return } guard let chatPartnerId = self.user?.uid else { return } USER_MESSAGES_REF.child(currentUid).child(chatPartnerId).observe(.childAdded) { (snapshot) in let messageId = snapshot.key self.fetchMessage(withMessageId: messageId) //////////ここでValue of type 'ChatController' has no member 'fetchMessage'と警告される////////// } } func fetchMessage(withMessageId messageId: String) { MESSAGES_REF.child(messageId).observeSingleEvent(of: .value) { (snapshot) in guard let dictionary = snapshot.value as? Dictionary<String, AnyObject> else { return } let message = Message(dictionary: dictionary) self.messages.append(message) } } } }

該当ファイル全コード

import UIKit import Firebase private let reuseIdentifier = "ChatCell" class ChatController: UICollectionViewController, UICollectionViewDelegateFlowLayout { // MARK: - Properties var user: User? var messages = [Message]() lazy var containerView: UIView = { let containerView = UIView() containerView.frame = CGRect(x: 0, y: 0, width: 100, height: 55) containerView.addSubview(sendButton) sendButton.anchor(top: nil, left: nil, bottom: nil, right: containerView.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 8, width: 50, height: 0) sendButton.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true containerView.addSubview(messageTextField) messageTextField.anchor(top: containerView.topAnchor, left: containerView.leftAnchor, bottom: containerView.bottomAnchor, right: sendButton.leftAnchor, paddingTop: 0, paddingLeft: 12, paddingBottom: 0, paddingRight: 0, width: 0, height: 0) let separatorView = UIView() separatorView.backgroundColor = .lightGray containerView.addSubview(separatorView) separatorView.anchor(top: containerView.topAnchor, left: containerView.leftAnchor, bottom: nil, right: containerView.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0.5) return containerView }() let messageTextField: UITextField = { let tf = UITextField() tf.placeholder = "Enter message.." return tf }() let sendButton: UIButton = { let button = UIButton(type: .system) button.setTitle("Send", for: .normal) button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14) button.addTarget(self, action: #selector(handleSend), for: .touchUpInside) return button }() // MARK: - Init override func viewDidLoad() { super.viewDidLoad() collectionView.backgroundColor = .white collectionView.register(ChatCell.self, forCellWithReuseIdentifier: reuseIdentifier) configureNavigationBar() observeMessages() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) tabBarController?.tabBar.isHidden = true } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) tabBarController?.tabBar.isHidden = false } override var inputAccessoryView: UIView? { get { return containerView } } override var canBecomeFirstResponder: Bool{ return true } // MARK: - UICollectionView func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: view.frame.width / 2, height: 50) } override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return messages.count } override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! ChatCell cell.backgroundColor = .red return cell } // MARK: - Handlers @objc func handleSend() { uploadMessagesToServer() messageTextField.text = nil } @objc func handleInfoTapped() { print("Handle info tapped") } func configureNavigationBar() { guard let user = self.user else { return } navigationItem.title = user.username let infoButton = UIButton(type: .infoLight) infoButton.tintColor = .black infoButton.addTarget(self, action: #selector(handleInfoTapped), for: .touchUpInside) let infoBarButtonItem = UIBarButtonItem(customView: infoButton) navigationItem.rightBarButtonItem = infoBarButtonItem } // MARK: - API func uploadMessagesToServer() { guard let messageText = messageTextField.text else { return } guard let currentUid = Auth.auth().currentUser?.uid else { return } guard let user = self.user else { return } let creationDate = Int(NSDate().timeIntervalSince1970) // UPDATE: - Safely unwrapped uid to work with Firebase 5 guard let uid = user.uid else { return } var values: [String: AnyObject] = ["toId": user.uid as AnyObject, "fromId": currentUid as AnyObject, "creationDate": creationDate as AnyObject, "read": false as AnyObject] let messageRef = MESSAGES_REF.childByAutoId() // UPDATE: - Safely unwrapped messageKey to work with Firebase 5 guard let messageKey = messageRef.key else { return } messageRef.updateChildValues(values) { (err, ref) in USER_MESSAGES_REF.child(currentUid).child(uid).updateChildValues([messageKey: 1]) USER_MESSAGES_REF.child(uid).child(currentUid).updateChildValues([messageKey: 1]) } func observeMessages() { guard let currentUid = Auth.auth().currentUser?.uid else { return } guard let chatPartnerId = self.user?.uid else { return } USER_MESSAGES_REF.child(currentUid).child(chatPartnerId).observe(.childAdded) { (snapshot) in let messageId = snapshot.key self.fetchMessage(withMessageId: messageId) } } func fetchMessage(withMessageId messageId: String) { MESSAGES_REF.child(messageId).observeSingleEvent(of: .value) { (snapshot) in guard let dictionary = snapshot.value as? Dictionary<String, AnyObject> else { return } let message = Message(dictionary: dictionary) self.messages.append(message) } } } }

やったこと
この記事を参考に変数などの書き直しをしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

// 移動1 func observeMessages() { guard let currentUid = Auth.auth().currentUser?.uid else { return } guard let chatPartnerId = self.user?.uid else { return } USER_MESSAGES_REF.child(currentUid).child(chatPartnerId).observe(.childAdded) { (snapshot) in let messageId = snapshot.key self.fetchMessage(withMessageId: messageId) } } // 移動2 func fetchMessage(withMessageId messageId: String) { MESSAGES_REF.child(messageId).observeSingleEvent(of: .value) { (snapshot) in guard let dictionary = snapshot.value as? Dictionary<String, AnyObject> else { return } let message = Message(dictionary: dictionary) self.messages.append(message) self.collectionView.reloadData() } } // MARK: - API func uploadMessagesToServer() { guard let messageText = messageTextField.text else { return } guard let currentUid = Auth.auth().currentUser?.uid else { return } guard let user = self.user else { return } let creationDate = Int(NSDate().timeIntervalSince1970) // UPDATE: - Safely unwrapped uid to work with Firebase 5 guard let uid = user.uid else { return } var values: [String: AnyObject] = ["toId": user.uid as AnyObject, "fromId": currentUid as AnyObject, "creationDate": creationDate as AnyObject, "read": false as AnyObject] let messageRef = MESSAGES_REF.childByAutoId() // UPDATE: - Safely unwrapped messageKey to work with Firebase 5 guard let messageKey = messageRef.key else { return } messageRef.updateChildValues(values) { (err, ref) in USER_MESSAGES_REF.child(currentUid).child(uid).updateChildValues([messageKey: 1]) USER_MESSAGES_REF.child(uid).child(currentUid).updateChildValues([messageKey: 1]) } // 移動1 // 移動2 } }

これでエラーは解消されました!

投稿2019/06/03 12:47

amazon_106

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問