Эй, ребята, у меня есть кнопка (+) в правом navigationBarItem
, я пытаюсь сделать функцию, где при нажатии на эту кнопку, вы создаете cell
в UITableViewCell
, и вы можете дать ему title
и image.UITableViewCell Создание
ответ
Я хотел бы начать с создания на структуру для представления данных вашей ячейки.
struct Object {
var image: UIImage!
var title: String!
}
Тогда вы можете иметь массив Object
быть источником данных вашего табличного представления.
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 { $0.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 { $0.text }
self.object.flatMap { self.objects.append($0) }
self.tableView.reloadData()
})
present(alert, animated: true, completion: nil)
}
// MARK: Actions
@IBAction func didSelectCreateButton() {
object = Object()
present(picker, animated: true, completion: nil)
}
}
Вам потребуется сборщик изображений для пользователя, чтобы выбрать изображение, и вы можете использовать предупредительный вид принимать пользовательский ввод для заголовка. В соответствии с UIImagePickerControllerDelegate
вы можете определить, когда выбрано изображение или отменен пользователь.
При нажатии кнопки «Создать» мы создаем пустой объект и представляем сборщик. После заполнения объекта выбранным изображением мы представляем представление предупреждения в текстовом поле. Если нажать кнопку сохранения, объект добавляется к источнику данных, а представление таблицы перезагружается.
Спасибо, что он отлично работает! –
Добро пожаловать! – Callam
Вы можете обновить значение в источнике данных и использовать tableView.reloadData()
. Это перезагрузит таблицу и добавит новую ячейку в таблицу. Соответственно, вы можете дать ему название и изображение.
Просто обновить счетчик источника данных
Создать переменную
var rowCount:Int = 0
Добавить функцию, чтобы изменить значение переменной
@IBAction func addCell(sender:AnyObject) { rowCount = rowCount + 1 tableView.reloadData() }
В методе DataSource делегата таблицы, используйте эту переменную
func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int { return rowCount }
Устанавливает заголовок и изображение в методе делегата
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { //add logic here return cell }
показать исходный код источника данных, который вы используете для просмотра таблицы. –