iOS:如何从Storyboard中唯一标识ViewController

6
我有一个自定义的ViewController,旨在重复使用,并且在Storyboard中,任意数量的实例将被链接在一起成为NavigationController,所有实例共享相同的模型作为委托。 ViewController需要告诉模型它们是哪个实例。目前,它们具有从segue获取的int属性,但这似乎不太符合惯例,并且不利于在屏幕上拥有多个实例(对于iPad)。我认为肯定有更清晰的方法来解决这个问题,请问有人知道是什么吗?谢谢。
结果:self.view.tag
4个回答

9

UIViewController的UIView有一个标签属性,您可以从任何地方设置它。您也可以使用[self class]来简单地识别控制器的类型。或者直接引用控制器的内存位置。

更新:您可以使用类别(category)为UIViewController实现唯一标识符。


“标识符”看起来很有前途,但实际上它似乎不是UIViewController的属性。这些都是同一类的实例,因此[self class]无法工作,并且如果控制器被释放和重新分配,则内存位置会发生变化。 - mgold
@mgold 哦,原来控制器中实际上没有标识符。奇怪的是,因为Xcode在IB中显示了它。我建议您通过使用所有控制器实现的协议自己实现它。另外:一旦您解除分配,identifier也会消失,而且我非常确定在正常操作期间内存地址永远不会发生变化。 - Tom van der Woerdt
这基本上就是我的做法,但我找不到一个好的方法来设置标识符。在Storyboard/IB中使用字段将是理想的,因为实例已经布局好了。 - mgold
1
UIView[controller view])具有tag属性,您可以使用它(并且可能在IB中设置它)。这是一个NSInteger - Tom van der Woerdt
@Till 看起来它也没有 tag 属性。最接近的是 title,但我正在寻找一个机器可读的等价物(理想情况下是一个可以用于索引和 NSArray 的整数)。编辑:哦,是视图本身。会去看一下 UIViewController 文档 - mgold
显示剩余3条评论

1
我猜在设计架构方面最“清晰”的方式可能是一个视图控制器的数组。(可以在应用程序委托中进行管理。)但是,有一些内存考虑因素 - 在iPhone上,您可能希望根据需要创建和销毁视图控制器。该数组可以包含标识符和其他与模型相关的信息,以便根据需要重新创建控制器。

0

很遗憾,UIViewController没有storyboardIdentifier属性。虽然可以使用此ID实例化它们,但如果视图控制器能够查询其ID,则会更有帮助。


0

最近我遇到了这个问题。我发现你可以在Storyboard中添加一个“恢复ID”。然后,你可以根据你的使用情况访问它,例如:

navigationController?.viewControllers.first?.restorationIdentifier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接