【问题标题】:show a view on 2 viewcontrollers在 2 个视图控制器上显示视图
【发布时间】:2016-01-21 10:03:40
【问题描述】:

我正在寻找一种在 2 个视图控制器中显示 UIView "InventoryView" 的方法。

我正在为我尝试制作的游戏开发一个库存系统,但我需要能够从我的主视图访问它,它将转到 InventoryViewController(在这个 ViewController 中是我的 InventoryView)但我还需要能够从我的 BattleViewController 访问InventoryView,它不会转到我的InventoryViewController,而是在我的BattleViewController 上打印InventoryView,这样我就可以在战斗期间访问所有内容。

示例: (一切都是拖放,UIView 和 UIButtons)

InventoryViewController

      class InventoryViewController: UIViewController {

          class InventoryView: UIView {
//here are some UIButtons and labels
}
}

BattleViewController

class BattleViewController: UIViewController {
class InventoryView: UIView {
 //it should print the Inventory Screen on my BattleViewController
//here are the same properties as it shows in the InventoryViewController
}
}

【问题讨论】:

  • 你能添加你的代码吗
  • 我在工作 atm 所以这是不可能的,我会在中午尝试这样做
  • 这里没有太多代码可写。只需要知道我是否可以将一个 UIView 从一个 ViewController 使用到另一个
  • 它有什么问题?在 viewcontroller 的 include 中声明并使用它。
  • @ott ,我该怎么做? :P 我对它有点陌生,试图制作一个小型的点击战斗游戏,但我只是不知道如何在我的 BattleViewController 中添加我的 InventoryView。

标签: ios swift uiview uiviewcontroller


【解决方案1】:

这是一个很好的例子,可以了解 OOP 编程的最佳工作方式。 问自己以下问题:

  • 视图的目的是什么?
  • 视图上的交互是否在所有实例中都是同质的? (触摸事件、特定行为等...)
  • 要使视图看起来像您想要的那样,您需要的最少信息量是多少?

获得这些答案后,您就可以安全地处理视图可重用性的概念。

实现它的方法是继承 UIView,创建视图的必要元素,设置约束(仍在视图中,无论是在 nib 中还是以编程方式),并实现任何跨视图一致的行为(例如,如果视图是一个分段控件,则每次单击一个分段时,所有其他分段变为灰色,而您单击的分段变为蓝色。由于这是分段控件的主要用途,因此它的代码应该属于分段控件) .

您可能会发现这些文档非常有用:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/

最后编写一个设置方法,获取所需的所有信息并相应地设置所有图形元素。请记住,视图不应该拥有它们的数据(它们应该是模板,控制器将提供数据)。

我不知道你看到的样子,但我假设库存被表示为一个对象。那么类似的事情可能是一个好的开始:

  class InventoryView: UIView {

    var inventory: Inventory? {
      didSet {
        if let newInventory = inventory { //in case we set it to nil
          setup(withInventory: newInventory)
        }
      }
    }

    private func setup(withInventory inventory: Inventory) {
      //do your setup here
    }
  }

然后在你的控制器中你可以调用:

let inventoryView = InventoryView()
inventoryView.inventory = myPlayer.inventory

【讨论】:

    【解决方案2】:

    您不能在两个地方使用视图,至少不能在 UI 中使用。每个视图一次只能添加到一个超级视图。

    如果您需要显示两次相同的内容,请创建一个 UIViewController 类,该类的视图包含通用 UI,创建其中两个并将它们添加到您的 UI。

    【讨论】:

      猜你喜欢
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 2017-12-31
      相关资源
      最近更新 更多