Пользовательская ячейка с 4 текстовыми полями - PullRequest
0 голосов
/ 14 июля 2020

В моем текущем проекте я столкнулся с довольно большой проблемой. У меня есть страница, на которой нужно заполнить информацию и отправить ее пользователям в моей базе данных Firebase. Я не спрашиваю, как на данный момент отправлять информацию этим пользователям. У меня есть контроллер представления, в который правильно вставлено и ограничено табличное представление. Вот изображение:

ViewController

Мне изначально нужна была кнопка в одной из ячеек. Теперь я отошел от этого и получил его в представлении над табличным представлением. Когда я нажимаю эту кнопку, она добавляет массив, чтобы увеличить количество ячеек представления таблицы.

Ячейке, которую я хочу заполнить в представлении таблицы, требуется 4 текстовых поля. У меня есть собственный файл Swift для ячеек со следующим кодом.

import UIKit

import Firebase

class ViewsCell: UITableViewCell {

let NameTextField: UITextField = {
       let tv = UITextField()
       tv.placeholder = "Name"
       tv.font = UIFont.systemFont(ofSize: 16)
       tv.translatesAutoresizingMaskIntoConstraints = false
       tv.backgroundColor = UIColor.white
       tv.textColor = .black
       return tv
   }()

let FeedTextField: UITextField = {
    let tv = UITextField()
    tv.placeholder = "#"
    tv.font = UIFont.systemFont(ofSize: 16)
    tv.translatesAutoresizingMaskIntoConstraints = false
    tv.backgroundColor = UIColor.clear
    tv.textColor = .white
    return tv
}()

let StoryTextField: UITextField = {
    let tv = UITextField()
    tv.placeholder = "#"
    tv.font = UIFont.systemFont(ofSize: 16)
    tv.translatesAutoresizingMaskIntoConstraints = false
    tv.backgroundColor = UIColor.clear
    tv.textColor = .white
    return tv
}()

let CompensationTextField: UITextField = {
    let tv = UITextField()
    tv.placeholder = "$"
    tv.font = UIFont.systemFont(ofSize: 16)
    tv.translatesAutoresizingMaskIntoConstraints = false
    tv.backgroundColor = UIColor.clear
    tv.textColor = .white
    return tv
}()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    
    
    addSubview(NameTextField)
    addSubview(FeedTextField)
    addSubview(StoryTextField)
    addSubview(CompensationTextField)
    
    
    NameTextField.leftAnchor.constraint(equalTo: self.leftAnchor, constant: 20).isActive = true
           NameTextField.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
           NameTextField.widthAnchor.constraint(equalToConstant: 100).isActive = true
           NameTextField.heightAnchor.constraint(equalToConstant: 50).isActive = true
    
}

required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
}

Вот код для контроллера что ячейки должны появиться в:

 import UIKit
 import Firebase

 class ConsiderationsViewController: UIViewController {

var numberOfPeople: [String] = ["1","2"]

var AddPersonCell = "AddPersonCell"

@IBOutlet weak var CompanyImage: UIImageView!

 var database: Database!
    var storage: Storage!
    var selectedImage: UIImage?
    
    var ref:DatabaseReference?
    var databaseHandle:DatabaseHandle = 0
    
    let dbref = Database.database().reference()
    let uid = Auth.auth().currentUser?.uid
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Set the Firebase reference
        ref = Database.database().reference()
        
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ConsiderationsViewController.handleSelectCompanyImageView))
         CompanyImage.addGestureRecognizer(tapGesture)
         CompanyImage.isUserInteractionEnabled = true

        self.navigationController!.navigationBar.isTranslucent = false
        
        navigationItem.backBarButtonItem = UIBarButtonItem(
        title: "", style: .plain, target: nil, action: nil)
        
    }

    @objc func handleSelectCompanyImageView() {

        let pickerController = UIImagePickerController()
        pickerController.delegate = self
        pickerController.allowsEditing = true
        present(pickerController, animated: true, completion: nil)
                    }
    
@IBAction func AddPersonTapped(_ sender: Any) {
     insertNewPersonCell()
}

func insertNewPersonCell() {

  }



 }
    
     extension ConsiderationsViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
               func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
                   //print("did Finish Picking Media")
                   if let image = info[UIImagePickerController.InfoKey(rawValue: "UIImagePickerControllerOriginalImage")] as? UIImage{
                       selectedImage = image
                       CompanyImage.image = image
                   }
                   dismiss(animated: true, completion: nil)
               }
    }

  extension ConsiderationsViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 2
}

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

    let cell = tableView.dequeueReusableCell(withIdentifier: AddPersonCell, for: indexPath) as! ConsiderationsCell

    return cell
  }
 }

Как мне go ограничивать эти текстовые поля? Я бы хотел, чтобы он был примерно такого же размера, как на изображении выше. Надеюсь, я все делаю правильно. Я знаю, что StackOverFlow не для руководств, но мне сложно найти материал о том, как создать пользовательскую ячейку, и теперь, когда у меня есть код и лучший подход, я думаю, что уместно задать вопрос о.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 14 июля 2020
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    @IBOutlet weak var simpleTableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SimpleCell", for: indexPath) as! SimpleCell
        
        if(indexPath.row % 2 == 0 ) {
            
            cell.vi1.backgroundColor = .red
            
        } else {
            
            cell.vi1.backgroundColor = .black
            
        }
        
        return cell
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100
    }
    
}


class SimpleCell: UITableViewCell {
    @IBOutlet weak var vi1: UIView!
    @IBOutlet weak var vi2: UIView!
    override func awakeFromNib() {
        super.awakeFromNib()
        // things done 
    }
}

Использовать соединение раскадровки как @IBOutlets

Перетащите UITableView на UIViewController как настройку delegate & dataSource

Выберите свой пользовательский UITableViewCell в раскадровке и в Identity Inspector установите его класс ячейки на свое UITableViewCell имя класса

...