草庐IT

swift - 从 rootVC subview 访问 UINavigationController(从 Nib 加载的 subview )

coder 2023-09-17 原文

主 ViewController 嵌入在 UINavigationController 子类中,VC 有一个从 nib 加载的 subview 。 subview 称为 MenuView,并包含将链接到其他 VC 的 UIButton。

为了让我的主 ViewController 不那么不守规矩,我将所有这些按钮放入一个 subview 中,该 subview 从一个 nib 加载,该 nib 为菜单的打开和关闭设置动画。

但是,我想从这些 View Controller 中展示其他 View Controller ,有时是“模态”,有时是“显示”。我所做的似乎有效,但我只想知道这是否合适,或者我是否造成了一些我不知道的不良影响(比如会导致内存泄漏的强引用循环,或其他)。或者有更好的方法吗?

一些代码: 在 MenuView.swift 中

class MenuView: UIView {
    var navigationController = CustomNavigationController()

    func combinedInit(){
        NSBundle.mainBundle().loadNibNamed("MenuViewXib", owner: self, options: nil)
        addSubview(mainView)
        mainView.frame = self.bounds
    }

    @IBAction func optionsAction(sender: AnyObject) {
        self.navigationController.performSegueWithIdentifier("presentOptions", sender: self)
    }

在 ViewController.swift 中

        menuView.navigationController = self.navigationController as! CustomNavigationController

最佳答案

简短回答:不,从层次结构中的某个 View 访问 View Controller 是不行的,因为这会破坏所有 MVC写的规则。


UIView 对象用于在屏幕中显示 UI 组件,并负责正确绘制和布局其 subview 。仅此而已。仅此而已。

您应该始终在相关 View 实际所属的 Controller 中处理 View 和 Controller 之间的此类交互。如果你需要从一个 View 发送消息到它的 View Controller ,你可以使用 delegate approachNSNotificationCenter类(class)。

如果我处在您的位置,当 View 需要来自其 View Controller 的一些信息时,我会使用委托(delegate)。它比使用通知中心更容易理解,因为它可以更容易地跟踪两者之间发生的事情。如果 View Controller 需要来自 View 的一些信息(换句话说,反过来),我会选择通知中心。

protocol MenuViewDelegate: class {
  func menuViewDidClick(menuView: MenuView)
}

class MenuView: UIView {
  var weak delegate: MenuViewDelegate?

  @IBAction func optionsAction(sender: AnyObject) {
    delegate?.menuViewDidClick(self)
  }
}

让我们看看 View Controller 端发生了什么:

class MenuViewController: UIViewController, MenuViewDelegate {

  override func viewDidLoad() {
    ...
    self.menuView.delegate = self
  }

  func menuViewDidClick(menuView: MenuView) {
    navigationController?.performSegueWithIdentifier("presentOptions", sender: self)
  }
}

有关 iOS 通信模式的更多信息,您可能想看看这个很棒的 article以便了解它们的工作原理。

关于swift - 从 rootVC subview 访问 UINavigationController(从 Nib 加载的 subview ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37147618/

有关swift - 从 rootVC subview 访问 UINavigationController(从 Nib 加载的 subview )的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  3. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  4. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  5. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  6. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  7. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  8. ruby - 有没有办法从 ruby​​ case 语句中访问表达式? - 2

    我想从then子句中访问c​​ase语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案

  9. ruby - 从外部访问类的实例变量 - 2

    我理解(我认为)Ruby中类变量和类的实例变量之间的区别。我想知道如何从该类外部访问该类的实例变量。从内部(即在类方法中而不是实例方法中),它可以直接访问,但是从外部,有没有办法做MyClass.class.[@$#]variablename?我没有任何具体原因要这样做,只是学习Ruby并想知道是否可行。 最佳答案 classMyClass@my_class_instance_var="foo"class上述yield:>>foo我相信Arkku演示了如何从类外部访问类变量(@@),而不是类实例变量(@)。我从这篇文章中提取了上述内

  10. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

随机推荐