2017-02-03 10 views
0

はここに私の状況です:IOS Firebase - セグエデータ内の「詳細はポスト」コントローラ

私はFirebaseからテーブル(タイトルと画像)を介して複数の投稿を一覧表示するコントローラ「フィード」を持っています。ボタンのタッチで

enter image description here

、それがポストから私がデータをご希望の「フィード詳細」コントローラ、(タイトル画像とキャプション)に持参表示され、以前に(親)をクリックしました。何も私はフィードの詳細コントローラに到着したときにフェッチされていない現時点では

enter image description here

(スクリーンショット2を参照)...

どのようにそれは以前にクリックした項目から詳細を取得することは可能でしょうか? ?

: - もちろん以下のようではない足データ

私のデータベース構造に見えるん

// 
// FeedVC.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 

class FeedVC: UIViewController, UITableViewDataSource,  UIImagePickerControllerDelegate, UINavigationControllerDelegate 
{ 
@IBOutlet weak var addImageView: UIImageView! 
@IBOutlet weak var feedTableView: UITableView! 
@IBOutlet weak var titleInputView: InputTextView! 

@IBOutlet weak var captionInputView: InputTextView! 


private var posts = [Post]() 
private var imagePicker = UIImagePickerController() 
private var imageSelected = false 

private var readPosts: ObserveTask? 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    imagePicker.delegate = self 
    imagePicker.allowsEditing = true 

    feedTableView.dataSource = self 

    feedTableView.rowHeight = UITableViewAutomaticDimension 
    feedTableView.estimatedRowHeight = 320 

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

     self.posts = posts.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, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
    if let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as? MessageCell 
    { 
     let post = posts[indexPath.row] 
     cell.configureCell(tableView: tableView, post: post) 
     return cell 
    } 
    else 
    { 
     fatalError() 
    } 
} 

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 
{ 
    if let image = info[UIImagePickerControllerEditedImage] as? UIImage 
    { 
     addImageView.image = image 
     imageSelected = true 
    } 
    picker.dismiss(animated: true, completion: nil) 
} 

@IBAction func selectImagePressed(_ sender: AnyObject) 
{ 
    present(imagePicker, animated: true, completion: nil) 
} 

@IBAction func postButtonPressed(_ sender: AnyObject) 
{ 
    guard let caption = captionInputView.text, !caption.isEmpty else 
    { 
     // TODO: Inform the user 
     print("POST: Caption must be entered") 
     return 
    } 

    guard let title = titleInputView.text, !title.isEmpty else 
    { 
     // TODO: Inform the user 
     print("POST: title must be entered") 
     return 
    } 

    guard let image = addImageView.image, imageSelected else 
    { 
     print("POST: Image must be selected") 
     return 
    } 

    guard let currentUserId = User.currentUserId else 
    { 
     print("POST: Can't post before logging in") 
     return 
    } 

    imageSelected = false 
    addImageView.image = UIImage(named: "add-image") 
    captionInputView.text = nil 
    titleInputView.text = nil 

    // Uploads the image 
    if let imageData = UIImageJPEGRepresentation(image, 0.2) 
    { 
     let imageUid = NSUUID().uuidString 
     let metadata = FIRStorageMetadata() 
     metadata.contentType = "image/jpeg" 

     Storage.REF_POST_IMAGES.child(imageUid).put(imageData, metadata: metadata) 
     { 
      (metadata, error) in 

      if let error = error 
      { 
       print("STORAGE: Failed to upload image to storage \(error)") 
      } 

      if let downloadURL = metadata?.downloadURL()?.absoluteString 
      { 
       // Caches the image for faster display 
       Storage.imageCache.setObject(image, forKey: downloadURL as NSString) 

       print("STORAGE: Successfully uploaded image to storage") 
       _ = Post.post(caption: caption, title: title, imageUrl: downloadURL, creatorId: currentUserId) 
      } 
     } 
    } 
} 

@IBAction func signOutButtonPressed(_ sender: AnyObject) 
{ 
    // Doesn't listen to posts anymore 
    readPosts?.stop() 

    try! FIRAuth.auth()?.signOut() 
    User.currentUserId = nil 
    dismiss(animated: true, completion: nil) 
} 
} 

私はfeeddetailsのコードを使用しています:

は現在、これが私のフィードコントローラであります

どのように詳細ビューでデータを取得できますか?もし誰かが私にそのプロセスを説明できたら、それは本当に素晴らしいでしょう!

ありがとうございました。

----- EDIT:-------- Retterdesdialogsへ

おかげで、私は、コードとアプリケーションの開始を更新しましたが、私はnothinをLinkBut​​tonコントロールボタンをクリックしたときに発生し、アプリケーションのクラッシュ:

コンソール表示: 'UIViewController'(0x1087f6758)の値を 'MobileAppDemo.FeedDetailsController'(0x104bc34a0)にキャストできませんでした。

私はコードのために今持っている:

feedVC.swift(すべてのポストが上場あります):

// 
// FeedVC.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 

    class FeedVC: UIViewController, UITableViewDataSource,  UIImagePickerControllerDelegate, UINavigationControllerDelegate 
{ 
@IBOutlet weak var addImageView: UIImageView! 
@IBOutlet weak var feedTableView: UITableView! 
@IBOutlet weak var titleInputView: InputTextView! 
@IBOutlet weak var linkbutton: UIButton! 

@IBOutlet weak var captionInputView: InputTextView! 


private var posts = [Post]() 
private var imagePicker = UIImagePickerController() 
private var imageSelected = false 

private var readPosts: ObserveTask? 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    imagePicker.delegate = self 
    imagePicker.allowsEditing = true 

    feedTableView.dataSource = self 

    feedTableView.rowHeight = UITableViewAutomaticDimension 
    feedTableView.estimatedRowHeight = 320 

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

     self.posts = posts.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, cellForRowAt indexPath: IndexPath) -> UITableViewCell 


// here you need to add 
{ 


    if let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as? MessageCell 
    { 

     let post = posts[indexPath.row] 
     cell.configureCell(tableView: tableView, post: post) 
     cell.linkbutton.tag = indexPath.row 
     cell.linkbutton.addTarget(self, action: #selector(FeedVC.toFeedDetailAction(_:)), for: .touchUpInside) 
     return cell 

    } 
    else 
    { 
     fatalError() 
    } 
} 

func toFeedDetailAction(_ sender: UIButton) { 

    let FeedDetailsController = self.storyboard?.instantiateViewController(withIdentifier: "FeedDetailsIdentifier") as! FeedDetailsController 
    FeedDetailsController.post = posts[sender.tag] 
    self.navigationController?.pushViewController(FeedDetailsController, animated: true) 
} 

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 
{ 
    if let image = info[UIImagePickerControllerEditedImage] as? UIImage 
    { 
     addImageView.image = image 
     imageSelected = true 
    } 
    picker.dismiss(animated: true, completion: nil) 
} 

@IBAction func selectImagePressed(_ sender: AnyObject) 
{ 
    present(imagePicker, animated: true, completion: nil) 
} 

@IBAction func postButtonPressed(_ sender: AnyObject) 
{ 
    guard let caption = captionInputView.text, !caption.isEmpty else 
    { 
     // TODO: Inform the user 
     print("POST: Caption must be entered") 
     return 
    } 

    guard let title = titleInputView.text, !title.isEmpty else 
    { 
     // TODO: Inform the user 
     print("POST: title must be entered") 
     return 
    } 

    guard let image = addImageView.image, imageSelected else 
    { 
     print("POST: Image must be selected") 
     return 
    } 

    guard let currentUserId = User.currentUserId else 
    { 
     print("POST: Can't post before logging in") 
     return 
    } 

    imageSelected = false 
    addImageView.image = UIImage(named: "add-image") 
    captionInputView.text = nil 
    titleInputView.text = nil 

    // Uploads the image 
    if let imageData = UIImageJPEGRepresentation(image, 0.2) 
    { 
     let imageUid = NSUUID().uuidString 
     let metadata = FIRStorageMetadata() 
     metadata.contentType = "image/jpeg" 

     Storage.REF_POST_IMAGES.child(imageUid).put(imageData, metadata: metadata) 
     { 
      (metadata, error) in 

      if let error = error 
      { 
       print("STORAGE: Failed to upload image to storage \(error)") 
      } 

      if let downloadURL = metadata?.downloadURL()?.absoluteString 
      { 
       // Caches the image for faster display 
       Storage.imageCache.setObject(image, forKey: downloadURL as NSString) 

       print("STORAGE: Successfully uploaded image to storage") 
       _ = Post.post(caption: caption, title: title, imageUrl: downloadURL, creatorId: currentUserId) 
      } 
     } 
    } 
} 

@IBAction func signOutButtonPressed(_ sender: AnyObject) 
{ 
    // Doesn't listen to posts anymore 
    readPosts?.stop() 

    try! FIRAuth.auth()?.signOut() 
    User.currentUserId = nil 
    dismiss(animated: true, completion: nil) 
} 
} 

、あなたがクリックすると詳細が表示されているFeedDetails.swift(ボタンは、ボタンクラスを持っていますのViewVCコントローラーからのLinkBut​​ton:

// 
// FeedDetailsController.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 FeedDetailsController: UIViewController 
{ 
@IBOutlet weak var emailField: UITextField! 
@IBOutlet weak var passwordField: UITextField! 

var post: Post! 


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 
} 

@IBAction func facebookButtonPressed(_ sender: UIButton) 
{ 
    // (Already logged in to FB) 
    if let fbAccessToken = FBSDKAccessToken.current() 
    { 
     print("AUTH: Already logged in to FB") 
     firebaseAuth(with: FIRFacebookAuthProvider.credential(withAccessToken: fbAccessToken.tokenString)) 
    } 
    else 
    { 
     let facebookLogin = FBSDKLoginManager() 
     facebookLogin.logIn(withReadPermissions: ["public_profile", "email"], from: self) 
     { 
      (result, error) in 

      if let error = error 
      { 
       print("AUTH: UNABLE TO AUTHENTICATE WITH FACEBOOK") 
       print("AUTH: \(error)") 
      } 
      else if let result = result 
      { 
       if result.isCancelled 
       { 
        print("AUTH: USER CANCELLED FACEBOOK AUTH") 
       } 
       else 
       { 
        print("AUTH: FACEBOOK AUTH SUCCESS") 
        let credential = FIRFacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString) 
        self.firebaseAuth(with: credential) 
       } 
      } 
     } 
    } 
} 

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

答えて

0

1)あなたはIBOutletを通じてまたはプログラム

ボタンにアクセスできるようにする必要があります

2)ボタンをindexPathセルに設定します。あなたはボタンのタグを持っているので、あなたがあなたの投稿・アレイから

func toFeedDetailAction(_ sender: UIButton) { 

    let feedDetailsViewController = self.storyboard?.instantiateViewController(withIdentifier: "FeedDetailsIdentifier") as! FeedDetailsViewController 
    feedDetailsViewController.post = posts[sender.tag] 
    self.navigationController?.pushViewController(feedDetailsViewController, animated: true) 
} 
をフィードを知っているのであなたが、あなたがあなたのフィードを識別することができ、ボタンを押したときに)それに

let post = posts[indexPath.row] 
cell.configureCell(tableView: tableView, post: post) 
// here you need to add 
cell.yourButton.tag = indexPath.row 
cell.yourButton.addTarget(self, action: #selector(FeedViewController.toFeedDetailAction(_:)), for: .touchUpInside) 
return cell 

3アクションを行と追加あなたのFeedDetailsViewControllerで

4)ポスト

とFeedDetailsViewControllerにしたい、これまで何

var post: Post! 

5)を追加

希望:

+0

こんにちはTerrerdesdialogs、あなたの時間のTHanks本当にありがとう! 1 /私のfeedVC.swiftでOKですか?@IBOutlet弱いリンクボタン:UIButton! ような?ボタンのクラスであるlinkbutton 2 /このコードはどこに入れますか?まだフィードVC.swiftに?上記のコードのどの部分ですか?ただのXcodeとiOSで始まる どうもありがとう、イム:) :) – tibewww

+0

編集:#selector(FeedViewController.toFeedDetailAction: cell.linkbutton.tag = indexPath.row cell.linkbutton.addTarget(自己、アクションを追加しながら、 (_ :))、用:.touchUpInside) リターンセル i「はタイプ 'の値を取得するには、MessageCell LinkBut​​tonコントロール '私はそれが編集3 :( – tibewww

+0

を修正取得するために管理していない 、' はメンバーを持っていない' [OK]を1と2を修正しました 3 /私はこのエラーが発生しています: 'FeedDetailsController.post型の値はメンバーの投稿がありません? 私はvar postを投稿しました:投稿!私のFeedDetailsControllerでは、なぜ私は本当に理解できないのですか? – tibewww

関連する問題