所以基本上我在我的社交媒体应用程序项目中设置了一个功能性主提要,用户可以在其中创建帖子。我遇到的主要问题是虽然该功能确实有效,但它并没有发挥最大作用。
这里是一些关键信息:
上面的链接显示了我的主进给控制器的样子。我在用户可以查看帖子的地方设置了它,如果他们想自己制作,他们会按下左上角的按钮并被带到如下所示的 CameraViewController:
在 CameraViewController 中,用户选择图像视图以选择他们想要发布的图像(这很好用),写下他们的标题,然后点击提交帖子以上传帖子。但是,当您尝试查看帖子时,它看起来像以下内容:
出于某种原因,图片没有与帖子的其余部分一起显示。非常感谢有关如何解决此问题的帮助。
这是我的代码
MainFeedViewController
:
import UIKit
import Parse
import AlamofireImage
import MessageInputBar
class FeedViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, MessageInputBarDelegate
{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
let post = posts[section]
let comments = (post["comments"] as? [PFObject]) ?? []
return comments.count + 2
}
func numberOfSections(in tableView: UITableView) -> Int {
return posts.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let post = posts[indexPath.section]
let comments = (post["comments"] as? [PFObject]) ?? []
let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell") as! PostCell
if indexPath.row == 0
{
let user = post["author"] as! PFUser
cell.usernameLabel.text = user.username
cell.captionLabel.text = post["caption"] as! String
let imageFile = post["image"] as! PFFileObject
let urlString = imageFile.url!
let url = URL(string: urlString)!
cell.postImageView.af_setImage(withURL: url)
return cell
}
else if indexPath.row <= comments.count
{
let cell = tableView.dequeueReusableCell(withIdentifier: "CommentCell") as! CommentCell
let comment = comments[indexPath.row - 1]
cell.commentLabel.text = comment["text"] as? String
let user = comment["author"] as! PFUser
cell.nameLabel.text = user.username
return cell
}
else
{
let cell = tableView.dequeueReusableCell(withIdentifier: "AddCommentsCell")!
return cell
}
}
@IBOutlet weak var tableView: UITableView!
let commentBar = MessageInputBar()
var showsCommentBar = false
var posts = [PFObject]()
var selectedPost: PFObject!
override func viewDidLoad() {
super.viewDidLoad()
commentBar.inputTextView.placeholder = "Add a comment..."
commentBar.sendButton.title = "Post"
commentBar.delegate = self
tableView.delegate = self
tableView.dataSource = self
tableView.keyboardDismissMode = .interactive
let center = NotificationCenter.default
center.addObserver(self, selector: #selector(keyboardWillBeHidden(note:)), name: UIResponder.keyboardWillHideNotification, object: nil)
// Do any additional setup after loading the view.
}
@objc func keyboardWillBeHidden(note: Notification)
{
commentBar.inputTextView.text = nil
showsCommentBar = false
becomeFirstResponder()
}
override var inputAccessoryView: UIView? {
return commentBar
}
override var canBecomeFirstResponder: Bool {
return showsCommentBar
}
func messageInputBar(_ inputBar: MessageInputBar, didPressSendButtonWith text: String) {
// Create the comment
let comment = PFObject(className: "Comments")
comment["text"] = text
comment["post"] = selectedPost
comment["author"] = PFUser.current()!
selectedPost.add(comment, forKey: "Comments")
selectedPost.saveInBackground {(success, error) in
if success
{
print("Comment saved")
}
else
{
print("Error saving comment")
}
}
tableView.reloadData()
//Clear and dismiss the input bar
commentBar.inputTextView.text = nil
showsCommentBar = false
becomeFirstResponder()
commentBar.inputTextView.resignFirstResponder()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let query = PFQuery(className:"Posts")
query.includeKeys(["author", "comments", "comments.author"])
query.limit = 20
query.findObjectsInBackground { (posts, error) in
if posts != nil
{
self.posts = posts!
self.tableView.reloadData()
}
}
}
// Allows user to log out of the application.
@IBAction func onLogOut(_ sender: Any)
{
PFUser.logOut()
let main = UIStoryboard(name: "Main", bundle: nil)
let loginVC = main.instantiateViewController(withIdentifier: "LoginViewController")
let delegate = self.view.window?.windowScene?.delegate as! SceneDelegate
delegate.window?.rootViewController = loginVC
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let post = posts[indexPath.section]
let comments = (post["Comments"] as? [PFObject]) ?? []
if indexPath.row == comments.count + 1
{
showsCommentBar = true
becomeFirstResponder()
commentBar.inputTextView.becomeFirstResponder()
selectedPost = post
}
}
}
这是我的代码
CameraViewController:
import UIKit
import AlamofireImage
import Parse
class CameraViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate
{
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var captionField: UITextField!
@IBAction func onSubmitPostButton(_ sender: Any)
{
let post = PFObject(className: "Posts")
post["caption"] = captionField.text!
post["author"] = PFUser.current()!
let imageData = imageView.image!.pngData()
let file = PFFileObject(data: imageData!)
post["image"] = file
post.saveInBackground
{
(success, error) in
if success
{
self.dismiss(animated: true, completion: nil)
print("saved!")
}
else
{
print("Error: \(error?.localizedDescription)")
}
}
}
@IBAction func onCameraButton(_ sender: Any)
{
let picker = UIImagePickerController()
picker.delegate = self
picker.allowsEditing = true
/* if UIImagePickerController.isSourceTypeAvailable(.camera)
{
picker.sourceType = .camera
}
else
{
picker.sourceType = .photoLibrary
} */
picker.sourceType = .photoLibrary
present(picker, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let image = info[.editedImage] as! UIImage
let size = CGSize(width: 300, height: 300)
let scaledImage = image.af_imageScaled(to: size)
imageView.image = scaledImage
dismiss(animated: true, completion: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
initializeHideKeyboard()
// Do any additional setup after loading the view.
}
func initializeHideKeyboard()
{
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissMyKeyboard))
view.addGestureRecognizer(tap)
}
@objc func dismissMyKeyboard()
{
view.endEditing(true)
}
}
最后,
PostCell
和CommentCell
:
import UIKit
class PostCell: UITableViewCell {
@IBOutlet weak var usernameLabel: UILabel!
@IBOutlet weak var captionLabel: UILabel!
@IBOutlet weak var postImageView: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
import UIKit
class CommentCell: UITableViewCell {
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var commentLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
再次感谢所有帮助!