我似乎無法讓我的自定義UITableView類正常工作,作爲另一個UITableView中存在的UITextField的inputView。當numberOfRowsInSection大於1時,UITableView崩潰
請參考下面的截圖。我有MainTableViewController,它包含兩個部分:Section-1和Section-2。每個部分只包含一個單元格。每個單元格都有一個UITextField。第一部分是值得關注的領域。它包含一個帶有自定義UITableView作爲其inputView的UITextField。我給這個自定義的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行添加到Section-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
編輯(註解決):
Muescha的回答他幫我解決了我的問題。作爲參考,代碼的固定版本可以在下面的這個github鏈接中找到(delegateRefactor分支)。有問題的原始代碼位於上面的github鏈接(主分支)。
https://github.com/starkindustries/TableViewControllerTest/tree/delegateRefactor
'specialTextField:的UITextField !; specialTextField.inputView = inputTableView'?你想做什麼?你的目標? – muescha
你有這個崩潰的對象的完整的錯誤信息? – muescha
目標是使InputTableView像選項選取器一樣工作。用戶將在InputTableView中單擊一個單元格,該選擇將填充specialTextField。完整的錯誤只是有很多十六進制字符來顯示堆棧。 –