【问题标题】:How can I add a common view to multiple ViewControllers in iOS Swift?如何在 iOS Swift 中向多个 ViewControllers 添加一个公共视图?
【发布时间】:2016-07-02 06:01:21
【问题描述】:

我对 iOS 开发有点陌生。
我想在其中有一个自定义视图和一些标签。在我的应用程序的某些视图控制器中单击按钮,我想添加/显示该视图 在该视图控制器的底部。

就我在我希望在其中显示视图的所有 viewController 中手动添加情节提要中的视图而言。但这不是有效的。如何在按钮单击时以编程方式在 viewControllers 中添加此视图?

【问题讨论】:

  • 你使用的是 UIViewController 还是 UITableViewController ?

标签: ios swift uiview uiviewcontroller


【解决方案1】:

创建一个继承于 UIViewController 的 BaseViewController 类

现在在 BaseViewController 中创建名为 designFooter 的方法

func designFooter() {
    var viewFooter: UIView = UIView(frame: CGRectMake(0, self.view.bounds.size.height - 50, self.view.bounds.size.width, 50))
    viewFooter.backgroundColor = UIColor.redColor()
    self.view!.addSubview(viewFooter)
}

对于 Swift 4、5.1:

func designFooter() {
    let viewFooter: UIView = UIView(frame: CGRect(x:0, y:self.view.bounds.size.height - 50, width:self.view.bounds.size.width, height:50))
    viewFooter.backgroundColor = UIColor.red
    self.view.addSubview(viewFooter)
}

现在继承这个 BaseViewController 到你要添加页脚的 ViewController,点击按钮只需调用 self.designFooter()

【讨论】:

  • 谢谢。它正在工作。期待这样的。还有一件事,在单击按钮后,如何使所有视图控制器的视图永久化意味着现在如果我转到另一个视图控制器,我不必单击按钮来显示视图,它已经存在了。跨度>
  • Objective-C 不会有问题。如果我遇到困难,我会问。
  • 在按钮单击单例变量或在 NSUserDefault 中存储一些最适合您的标志。并基于此显示您的视图。
  • 这与故事板不兼容
【解决方案2】:

如果您要添加的这个子视图有一些动态内容或有很多自己的逻辑,您可能需要使用视图控制器包含,特别是不仅要添加子视图,还要添加与该子视图关联的控制器。因此,您可以在故事板中为该子视图创建一个场景,该场景将显示在底部,并将其与自己的视图控制器相关联。然后,当您想添加它时,您可以执行以下操作:

let child = storyboard!.instantiateViewController(withIdentifier: "storyboardid")
addChild(child)
// set the `frame` or `constraints` such that it is in the correct place, perhaps animating it into place
view.addSubview(child.view)
child.didMove(toParent: self)

当你想删除它时:

child.willMove(toParent: nil)
child.view.removeFromSuperview()
removeChild(child)

就个人而言,如果这真的可以在我的应用程序的任何场景中出现和消失,我实际上会将整个应用程序嵌入到容器视图控制器中。然后在这个主容器视图控制器上,这个子元素的弹出和弹出只需要完成一次。

例如,考虑这个故事板:

这是一个嵌入的“容器视图”(上面讨论的视图控制器包含的情节提要等价物)。然后我可以让一个标签动画化(通过在使用标签更改某些视图的高度约束后动画layoutIfNeeded)。然后,无论哪个视图控制器的视图当前可见,这个底部视图都可以动画进出:

【讨论】:

  • 好的。我试试看
  • 如何为多个viewcontrollers添加一个公共collectionview?
  • 我可能会倾向于将逻辑放在UICollectionView 子类中,然后使用视图控制器包含将该场景嵌入到您需要该功能的任何其他场景中。
【解决方案3】:

只需创建一个 UIView 并调用 addSubview:

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0,0,100,100)];//change this frame for your purposes
UILabel *l = [[UILabel alloc] initWithFrame:CGRectMake(10,10,50,10)];
[l setText: @"My label"];
[view addSubview: l];
[self.view addSubview: view];

至于将它添加到多个视图控制器...我想如果您有很多具有相同 UIView 的不同视图控制器,您可以创建一个名为 CustomViewController 的 UIViewController 子类。在该类中,将上述代码添加到 viewDidLoad。然后,用这个特定的视图在所有视图控制器中子类 CustomViewController,它们会自动为你添加它。

编辑: 如果要在界面生成器中设计视图,请创建 UIView 的自定义子类。我们称之为CustomView。用笔尖设计它并添加您想要的任何代码。然后,只要您想创建该视图,只需调用CustomView *cv = [[CustomView alloc] initWithFrame:...],然后调用[self.view addSubview:cv];

【讨论】:

  • 这样我必须在所有的viewControllers中实现这段代码,对吧?我可以在一个 nib 文件或类似的文件中创建此视图,然后将其添加到视图控制器吗?
  • 是的,您可以使用界面生成器。见编辑@MustahsinulMoula
  • OP 正在询问快速语法。由于他是 iOS 开发的新手,因此目标 c 代码会让他更加困惑。请考虑添加 swift 代码来支持您的回答。
  • 我的意思是,它们非常相似。我不使用 Swift,所以我不知道它是什么,但他知道笔尖是什么,我相信他认识 initWithFrame... @JeetendraChoudhary
  • 我对 Objective-c 没问题。没问题。任何想法都会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
相关资源
最近更新 更多