【问题标题】:Programmatically emulate the selection in UITableViewController in Swift在 Swift 中以编程方式模拟 UITableViewController 中的选择
【发布时间】:2014-07-16 17:30:06
【问题描述】:

对不起,没有任何代码行的问题。如果可能的话,我需要建议如何进行。

在 Swift 语言中。

让我们假设有一个带有两个控制器的应用程序 - UITableViewController 和嵌入式 NavigationController,作为主要控制器。当您选择表格中的一行时,会打开 UIViewController,其中显示有关所选值的详细信息。

可以不做吗?当应用程序启动时,以编程方式模拟表中第一行的选择,并立即显示UIViewController 以及有关所选值的详细信息。从这个控制器可以通过NavigationController返回UITableViewController

再次道歉并提前感谢您!

【问题讨论】:

    标签: ios uitableview swift


    【解决方案1】:

    是的,您可以在 swift 中执行此操作。只需像往常一样加载您的 tableViewController。您只需致电

    在斯威夫特中

        let rowToSelect:NSIndexPath = NSIndexPath(forRow: 0, inSection: 0);  //slecting 0th row with 0th section
        self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition: UITableViewScrollPosition.None);
    

    selectRowAtIndexPath 函数不会触发 didSelectRowAtIndexPath: 这样的委托方法,因此您必须手动触发此委托方法

       self.tableView(self.tableView, didSelectRowAtIndexPath: rowToSelect); //Manually trigger the row to select
    

    或者,如果您使用 segue 推送 ViewControllers,则必须触发 performSegueWithIdentifier

        self.performSegueWithIdentifier("yourSegueIdentifier", sender: self);
    

    现在您可以在didSelectRowAtIndexpath 中推送viewController。选择第一部分的第一行或执行您在didSelectRowAtIndexpath: of tableView 中编写的任何内容

    对于您的情况,只需将 viewController 推送到第 0 个索引处的选择 didSelectRowAtIndexPath

    func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!){
    
        if indexPath.row == 0 {
    
            self.navigationController.pushViewController(yourViewControllerToPush, animated: YES);
        }
        //handle other index or whatever according to your conditions
    }
    

    它将显示推送的视图控制器,如果您不想为视图控制器设置动画,只需将 NO 传递给 pushViewController 方法。

    按下Back 按钮后,您将返回您的viewController

    在您的情况下,只需将其写在您的viewDidAppear

    if firstStart {
        firstStart = false
        let rowToSelect:NSIndexPath = NSIndexPath(forRow: 0, inSection: 0)
        self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition:UITableViewScrollPosition.None)
        self.performSegueWithIdentifier("showForecastSelectedCity", sender: self)
    }
    

    【讨论】:

    • 在我看来DidAppear:........ if firstStart { firstStart = false let rowToSelect:NSIndexPath = NSIndexPath(forRow: 0, inSection: 0) self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition: UITableViewScrollPosition.None) self.tableView(self.tableView, didSelectRowAtIndexPath: rowToSelect) }我的didSelectRowAtIndexPathoverride func tableView(tableView: UITableView!, didDeselectRowAtIndexPath indexPath: NSIndexPath!) { self.performSegueWithIdentifier("showForecastSelectedCity", sender: self) }
    • 错误:[_TtC12WeatherTest229FavWeatherTableViewController tableView:didSelectRowAtIndexPath:]: unrecognized selector sent to instance 0x7f7fea81d880 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_TtC12WeatherTest229FavWeatherTableViewController tableView:didSelectRowAtIndexPath:]: unrecognized selector sent怎么了?
    • 由于你没有实现didSelectRowAtIndexPath,你不需要调用self.tableView(self.tableView, didSelectRowAtIndexPath: rowToSelect)
    【解决方案2】:

    您也可以简单地通过访问 tableView 委托来强制didSelectRowAtIndexPath 触发。

    以编程方式选择要处理的行:

    self.tableView.selectRowAtIndexPath(indexPath, animated: true, scrollPosition: UITableViewScrollPosition.Top)
    

    以编程方式选择行不会触发“didSelectRowAtIndexPath”函数,因此我们必须手动强制触发,如下所示:

    self.tableView.delegate!.tableView!(tableView, didSelectRowAtIndexPath: indexPath!)
    

    目标-C:

    [self.tableView.delegate tableView:self.tableView didSelectRowAtIndexPath:path];
    

    【讨论】:

    • 非常感谢!对 Swift 4 进行了一些修改:tableView.selectRow(at: indexPath, animated: true, scrollPosition: UITableViewScrollPosition.top)tableView.delegate!.tableView!(tableView, didSelectRowAt: indexPath)
    • 直截了当,比所选答案更简洁。效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2011-10-07
    相关资源
    最近更新 更多