【问题标题】:Passing Data from to another View Controller without changing view (Swift)在不更改视图的情况下将数据从另一个视图控制器传递(Swift)
【发布时间】:2017-04-04 09:59:35
【问题描述】:

我有一个 searchViewController,我在其中搜索用户,UITableView 会根据用户信息动态更新。 UITableView 的单元格是自定义的 - 它有一个 UIImage、usernameLabel 和一个名为“Add”的按钮。

我想要的是,如果用户单击单元格的添加按钮,它应该将该单元格上的用户信息(图像和用户名)传递给另一个视图控制器,该控制器的 UITableView 是一个朋友列表。

但是,到目前为止,我知道的唯一方法是使用 performSegue 将数据传递给另一个持有友好列表 UITable 的 viewController。但是通过这种方法,每次我单击添加按钮时,它都会连接到我不想要的另一个视图控制器。当单击添加按钮时,我希望它保留在 searchViewController 上 - 我只希望传递数据。

有什么办法可以做到吗?是否建议使用 NSUserDefaults 来传递此类数据?

【问题讨论】:

  • 单击添加按钮时是否存在其他视图控制器?即,朋友列表是您将要导航到的新屏幕,还是您来自并可以返回的前一个屏幕?
  • 您可以轻松地在单元格中创建方法并传递信息。
  • 如果您不想显示好友列表,为什么要将数据发送到好友列表屏幕?你想使用它的一些功能吗?
  • 使用闭包并更新您的表格视图。
  • 原来是这样——我有一个带有条形按钮项的friendsList 视图控制器,该控制器将我带到具有自定义单元格的uitableview 的addFriend 视图控制器。自定义单元格上的添加按钮用于更新 FriendsList 视图控制器上的 tableView。我不想在单击添加按钮后立即继续,以防用户想要将更多用户添加到列表中。但是用户可以在需要时通过另一个按钮返回到 friendsList 控制器。

标签: ios swift uitableview


【解决方案1】:

为简单起见,我将使用 FriendListVC 和 AddVC

如果您要通过条形按钮项或其他东西从 FriendListVC 转到您的 AddVC,并且您的堆栈看起来像:-

FriendListVC -> AddVC

您可以使用两种方法:-

1) 在您的 addVC 中创建您的friendListVC 的委托,并根据那里的任何更改修改friendListVC 数据源

2) 或者,我推荐这种方法,只需将 FriendListVC 数据源重新加载到它的 viewWillAppear 上。即使您向后导航,也会调用 viewWillAppear。因此,即使您将来添加 deleteVC 并返回,viewWillAppear 也会执行更新,并且它将独立于任何其他 VC

希望有帮助

【讨论】:

  • 您好,我会在 addVC 中实现 viewWillAppear(因为这是我想要传递给 FriendListVC 的所有信息的地方),抱歉,我不熟悉 viewWillAppear。另外,deleteVC 到底是什么意思?
  • 在您的friendListVC中实现viewWillAppear并重新加载表的数据,即您的数据源)。 deleteVC 只是您将来可能添加的另一个 VC 的示例
【解决方案2】:

使用委托在视图控制器之间传递数据。你会发现这很有用 Passing data between 2 UIViewController using delegate and protocol 您可以使用 NSUserDefaults 但委托模式比这更好。

【讨论】:

    【解决方案3】:

    您可以使用回调方法将数据从一个控制器传递到另一个控制器,这是最好和最简单的方法

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    {
        let viewControllerB = segue.destinationViewController as! ViewControllerB
        viewControllerB.callback = { message in
        //Do what you want in here!
        }
    }
    

    在 ViewControllerB 中:

    var callback : (String -> Void)?
    @IBAction func search(sender: AnyObject) {
        callback?("Pass data to view controller1")
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    

    【讨论】:

      【解决方案4】:

      最简单的方法是在当前视图控制器中创建一个您想要向其传递数据的视图控制器的实例。我会为此编写一个示例代码。

      class yourTableViewController: UITableViewController {
        var controllerToPassData: UIViewController()
      
        func clickTableButton(sender: UIButton) {
          controllerToPassData.count += 1
        }
      }
      
      class controllerwhereDataisPassed: UIViewController {
        var count: Int!
      }
      

      从 navigationController 堆栈中选择您想要向其传递数据的控制器实例并使用此代码。

      【讨论】:

      • 您是否使用了导航堆栈中的好友视图控制器实例?您是否重新加载了表格视图?
      猜你喜欢
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      相关资源
      最近更新 更多