UITableViewCell 创建

UITableViewCell Creation

大家好,我在右侧有一个按钮 (+) navigationBarItem,我正在尝试创建一个功能,当您单击此按钮时,您会在 [=12] 中创建一个 cell =],你可以给它一个 title 和一个 image.

您可以更新数据源中的值并使用 tableView.reloadData()。这将重新加载 table 并向 table 添加一个新单元格。因此你也可以给它一个标题和图像。

只需更新数据源的计数

  1. 创建变量

    var rowCount:Int = 0
    
  2. 添加函数改变变量值

    @IBAction func addCell(sender:AnyObject) {
    
       rowCount = rowCount + 1
       tableView.reloadData()
    }
    
  3. 在table视图的数据源委托方法中,使用这个变量

    func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int
    {
        return rowCount
    }
    
  4. 在委托方法中设置标题和图片

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
        //add logic here
        return cell
    }
    

我会首先创建一个结构来表示您的单元格数据。

struct Object {
    var image: UIImage!
    var title: String!
}

然后您可以将 Object 的数组作为您的 table 视图的数据源。

class ViewController: UITableViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    // MARK: Properties

    var object: Object?
    var objects: [Object] = []
    var picker: UIImagePickerController!

    // MARK: Lifecycle

    override func viewDidLoad() {

        super.viewDidLoad()

        picker = UIImagePickerController()
        picker?.allowsEditing = false
        picker?.delegate = self
        picker?.sourceType = .photoLibrary
    }

    // MARK: UITableViewDataSource

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return objects.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = UITableViewCell(style: .default, reuseIdentifier: "Cell")
        let object = objects[indexPath.row]

        cell.imageView?.image = object.image ?? UIImage()
        cell.textLabel?.text = object.title ?? ""

        return cell
    }

    // MARK: UIImagePickerControllerDelegate

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        switch info[UIImagePickerControllerOriginalImage] as? UIImage {
        case let .some(image):
            object?.image = image
        default:
            break
        }

        picker.dismiss(animated: true) {
            self.showCellTitleAlert()
        }
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {

        object = nil

        dismiss(animated: true) {
            self.tableView.reloadData()
        }
    }

    // MARK: Alerts

    private func showCellTitleAlert() {

        let alert = UIAlertController(title: "Cell Title", message: nil, preferredStyle: .alert)

        alert.addTextField { [=11=].placeholder = "Title" }
        alert.addAction(UIAlertAction(title: "Cancel", style: .cancel) {
            self.object = nil
        })
        alert.addAction(UIAlertAction(title: "Save", style: .default) { _ in
            self.object?.title = alert.textFields?.first.flatMap { [=11=].text }
            self.object.flatMap { self.objects.append([=11=]) }
            self.tableView.reloadData()
        })

        present(alert, animated: true, completion: nil)
    }

    // MARK: Actions

    @IBAction func didSelectCreateButton() {

        object = Object()

        present(picker, animated: true, completion: nil)
    }
}

您将需要一个图像选择器供用户选择图像,并且您可以使用警报视图来获取用户输入的标题。通过符合 UIImagePickerControllerDelegate,您可以检测图像何时被选取或用户是否取消。

当按下创建按钮时,我们创建一个空的 object 并显示选择器。在我们用所选图像填充 object 之后,我们将显示文本字段警报视图。如果按下保存按钮,则会将 object 添加到数据源并重新加载 table 视图。