【问题标题】:Master Detail View With SegueSegue 的主细节视图
【发布时间】:2017-03-26 19:35:34
【问题描述】:

我正在尝试学习如何为我的项目做详细视图。

我有一个简单的tableView 和一个简单的Array 数据来填充它。

表格视图:

TableView Example

我也设计了一个详细视图,带有静态 tableViewCells

详细视图示例:

Example

我已经用 segue 连接了两者:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        self.performSegueWithIdentifier("Profile", sender: indexPath);

        }

我还用Outlets 连接了所有标签和图像,我想在每个cell 之间进行更改,但我不知道如何从这里前进。

现在每个cell 都显示相同的内容,但我想在行之间更改data。所以我想通过 segue 更改 data 并创建一个主详细信息应用程序,就像在我的 tableview 中一样。有人可以帮帮我吗?

我正在使用 Swift 2.3 和 Xcode 8.1

【问题讨论】:

  • 我不太了解您的问题和期望的结果,无法提供帮助。
  • 我正在尝试在我的 tableView 中创建一个主详细信息应用程序
  • 您可以先添加所见内容的屏幕截图,然后阐明哪个示例是您的预期结果,并围绕您已经尝试过的内容添加更多代码。
  • 我没有做太多,我只是设置了 segue,因为我不知道如何继续或如何发送数据或更改数据
  • 好吧,SO 是针对特定问题的。我不知道你想做什么。所以我的建议是,如果你真的被卡住了,那么在谷歌上搜索一些详细的教程,并逐步完成它们,直到你明白为止。

标签: ios iphone swift uitableview detailview


【解决方案1】:

如果我正确理解您的问题,您只想将 dataSource 元素传递给下一个 viewController。因此,您可以使用indexPath.row 选择它并使用sender 参数在prepareForSegue 方法中设置它。

下面的代码假设您的数据源是self.users 数组。

斯威夫特 3

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let user = self.users[indexPath.row]
    self.performSegueWithIdentifier("Profile", sender: user)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let segueId = segue.identifier? else { return }
    if segueId == "Profile" {
        guard let profileVC = segue.destination as? ProfileViewController else { return }
        profileVC.user = sender as? User
    }
}

斯威夫特 2

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let user = self.users[indexPath.row]
    self.performSegueWithIdentifier("Profile", sender: nil)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    guard let segueId = segue.identifier else { return }
    if segueId == "Profile" {
        guard let profileVC = segue.destinationViewController as? ProfileViewController else { return }
        profileVC.user = sender as? User
    }
}

编辑

我正在尝试更改数据,例如您在行之间看到的所有标签,例如 例如,shalvata 将具有与灯塔不同的数据,并且 所以,改变标签和图像等等

我仍然不清楚您要确切更改哪些数据。此外,我不理解您的屏幕截图中的语言,但由于您将关系命名为主从关系,我想第二个屏幕旨在显示有关在第一个屏幕上选择的实体的更多信息。 如果是这样,您应该从设计模型开始,使其包含您在第二个屏幕上需要的所有字段。从图标来看,它会是这样的

struct Person {
    var name: String?
    var image: UIImage?
    var age: Int?
    var address: String?
    var phone: String?
    var schedule: String?
    var music: String?
    var smoking: Bool?
    var car: String?
    var info: String?
    var hobby: String?
}

注意:删除那些不是可选字段的?,即必须始终为每个实体设置(可能是name字段)

用法

我不知道您如何以及何时创建Person 数组,但基本上有两种方法:

  1. 使用在MasterVC 上填写所有字段的实体列表,然后将所选人员传递给didSelectRowAtIndexPath 中的DetailVC
  2. 使用包含MasterVC 所需的一些基本数据(名称、地址、图像)的实体列表,并仅在需要时填写其余字段(didSelectRowAtIndexPath 方法)

无论如何,您将在DetailVC 中被选中person,现在您需要在cellForRow 方法中使用该数据,就像您在MasterVC 上所做的那样。也许将静态 TableViewController 用于详细信息屏幕会是一个更好的选择。

【讨论】:

  • 嘿,Alex 再次感谢您的帮助 :) 我正在尝试更改数据,例如您在行之间看到的所有标签,例如 shalvata 将具有与灯塔不同的数据,因此,更改标签和图像并以此类推
  • @adirbuilder 我提供了更多说明供您尝试。希望对您有所帮助。
  • 惊人的答案。我为DetailVC 使用静态单元格TableVC,而这些实体是餐厅,因此DetailVC 是每个餐厅的配置文件,其中包含更多信息,而不是第一个tableViewDynamicCells 显示街道和名字
  • 明天晚上我将能够测试所有内容,我将开始实施您的建议:)
  • 嘿亚历克斯我正在尝试实现它,但我遇到了一些错误。我正在使用 Swift 2.3
【解决方案2】:

听起来你正在尝试做的事情根本不涉及 segues。您可以使用tableViewController 中的cellForRow 方法更改单元格的数据。

https://developer.apple.com/reference/uikit/uitableview/1614983-cellforrow

例如

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = "foo"
    return cell
}

如果这听起来让您感到困惑,那么您应该退后一步,做一些教程,然后发布关于 SO 的具体问题。

【讨论】:

  • 我不想自定义表格视图单元格,当我点击一个单元格时,我将打开一个新视图并获取有关单元格主详细信息的更多信息和新 UI。现在你明白了吗?
  • 那就照亚历克斯说的做吧。
  • 是的,但是我如何更改“ProfileViewController”中的标签数据
猜你喜欢
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
相关资源
最近更新 更多