DidSelectRow 不工作

Posted

技术标签:

【中文标题】DidSelectRow 不工作【英文标题】:DidSelectRow is not working 【发布时间】:2018-03-05 04:40:12 【问题描述】:

标题几乎是这样的:DidSelectRow 没有被调用,我确实检查了我没有使用Deselect。我还检查了delegateDataSource 是否连接到tableViewControllerSelectionSingle Selection。但是,该方法仍然没有被调用。

空的tableView 可能对它有任何影响(它是空的原因是因为用户开始填充它。我正在使用CoreData)?

编辑

这个方法是这样的:

 var effectView = UIVisualEffectView(effect: UIBlurEffect(style: .light))
    var effect: UIVisualEffect!
    let defaults = UserDefaults.standard
    var userMagazineTitle = [User]()
    var dataString = String()

override func viewDidLoad() 
        super.viewDidLoad()
        addProgrammatically()

        let fetchRequest: NSFetchRequest<User> = User.fetchRequest()
        do
            let users = try PresistanceService.context.fetch(fetchRequest)
            self.userMagazineTitle = users
            self.tableView.reloadData()
        catch
            ProgressHUD.showError("Nothing to see here")
        

     

 / MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int 
        // #warning Incomplete implementation, return the number of sections
        return 1
    

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        // #warning Incomplete implementation, return the number of rows
        return userMagazineTitle.count
    


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! MyFeedTableViewCell
        cell.myHeadline?.text = userMagazineTitle[indexPath.row].title
        cell.indentationLevel = 3
        return cell
    

    // Override to support editing the table view.
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
        let manage = PresistanceService.persistentContainer.viewContext
        let del = userMagazineTitle[indexPath.row]

        if editingStyle == .delete 
            // Delete the row from the data source
            manage.delete(del)
            do
                try manage.save()
            catch
                ProgressHUD.showError()
            

            let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "User")

            do
                userMagazineTitle = try manage.fetch(fetchRequest) as! [User]
            catch
                ProgressHUD.showError()
            
            tableView.reloadData()
        
    

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        self.performSegue(withIdentifier: "showUser", sender: indexPath)
        navigationController?.navigationBar.isHidden = false
        tableView.deselectRow(at: indexPath, animated: true)
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "showUser" 
            let DestViewController = segue.destination as! UINavigationController
            let targetController = DestViewController.topViewController as! CompanyTableViewController
            let indexPath = sender as! IndexPath
            let user = userMagazineTitle[indexPath.row].title
            let user2 = userMagazineTitle[indexPath.row].rssurl
            targetController.customUserInit(articlesindex: indexPath.row, title: user!, rssUrl: user2!)
        

    

    func addProgrammatically() 
        effectView.frame = view.bounds
        tableView.addSubview(effectView)

        effectView.translatesAutoresizingMaskIntoConstraints = false
        if #available(ios 11.0, *) 
            effectView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
         else 
            // Fallback on earlier versions
            effectView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0).isActive = true
        
        effectView.heightAnchor.constraint(equalTo: self.view.heightAnchor).isActive = true
        effectView.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true

        effect = effectView.effect
        effectView.effect = nil

        self.tableView.separatorStyle = .none
        tableView.backgroundView = UIImageView(image: UIImage(named: "myMagazines.jpg"))
        tableView.backgroundView?.contentMode = .scaleAspectFill
        tableView.clipsToBounds = true
        navigationController?.navigationBar.isHidden = false
        UIApplication.shared.statusBarStyle = .lightContent
        navigationController?.navigationBar.isTranslucent = false
        navigationController?.navigationBar.barStyle = .black
        navigationController?.navigationBar.tintColor = .white
        navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    


【问题讨论】:

如果没有行那么你怎么能选择呢?(正如你提到的那张桌子是空的)。 @SaurabhPrajapati 它开始是空的,直到用户填充 TableView 能否添加cellForRow的代码? @SaurabhPrajapati 查看编辑 你能滚动tableview吗?检查表视图超级视图的剪辑子视图(剪辑到边界)。如果在将此属性设置为 true 后 tableview 不可见,那么它是您的视图框架的问题。 【参考方案1】:

可能导致问题的另一件事是未选择选择类型。我浪费了两个小时来解决这个问题。

交叉检查单元格选择,如果未选中则将其更改为单选。 以编程方式执行此操作:

斯威夫特:tableView.allowsSelection = YES;

目标 C:[tableView allowsSelection : YES];

================================

这可能对某人有帮助!

【讨论】:

【参考方案2】:

您在 tableview 顶部添加了一个UIVisualEffectView 视图,它不会将触摸事件传递给 tableview。

设置effectView.isUserInteractionEnabled = false,应该让这个视图将触摸事件传递给下面的视图。

【讨论】:

【参考方案3】:

这个问题可能有两个问题:

    TableView DidSelectRow 的方法签名可能有误。当前签名是:

    斯威夫特: func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

    ObjectiveC:-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    您在代码中的某处将 TableView 的委托设置为 nil。

【讨论】:

我检查了方法和委托,我还删除了旧的 TableViewController 并添加了另一个 tableViewController。

以上是关于DidSelectRow 不工作的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 的 didSelectRow 方法不起作用[重复]

UIPickerView - 第一行选择不调用 didSelectRow

未调用 DidSelectRow 函数

如何在多 UIPICKERVIEW 中配置“DidSelectRow”?

didSelectRow UIPicker

UIPickerView didSelectRow 之后的空变量