有没有一种方法来获取UITableViewCell的ID?

时间:2019-11-20 22:19:46

标签: ios swift uitableview

我的问题:如果用户在表视图单元格中按下按钮,我想打开某种Profil。单元数据是从Parse下载的。

这个想法是基于Instagram的,如果您单击Insta上的用户名按钮,则会打开发布该图像的用户的个人资料。我想创建相同的代码,但是我无法创建代码来获取用户。你能帮我吗?

这里有一些代码:

import UIKit
import Parse
class HomeController: UIViewController, UITableViewDelegate, UITableViewDataSource {
private let reuseIdentifer = "FeedCell"
var delegate: HomeControllerDelegate?
var newCenterController: UIViewController!
let tableView = UITableView()
//Für Parse:
var users = [String: String]()
var comments = [String]()
var usernames = [String]()
var lastnames = [String]()
var imageFiles = [PFFileObject]()
var wischen: UISwipeGestureRecognizer!
var wischen2: UISwipeGestureRecognizer!
override func viewDidLoad() {
    super.viewDidLoad()
        view.backgroundColor = .white
        getData()
        configureNavigationBar()
        configurateTableView()

    wischen = UISwipeGestureRecognizer()
    wischen.addTarget(self, action: #selector(handleMenuToggle))
    wischen.direction = .right
    wischen.numberOfTouchesRequired = 1
    view.addGestureRecognizer(wischen)

    wischen2 = UISwipeGestureRecognizer()
    wischen2.addTarget(self, action: #selector(handleMenuToggle))
    wischen2.direction = .left
    wischen2.numberOfTouchesRequired = 1
    view.addGestureRecognizer(wischen2)
}
@objc func handleMenuToggle() {
    delegate?.handleMenuToggle(forMenuOption: nil)
}

@objc func showProfile() {
    let vc: AProfileViewController!
    vc = AProfileViewController()
    vc.modalPresentationStyle = .fullScreen
    present(vc, animated: true)
}

func configureNavigationBar() {
    navigationController?.navigationBar.barTintColor = .darkGray
    navigationController?.navigationBar.barStyle = .black
    navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.font: UIFont(name: "Noteworthy", size: 22)!, NSAttributedString.Key.foregroundColor: UIColor.white]
    //navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]

    navigationItem.title = "Mobile Job Board"
    navigationItem.leftBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "ic_menu_white_3x").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(handleMenuToggle))
    navigationItem.rightBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "ic_mail_outline_white_2x").withRenderingMode(.alwaysOriginal), style: .plain, target: self, action: #selector(showCreateNewArticle))
}
  //MARK: Table View

     //skiped table view configuration

    }
// - MARK: Table view data source

func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return comments.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifer, for: indexPath) as! FeedCell
        imageFiles[indexPath.row].getDataInBackground { (data, error) in
            if let imageData = data {
                if let imageToDisplay = UIImage(data: imageData) {
                    cell.postImage.image = imageToDisplay
                }
            }
        }
        cell.descriptionLabel.text = comments[indexPath.row]
        cell.userButton.setTitle("\(usernames[indexPath.row]) \(lastnames[indexPath.row])", for: UIControl.State.normal)
        cell.userButton.addTarget(self, action: #selector(showProfile), for: .touchUpInside)
        return cell
}
//skiped
}

非常感谢!

汤姆

2 个答案:

答案 0 :(得分:1)

这里的问题是您的按钮可以在选择器上使用,并且对发件人或调用它的位置一无所知。

我将通过创建自定义表格视图单元格(例如FeedCell)来实现此目的,该单元格允许您设置delegate(例如FeedCellDelegate)。将您的类设置为该单元的委托,并将当前的indexPath传递到该单元中。然后,您可以在委托调用中返回indexPath

示例:请注意,为简单起见,已删除了代码,并且尚未测试此代码。这只是为了指导您正确的方向。

视图控制器

import UIKit

class HomeController: UIViewController {
    // stripped additional information for example

    func showProfile(_ username: String) {
        let vc: AProfileViewController!
        vc = AProfileViewController()
        vc.username = username
        vc.modalPresentationStyle = .fullScreen
        present(vc, animated: true)
    }
}

extension HomeController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return comments.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifer, for: indexPath) as! FeedCell

        cell.delegate = self

        cell.descriptionLabel.text = comments[indexPath.row]
        cell.userButton.setTitle("\(usernames[indexPath.row]) \(lastnames[indexPath.row])", for: UIControl.State.normal)

        cell.setIndex(indexPath)

        return cell
    }
}

extension HomeController: FeedCellDelegate {
    func didPressButton(_ indexPath: IndexPath) {
        let userName = usernames[indexPath.row]
        showProfile(username)
    }
}

Feed单元格

import UIKit

protocol FeedCellDelegate {
    didPressButton(_ indexPath: IndexPath)
}

class FeedCell: UICollectionViewCell {

    var delegate: FeedCellDelegate?
    var indexPath: IndexPath
    @IBOutlet weak var userButton: UIButton

    setIndex(_ indexPath: IndexPath) {
        self.indexPath = indexPath
    }

    @IBAction userButtonPressed() {

        if(delegate != nil) {
            delegate?.didPressButton(indexPath)
        }
    }
}

答案 1 :(得分:0)

通常,您可以通过类型安全的方式获取任何响应者的父响应者:

extension UIResponder {
    func firstParent<T: UIResponder>(ofType type: T.Type ) -> T? {
        return next as? T ?? next.flatMap { $0.firstParent(ofType: type) }
    }
}

所以:

  1. 在目标操作函数中获取按钮的父tableviewCell
  2. 向表视图查询索引路径
  3. 使用索引path.row来索引用户数组:
@objc func showProfile(_ sender: UIButton) {
  guard let cell = firstParent(ofType: UITableViewCell.self),
    let indexPath = tableView.indexPath(for: cell) else {
    return
  }
  let user = users[indexPath.row]
  ... do other stuff here ...
}