Кажется, что мой пользовательский класс UITableView не работает корректно как inputView для UITextField, который существует в другом UITableView.UITableView Crashes Когда numberOfRowsInSection больше, чем 1
См. Снимок экрана ниже. У меня есть MainTableViewController, который содержит два раздела: Раздел-1 и Раздел-2. Каждый раздел содержит только одну ячейку. Каждая ячейка имеет UITextField. Раздел 1 является предметом озабоченности. Он содержит UITextField с пользовательским UITableView в качестве входного вида. Я назвал этот пользовательский UITableView InputTableView и реализовал протокол UITableViewDataSource.
class InputTableView: UITableView, UITableViewDataSource
Цель состоит в том, чтобы заставить InputTableView действовать как сборщик опций. Пользователь будет щелкнуть ячейку в InputTableView, и этот выбор заполнит specialTextField
.
Когда я нажимаю на ячейку, InputView выглядит так, как ожидалось. Test Title
- это заголовок раздела UITableView. Section 0 Row 0
- содержимое ячейки.
Это в классе InputTableView numberOfRowsInSection
:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("tableView numberOfRowsInSection")
return 1
}
Если я вернуть что-нибудь больше, чем 1, приложение будет врезаться с ошибкой, как это:
TableViewControllerTest [721: 126633] * Заключительное приложение из-за неотображенное исключение «NSRangeException», причина: '* - [__ NSSingleObjectArrayI objectAtIndex]: индекс 1 за пределами [0 .. 0] *** Первый стек бросить вызов: (0x18db211b8 0x18c55855c 0x18db12420 0x19417c7bc 0x193ee7a40 0x193d1f9d4 0x193af5c20 0x193ab5478 0x193ab48c8 0x193ab4654 0x193ab4488 0x193d12e74 0x193d125a4 0x193d124a0 0x193a54550 0x193d35120 0x193d34aac 0x193a5399c 0x193a52fcc 0x1939d3090 0x1939f6c58 0x1939d22c4 0x18e57ad10 0x1939d2138 0x1939de018 0x1939dd904 0x1943b2298 0x1943b37f8 0x1943ac3c8 0x1943b37c8 0x1943a8488 0x1943b331c 0x1943abe38 0x193a9d240 0x1a1d15e98 0x1939fca78 0x193a5ab4c 0x193a5aebc 0x193add0b4 0x193b84128 0x193b83630 0x193f9ef80 0x193fa2688 0x193b6973c 0x193a080f0 0x193f92680 0x193 f921e0 0x193f9149c 0x193a0630c 0x1939d6da0 0x1a1cb21e8 0x1941c075c 0x1941ba130 0x18daceb5c 0x18dace4a4 0x18dacc0a4 0x18d9fa2b8 0x18f4ae198 0x193a417fc 0x193a3c534 0x1000191f4 0x18c9dd5b8) LibC++ abi.dylib: оканчивающиеся неперехваченного исключением типа NSException (lldb)
1) Если я добавить еще строка в MainTableViewController (добавьте 1 строку в раздел-1 для всего 2 строк), тогда numberOfRowsInSection может вернуть 2 и работать нормально. Если я добавлю еще одну строку для 3-х рядов, то функция может вернуть 3 и работать нормально. Все больше, и он снова падает. Я думаю, что это как-то связано. Однако как это может быть, если два элемента не находятся в одном классе?
2) Если я прокомментирую строку inputTableView.delegate = self
, тогда код снова будет работать без сбоев. Я могу установить numberOfRowsInSection для возврата любого числа (я попробовал 5, и он работает). Однако, поскольку делегат теперь не установлен, я ничего не могу сделать с взаимодействием с пользователем.
Мой Полный код:
//
// MainTableViewController.swift
// TableViewControllerTest
//
// Created by Zion Perez on 1/29/17.
// Copyright © 2017 Zion Perez. All rights reserved.
//
import UIKit
class InputTableView: UITableView, UITableViewDataSource {
func setupTableView(){
self.dataSource = self
}
// MARK: - TableView DataSource
// https://developer.apple.com/reference/uikit/uitableviewdatasource
func numberOfSections(in tableView: UITableView) -> Int {
print("numberOfSections")
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("tableView numberOfRowsInSection")
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
print("tableView cellForRowAt: " + indexPath.description)
let id = "BasicCell"
var cell: UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: id)
if cell == nil {
cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: id)
}
cell?.textLabel?.text = "Section \(indexPath.section) Row \(indexPath.row)"
return cell!
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
print("tableView titleForHeaderInSection")
return "Test Title"
}
}
class MainTableViewController: UITableViewController {
@IBOutlet weak var specialTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let frame = CGRect(x: self.view.frame.minX, y: self.view.frame.minY, width: self.view.frame.width, height: 200.0)
let inputTableView = InputTableView(frame: frame)
inputTableView.setupTableView()
inputTableView.delegate = self
specialTextField.inputView = inputTableView
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - TableViewDelegate
// https://developer.apple.com/reference/uikit/uitableviewdelegate
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("selected row at " + indexPath.description)
}
override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
print("deselected row at " + indexPath.description)
}
}
Мой код также здесь на Github: https://github.com/starkindustries/TableViewControllerTest
Другие источники, которые я исследовал: UITableView crashes when number of rows >1
Edit (Раскрыты Notes):
Ответ Muescha он Я решил решить свою проблему. Для справки, фиксированная версия кода может быть найдена по этой ссылке github ниже (branchateRefactor branch). Исходный код с проблемой находится по ссылке github выше (главная ветка).
https://github.com/starkindustries/TableViewControllerTest/tree/delegateRefactor
'specialTextField: UITextField !; specialTextField.inputView = inputTableView'? что вы пытаетесь сделать? ваша цель? – muescha
у вас есть полное сообщение об ошибке с объектом, на котором это происходит? – muescha
Цель состоит в том, чтобы заставить InputTableView действовать как сборщик опций. Пользователь будет щелкать ячейку в InputTableView, и этот выбор будет заполнять specialTextField. Полная ошибка имела много шестнадцатеричных символов, чтобы показать стек. –