Я пытаюсь добавить дочерний контроллер представления в контроллер табличного представления, и я добавил того же дочернего элемента в обычный UIViewController, и это сработало. Однако я использовал по существу тот же код для UITableViewController, и вид отображается в верхнем левом углу экрана. Код для реализации дочернего и создания дочернего контроллера представления ниже. * Кроме того, есть UIButton, который должен удалить дочерний элемент от родителя, но он также не работает.
Реализация дочернего элемента (UIViewController) в родительском элементе (UITableViewController) -
func setupNavBar() {
navigationItem.title = "Select Paper Item"
navigationItem.rightBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "QuestionIcon"), style: .plain, target: self, action: #selector(handleQuestion))
}
@objc func handleQuestion() {
addChild(questionView)
view.addSubview(questionView.view)
questionView.didMove(toParent: self)
view.addSubview(dismissQuestionView)
dismissQuestionView.translatesAutoresizingMaskIntoConstraints = false
dismissQuestionView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
dismissQuestionView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
dismissQuestionView.topAnchor.constraint(equalTo: view.topAnchor, constant: 80).isActive = true
dismissQuestionView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
dismissQuestionView.addTarget(self, action: #selector(handleDismissQuestionView), for: .touchUpInside)
questionView.view.translatesAutoresizingMaskIntoConstraints = false
questionView.view.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
questionView.view.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
questionView.view.topAnchor.constraint(equalTo: view.topAnchor, constant: 80).isActive = true
questionView.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
questionView.answer.text = "Recycling is very important, however we must ensure that we are recycling properly. This is because throwing trash in the recycling bin can not only cause recycling facilities to spend unnecesary money, but can also cause items that are recyclable to be thrown in the trash. To make matters worse, every recycling facility has different guidelines for what materials they accept and don't accept. You can look up where different items should go on this page. The first way is to click the magnifying glass on the right which will allow you to automatically search for items by simply typing their name. The second way is search manually by first selecting the material of the item on this page."
}
@objc func handleDismissQuestionView() {
questionView.willMove(toParent: nil)
questionView.view.removeFromSuperview()
questionView.removeFromParent()
dismissQuestionView.removeFromSuperview()
}
Создание Child-
import UIKit
class QuestionView: UIViewController {
let answer = UITextView()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor(white: 0, alpha: 0.7)
setupAnswer()
}
func setupAnswer() {
answer.backgroundColor = .white
answer.textColor = .black
answer.layer.cornerRadius = 20
answer.font = UIFont(name: "AlNile", size: 14)
view.addSubview(answer)
positionAnswer()
}
func positionAnswer() {
answer.translatesAutoresizingMaskIntoConstraints = false
answer.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
answer.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
answer.heightAnchor.constraint(equalToConstant: 300).isActive = true
answer.widthAnchor.constraint(equalToConstant: 300).isActive = true
}
}
Весь контроллер представления с расширениями-
import Firebase
import FirebaseFirestore
import FirebaseStorage
class PaperMaterial: UIViewController {
var rowHeight: CGFloat = 100
var headerheight: CGFloat = 150
let questionView = QuestionView()
let dismissQuestionView = UIButton()
let tableView = UITableView()
var alphaHeaderArray = [AlphaHeader]()
var aData = [CellData]()
var bData = [CellData]()
var cData = [CellData]()
var dData = [CellData]()
var eData = [CellData]()
var fData = [CellData]()
var gData = [CellData]()
var hData = [CellData]()
var iData = [CellData]()
var jData = [CellData]()
var kData = [CellData]()
var lData = [CellData]()
var mData = [CellData]()
var nData = [CellData]()
var oData = [CellData]()
var pData = [CellData]()
var qData = [CellData]()
var rData = [CellData]()
var sData = [CellData]()
var tData = [CellData]()
var uData = [CellData]()
var vData = [CellData]()
var wData = [CellData]()
var xData = [CellData]()
var yData = [CellData]()
var zData = [CellData]()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
setupNavBar()
let db = Firestore.firestore()
alphaHeaderArray =
[AlphaHeader.init(label: "A"), AlphaHeader.init(label: "B"),
AlphaHeader.init(label: "C"), AlphaHeader.init(label: "D"),
AlphaHeader.init(label: "E"), AlphaHeader.init(label: "F"),
AlphaHeader.init(label: "G"), AlphaHeader.init(label: "H"),
AlphaHeader.init(label: "I"), AlphaHeader.init(label: "J"),
AlphaHeader.init(label: "K"), AlphaHeader.init(label: "L"),
AlphaHeader.init(label: "M"), AlphaHeader.init(label: "N"),
AlphaHeader.init(label: "O"), AlphaHeader.init(label: "P"),
AlphaHeader.init(label: "Q"), AlphaHeader.init(label: "R"),
AlphaHeader.init(label: "S"), AlphaHeader.init(label: "T"),
AlphaHeader.init(label: "U"), AlphaHeader.init(label: "V"),
AlphaHeader.init(label: "W"), AlphaHeader.init(label: "X"),
AlphaHeader.init(label: "Y"), AlphaHeader.init(label: "Z")]
db.collection("paper").getDocuments { (snapshot, error) in
if let error = error {
print(error)
return
}
else {
for document in snapshot!.documents {
let databaseData = document.data()
let name = databaseData["name"] as? String ?? ""
let category = databaseData["category"] as? String ?? ""
let firstLetter = name.prefix(1)
let storageRef = Storage.storage().reference()
let imageRef = storageRef.child("Paper/\(name).jpg")
imageRef.getData(maxSize: 50 * 1024) { data, error in
if let error = error {
print(error)
return
}
else {
let image = UIImage(data: data!)
if firstLetter == "A" {
self.aData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "B" {
self.bData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "C" {
self.cData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "D" {
self.dData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "E" {
self.eData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "F" {
self.fData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "G" {
self.gData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "H" {
self.hData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "I" {
self.iData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "J" {
self.jData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "K" {
self.kData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "L" {
self.lData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "M" {
self.mData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "N" {
self.nData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "O" {
self.oData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "P" {
self.pData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "Q" {
self.qData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "R" {
self.rData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "S" {
self.sData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "T" {
self.tData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "U" {
self.uData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "V" {
self.vData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "W" {
self.wData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "X" {
self.xData += [CellData.init(image: image, message: name, category: category)]
}
else if firstLetter == "Y" {
self.yData += [CellData.init(image: image, message: name, category: category)]
}
else {
self.zData += [CellData.init(image: image, message: name, category: category)]
}
self.tableView.reloadData()
}
}
}
}
}
self.tableView.register(ItemCustomCell.self, forCellReuseIdentifier: "custom")
positionTableView()
}
func setupNavBar() {
navigationItem.title = "Select Paper Item"
navigationItem.rightBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "QuestionIcon"), style: .plain, target: self, action: #selector(handleQuestion))
}
@objc func handleQuestion() {
addChild(questionView)
view.addSubview(questionView.view)
questionView.didMove(toParent: self)
view.addSubview(dismissQuestionView)
dismissQuestionView.translatesAutoresizingMaskIntoConstraints = false
dismissQuestionView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
dismissQuestionView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
dismissQuestionView.topAnchor.constraint(equalTo: view.topAnchor, constant: 80).isActive = true
dismissQuestionView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
dismissQuestionView.addTarget(self, action: #selector(handleDismissQuestionView), for: .touchUpInside)
questionView.view.translatesAutoresizingMaskIntoConstraints = false
questionView.view.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
questionView.view.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
questionView.view.topAnchor.constraint(equalTo: view.topAnchor, constant: 80).isActive = true
questionView.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
questionView.answer.text = "Recycling is very important, however we must ensure that we are recycling properly. This is because throwing trash in the recycling bin can not only cause recycling facilities to spend unnecesary money, but can also cause items that are recyclable to be thrown in the trash. To make matters worse, every recycling facility has different guidelines for what materials they accept and don't accept. You can look up where different items should go on this page. The first way is to click the magnifying glass on the right which will allow you to automatically search for items by simply typing their name. The second way is search manually by first selecting the material of the item on this page."
}
@objc func handleDismissQuestionView() {
questionView.willMove(toParent: nil)
questionView.view.removeFromSuperview()
questionView.removeFromParent()
dismissQuestionView.removeFromSuperview()
}
func positionTableView() {
view.addSubview(tableView)
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 80).isActive = true
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
}
}
extension PaperMaterial: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let vc = ObjectInfo()
switch indexPath.section {
case 0:
let data = aData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 1:
let data = bData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 2:
let data = cData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 3:
let data = dData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 4:
let data = eData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 5:
let data = fData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 6:
let data = gData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 7:
let data = hData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 8:
let data = iData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 9:
let data = jData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 10:
let data = kData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 11:
let data = lData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 12:
let data = mData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 13:
let data = nData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 14:
let data = oData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 15:
let data = pData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 16:
let data = qData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 17:
let data = rData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 18:
let data = sData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 19:
let data = tData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 20:
let data = uData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 21:
let data = vData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 22:
let data = wData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 23:
let data = xData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
case 24:
let data = yData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
default:
let data = zData[indexPath.row]
vc.name = data.message
vc.objImage = data.image
}
vc.category = "paper"
navigationController?.pushViewController(vc, animated: true)
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let alphaHeader = Bundle.main.loadNibNamed("AlphaHeaderView", owner: self, options: nil)?.first as! AlphaHeaderView
alphaHeader.headerLabel.text = alphaHeaderArray[section].label
return alphaHeader
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return headerheight
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCell(withIdentifier: "custom") as! ItemCustomCell
cell.messageView.font = UIFont(name: "ChalkboardSE-Bold",size: 20.0)
cell.messageView.textColor = .black
cell.itemImageView.leftAnchor.constraint(equalTo: cell.leftAnchor, constant: 75).isActive = true
switch indexPath.section {
case 0:
cell.itemImage = aData[indexPath.row].image
cell.message = aData[indexPath.row].message
case 1:
cell.itemImage = bData[indexPath.row].image
cell.message = bData[indexPath.row].message
case 2:
cell.itemImage = cData[indexPath.row].image
cell.message = cData[indexPath.row].message
case 3:
cell.itemImage = dData[indexPath.row].image
cell.message = dData[indexPath.row].message
case 4:
cell.itemImage = eData[indexPath.row].image
cell.message = eData[indexPath.row].message
case 5:
cell.itemImage = fData[indexPath.row].image
cell.message = fData[indexPath.row].message
case 6:
cell.itemImage = gData[indexPath.row].image
cell.message = gData[indexPath.row].message
case 7:
cell.itemImage = hData[indexPath.row].image
cell.message = hData[indexPath.row].message
case 8:
cell.itemImage = iData[indexPath.row].image
cell.message = iData[indexPath.row].message
case 9:
cell.itemImage = jData[indexPath.row].image
cell.message = jData[indexPath.row].message
case 10:
cell.itemImage = kData[indexPath.row].image
cell.message = kData[indexPath.row].message
case 11:
cell.itemImage = lData[indexPath.row].image
cell.message = lData[indexPath.row].message
case 12:
cell.itemImage = mData[indexPath.row].image
cell.message = mData[indexPath.row].message
case 13:
cell.itemImage = nData[indexPath.row].image
cell.message = nData[indexPath.row].message
case 14:
cell.itemImage = oData[indexPath.row].image
cell.message = oData[indexPath.row].message
case 15:
cell.itemImage = pData[indexPath.row].image
cell.message = pData[indexPath.row].message
case 16:
cell.itemImage = qData[indexPath.row].image
cell.message = qData[indexPath.row].message
case 17:
cell.itemImage = rData[indexPath.row].image
cell.message = rData[indexPath.row].message
case 18:
cell.itemImage = sData[indexPath.row].image
cell.message = sData[indexPath.row].message
case 19:
cell.itemImage = tData[indexPath.row].image
cell.message = tData[indexPath.row].message
case 20:
cell.itemImage = uData[indexPath.row].image
cell.message = uData[indexPath.row].message
case 21:
cell.itemImage = vData[indexPath.row].image
cell.message = vData[indexPath.row].message
case 22:
cell.itemImage = wData[indexPath.row].image
cell.message = wData[indexPath.row].message
case 23:
cell.itemImage = xData[indexPath.row].image
cell.message = xData[indexPath.row].message
case 24:
cell.itemImage = yData[indexPath.row].image
cell.message = yData[indexPath.row].message
default:
cell.itemImage = zData[indexPath.row].image
cell.message = zData[indexPath.row].message
}
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return rowHeight
}
func numberOfSections(in tableView: UITableView) -> Int {
return 26
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
return aData.count
}
if section == 1 {
return bData.count
}
if section == 2 {
return cData.count
}
if section == 3 {
return dData.count
}
if section == 4 {
return eData.count
}
if section == 5 {
return fData.count
}
if section == 6 {
return gData.count
}
if section == 7 {
return hData.count
}
if section == 8 {
return iData.count
}
if section == 9 {
return jData.count
}
if section == 10 {
return kData.count
}
if section == 11 {
return lData.count
}
if section == 12 {
return mData.count
}
if section == 13 {
return nData.count
}
if section == 14 {
return oData.count
}
if section == 15 {
return pData.count
}
if section == 16 {
return qData.count
}
if section == 17 {
return rData.count
}
if section == 18{
return sData.count
}
if section == 19 {
return tData.count
}
if section == 20 {
return uData.count
}
if section == 21 {
return vData.count
}
if section == 22 {
return wData.count
}
if section == 23 {
return xData.count
}
if section == 24 {
return yData.count
}
return zData.count
}
}