Swift 未调用DidSelectRow函数
我试图实现didSelectRow函数并执行一个segue,但是当运行cells select时,什么也没有发生 我创建了一个也不运行的print语句,这证明函数似乎没有启动。为什么会这样 我已经检查了标识符是否正确,并且花了几个小时研究了许多堆栈溢出线程,但运气不好Swift 未调用DidSelectRow函数,swift,tableview,didselectrowatindexpath,Swift,Tableview,Didselectrowatindexpath,我试图实现didSelectRow函数并执行一个segue,但是当运行cells select时,什么也没有发生 我创建了一个也不运行的print语句,这证明函数似乎没有启动。为什么会这样 我已经检查了标识符是否正确,并且花了几个小时研究了许多堆栈溢出线程,但运气不好 import UIKit import CoreData class HomeViewController: UIViewController, UITableViewDelegate, UITableViewD
import UIKit
import CoreData
class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
let viewController = ListNameViewController()
let context = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext
var itemChoosen = 0
override func viewDidLoad() {
super.viewDidLoad()
homeListsTableView.delegate = self
homeListsTableView.dataSource = self
viewController.loadList()
}
@IBOutlet weak var homeListsTableView: UITableView!
@IBAction func templatesButton(_ sender: Any) {
tabBarController?.selectedIndex = 2
}
@IBAction func allListsButton(_ sender: Any) {
tabBarController?.selectedIndex = 0
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewController.listName.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
let result = viewController.listName[indexPath.row]
cell.textLabel?.text = ("\(String(result.listName!))")
return cell
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
context!.delete(viewController.listName[indexPath.row])
viewController.listName.remove(at: indexPath.row)
viewController.saveList()
homeListsTableView.reloadData()
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
performSegue(withIdentifier: "items2", sender: self)
print("selected")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(false)
viewController.loadList()
homeListsTableView.reloadData()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
homeListsTableView.reloadData()
}
}
ListNameViewController:
import UIKit
import CoreData
class ListNameViewController: UIViewController, UITableViewDelegate {
let context = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext
var listName : [ListName] = []
override func viewDidLoad() {
super.viewDidLoad()
createButtonChange.isEnabled = false
//Objective-C Line used to keep checking if the text field is vaild before enabling the submit button
listNameValue.addTarget(self, action: #selector(textValidation), for: UIControl.Event.editingChanged)
}
@IBOutlet weak var listNameValue: UITextField!
@IBOutlet weak var locationOption: UITextField!
@IBOutlet weak var createButtonChange: UIButton!
@objc func textValidation() {
//Text Field Validation check before button is enabled
if listNameValue.text!.isEmpty {
createButtonChange.isEnabled = false
} else {
createButtonChange.isEnabled = true
}
}
// Create a new List
@IBAction func createButton(_ sender: Any) {
let newList = ListName(context: context!)
newList.listName = listNameValue.text
saveList()
self.navigationController!.popViewController(animated: true)
viewWillAppear(false)
}
func saveList() {
do {
try context!.save()
} catch {
print("Error saving context \(error)")
}
}
func loadList() {
let request : NSFetchRequest<ListName> = ListName.fetchRequest()
do{
listName = try context!.fetch(request)
} catch {
print("Error loading categories \(error)")
}
}
//Pass data to the HomeViewController
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// let vc = segue.destination as! HomeViewController
}
}
导入UIKit
导入CoreData
类HomeViewController:UIViewController、UITableViewDelegate、UITableViewDataSource{
让viewController=ListNameViewController()
让上下文=(UIApplication.shared.delegate为?AppDelegate)?.persistentContainer.viewContext
var itemChoosen=0
重写func viewDidLoad(){
super.viewDidLoad()
homeListsTableView.delegate=self
homeListsTableView.dataSource=self
viewController.loadList()
}
@IBOutlet弱var homeListsTableView:UITableView!
@iAction func templatesButton(uSender:Any){
tabBarController?已选择索引=2
}
@iAction func allListsButton(uSender:Any){
tabBarController?.selectedIndex=0
}
func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
返回viewController.listName.count
}
func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
let cell=tableView.dequeueReusableCell(带有标识符:“cell”,用于:indexath)
让结果=viewController.listName[indexPath.row]
cell.textLabel?.text=(“\(字符串(result.listName!))”)
返回单元
}
func tableView(tableView:UITableView,commit editingStyle:UITableViewCell.editingStyle,forRowAt indexath:indexPath){
如果editingStyle==.delete{
context!.delete(viewController.listName[indexPath.row])
viewController.listName.remove(位于:indexPath.row)
viewController.saveList()
homeListsTableView.reloadData()
}
}
func tableView(tableView:UITableView,didSelectRowAt indexPath:indexPath){
性能检查(标识符为“items2”,发件人为self)
打印(“选定”)
}
覆盖函数视图将出现(uo动画:Bool){
super.viewwill出现(false)
viewController.loadList()
homeListsTableView.reloadData()
}
覆盖函数视图显示(u动画:Bool){
super.viewDidDisplay(true)
homeListsTableView.reloadData()
}
}
ListNameViewController:
导入UIKit
导入CoreData
类ListNameViewController:UIViewController、UITableViewDelegate{
让上下文=(UIApplication.shared.delegate为?AppDelegate)?.persistentContainer.viewContext
变量listName:[listName]=[]
重写func viewDidLoad(){
super.viewDidLoad()
createButtonChange.isEnabled=false
//Objective-C行用于在启用submit按钮之前持续检查文本字段是否可用
listNameValue.addTarget(自身,操作:#选择器(文本验证),用于:UIControl.Event.editingChanged)
}
@IBOutlet弱变量listNameValue:UITextField!
@IBOutlet弱var位置选项:UITextField!
@IBVAR createButtonChange:UIButton!
@objc func textValidation(){
//启用按钮之前的文本字段验证检查
如果listNameValue.text!.i为空{
createButtonChange.isEnabled=false
}否则{
createButtonChange.isEnabled=true
}
}
//创建一个新列表
@iAction func createButton(uSender:Any){
让newList=ListName(上下文:context!)
newList.listName=listNameValue.text
存储列表()
self.navigationController!.popViewController(动画:true)
视图将出现(false)
}
func保存列表(){
做{
尝试上下文!.save()
}抓住{
打印(“保存上下文时出错\(错误)”)
}
}
func加载列表(){
let请求:NSFetchRequest=ListName.fetchRequest()
做{
listName=try context!.fetch(请求)
}抓住{
打印(“加载类别时出错\(错误)”)
}
}
//将数据传递到HomeViewController
覆盖功能准备(对于segue:UIStoryboardSegue,发送方:有吗?){
//将vc=segue.destination设为!HomeViewController
}
}
//注释掉了核心数据,只使用了普通数组进行测试。您是否在脚本中为tableview添加了segue?在这种情况下,不会调用didSelect,但会调用tableview控制器的prepare(for segue)。确定解决了它-页面上有一个胭脂轻拍手势识别器。删除它,只需单击一次即可工作。我已经看到,如果您希望保留该手势,只需在函数顶部添加以下代码行:
tap.cancelsTouchesInView = false
花了三天,但我到了那里。谢谢你的帮助 是否调用了其他UITableViewDataSource方法?像
cellForRowAt
?什么是viewController
,它与tableView完全不同吗?是否混合元素?ListNameViewController用于向tableView添加一个新项,这样homeViewController就可以访问数据并从listName数组中显示数据。是否可以检查numberOfRowsInSection中返回的值?在情节提要环境中,默认初始值设定项ListN