0

私はviewcontrollerにテーブルビューとセルを使ってポストを表示しています。 Firebase(データベースとユーザ)からすべてのデータがフェッチされています。TableViewの投稿を現在のユーザーのログインからのみ表示する

私はフィードビューに到着する前にログイン画面を持っています。

私は、現在のユーザーログインのポットだけをそのテーブルビューコントローラーに表示したいと考えています。そんなことがあるものか ?

私のデータベースは次のように構築している:私は、次を使用しています、私のサインインもページについては

enter image description here

// 
// ViewController.swift 
// MobileAppDemo 
// 
// Created by Mikko Hilpinen on 27.10.2016. 
// Copyright © 2016 Mikkomario. All rights reserved. 
// 

import UIKit 
import FBSDKCoreKit 
import FBSDKLoginKit 
import Firebase 
import FirebaseAuth 
import SwiftKeychainWrapper 

fileprivate struct RegisterInfo 
{ 
let email: String 
let password: String 
} 

class SignInVC: UIViewController 
{ 
@IBOutlet weak var emailField: UITextField! 
@IBOutlet weak var passwordField: UITextField! 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
} 

override func viewDidAppear(_ animated: Bool) 
{ 
    if User.currentUserId != nil 
    { 
     print("AUTH: USING EXISTING KEYCHAIN") 
     User.startTrackingCurrentUser() 
     //performSegue(withIdentifier: "ToFeed", sender: nil) 
    } 
    else 
    { 
     print("AUTH: NO EXSTING KEYCHAIN") 
    } 
} 

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

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
{ 
    print("AUTH: Preparing for segue \(segue.identifier)") 

    if let registrationVC = segue.destination as? RegisterVC 
    { 
     print("AUTH: Found registration VC") 

     if let info = sender as? RegisterInfo 
     { 
      print("AUTH: Sending email (\(info.email)) and password (\(info.password.characters.count) chars) information: ") 
      registrationVC.setBaseInfo(email: info.email, password: info.password) 
     } 
    } 
} 

@IBAction func signInButtonPressed(_ sender: UIButton) 
{ 
    if let email = emailField.text, let password = passwordField.text 
    { 
     FIRAuth.auth()?.signIn(withEmail: email, password: password) 
     { 
      (user, error) in 

      if let error = error 
      { 
       // TODO: Handle other errors here as well 
       switch FIRAuthErrorCode(rawValue: error._code)! 
       { 
       case .errorCodeUserNotFound: 
        print("AUTH: USER NOT FOUND -> CREATING NEW USER") 
        print("AUTH: Sending email \(email) and password \(password.characters.count) characters") 
        self.performSegue(withIdentifier: "RegisterUser", sender: RegisterInfo(email: email, password: password)) 
       default: print("AUTH: ERROR IN EMAIL LOGIN \(error)") // TODO: Inform user 
       } 
      } 
      else 
      { 
       print("AUTH: EMAIL AUTH SUCCESSFUL") 
       User.currentUserId = user?.uid 
       User.startTrackingCurrentUser() 
       self.performSegue(withIdentifier: "ToFeed", sender: nil) 
      } 
     } 
    } 
    // TODO: Inform user that the field contents are missing 
} 


fileprivate func firebaseAuth(with credential: FIRAuthCredential) 
{ 
    if FIRAuth.auth() == nil 
    { 
     print("AUTH: NO AUTH SERVICE AVAILABLE") 
    } 

    FIRAuth.auth()?.signIn(with: credential) 
    { 
     (user, error) in 

     if let error = error 
     { 
      print("AUTH: UNABLE TO AUTHENTICATE TO FIREBASE") 
      print("AUTH: \(error)") 
     } 
     else 
     { 
      if let user = user 
      { 
       print("AUTH: SUCCESSFULLY AUTHENTICATED WITH FIREBASE") 

       // Updates current user data 
       var userName = "User" 
       var image: UIImage? 

       if let retrievedName = user.displayName 
       { 
        userName = retrievedName 
       } 
       if let retrievedImageUrl = user.photoURL 
       { 
        if let data = try? Data(contentsOf: retrievedImageUrl) 
        { 
         image = UIImage(data: data) 
        } 
       } 

       User.post(uid: user.uid, provider: user.providerID, userName: userName, image: image) 
       { 
        user in 

        User.currentUser = user 
        User.startTrackingCurrentUser() 

        self.performSegue(withIdentifier: "ToFeed", sender: nil) 
       } 
      } 
     } 
    } 
} 
} 

をテーブルビューに自分のデータを表示するには、私はよこのビューコントローラを使用して:

// 
// Feed.swift 
// MobileAppDemo 
// 
// Created by Mikko Hilpinen on 31.10.2016. 
// Copyright © 2016 Mikkomario. All rights reserved. 
// 

import UIKit 
import FirebaseAuth 
import FirebaseDatabase 
import FirebaseStorage 
import SwiftKeychainWrapper 
import SwiftyJSON 

var posts = [Post]() 
var selectedIndexPath: Int = 0 

class FeedVC: UIViewController, UITableViewDataSource, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITableViewDelegate { 

@IBOutlet weak var feedTableView: UITableView! 

private var readPosts: ObserveTask? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    feedTableView.dataSource = self 
    feedTableView.delegate = self 

    readPosts = Post.observeList(from: Post.parentReference.queryOrdered(byChild: Post.PROPERTY_CREATED)) { 
     observedPosts in 

     posts = observedPosts.reversed() 
     self.feedTableView.reloadData() 
    } 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return posts.count 
} 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = self.feedTableView.dequeueReusableCell(withIdentifier: "MessageCell")! as UITableViewCell 

    let imageView = cell.viewWithTag(1) as! UIImageView 
    let titleLabel = cell.viewWithTag(2) as! UILabel 

    titleLabel.text = posts[indexPath.row].title 
    titleLabel.numberOfLines = 0 

    Storage.getImage(with: posts[indexPath.row].imageUrl){ 
     postPic in 
     imageView.image = postPic 
    } 

    return cell 

} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    selectedIndexPath = indexPath.row 
    self.performSegue(withIdentifier: "push", sender: self) 
    self.feedTableView.reloadData() 
} 
} 

最後に私のセルs:

// 
// MessageCell.swift 
// MobileAppDemo 
// 
// Created by Mikko Hilpinen on 31.10.2016. 
// Copyright © 2016 Mikkomario. All rights reserved. 
// 

import UIKit 
import FirebaseStorage 

class MessageCell: UITableViewCell 
{ 

@IBOutlet weak var messageImageView: UIImageView! 
@IBOutlet weak var messageTextView: UITextView! 
@IBOutlet weak var titleTextView: UITextView! 
@IBOutlet weak var linkbutton: UIButton! 


private var post: Post! 

func configureCell(tableView: UITableView, post: Post) 
{ 
    self.post = post 

    // Basic info 
    titleTextView.text = post.title 
    messageTextView.text = post.caption 

    // Post user 
    User.get(id: post.creatorId) 
    { 
     postCreator in 


    } 



    // Image 
    Storage.getImage(with: post.imageUrl) 
    { 
     postPic in 

     self.messageImageView.image = postPic 
     // Row height changes so table needs to be reset 
     tableView.beginUpdates() 
     tableView.endUpdates() 
    } 
} 
} 

私はそれをどのように達成することができますか?それは信じられない:) :)

ありがとうたくさん! queryOrdered(byChild:)を使用してPostsデータベースを参照すると

答えて

0

queryEqual(toValue:)を追加し、User.currentUserIdと比較します。

readPosts = Post.observeList(from: Post.parentReference 
             .queryOrdered(byChild: Post.PROPERTY_CREATED) 
             .queryEqual(toValue: User.currentUserId)) { 

    observedPosts in 

    posts = observedPosts.reversed() 
    self.feedTableView.reloadData() 
} 
+0

おかげで、 うーん...私はそのような表示された細胞情報からデータを持っています。 ... しかし面白い私が使用している場合: の記事で { observedPosts readPosts =( "o9epRntmZaNe2LdTUJV2g1zr54C2")から:Post.parentReference.queryOrdered(byChild:。: "作成者")queryEqual(toValueの)Post.observeListを= observedPosts.reversed() self.feedTableView.reloadData() } } 1人のユーザーIDの値を手動で入力することで機能します。 。 。どのように動的な方法で値を呼び出すと思いますか? – tibewww

+0

@tibewwwあなたは 'User.currentUserId'に値を格納していますが、なぜ動作していないのですか?' User.currentUserId'の値を表示して、値があるかどうかを確認してください。 –

+0

魅力が好き、ありがとう!!! – tibewww

関連する問題