公共UINavigationController,具有跨应用程序的自定义视图

时间:2017-10-09 11:48:19

标签: ios swift3 uinavigationcontroller uinavigationbar uinavigationitem

我正在开发一个股票市场应用程序,其中我必须显示一些索引值,这些索引值在导航栏中的市场营业时间内使用套接字连接进行更新。

此功能在应用程序的所有屏幕中都很常见。

我已经将UINavigationController子类化,并在.xib文件中设计了一个视图,以显示viewDidLoad中的索引值,并将其添加为子视图。

enter image description here

(我使用的是swift 3.1)

    let width = self.view.frame.width - 100.0
    let frame = CGRect(x: 50, y: 25, width: width, height: 44)
    viewNavigation = NavigationView(frame: frame)
    self.view.addSubview(viewNavigation!)

还有其他更好的方法来实现此功能吗?

2 个答案:

答案 0 :(得分:0)

这对我来说似乎并不好。

window.rootViewController设置为UINavigationController是一个很好的做法。它仍然可以包含其他子UINavigationController

然而,你的NavigationView是关于什么的?如果您直接在navigationController视图属性中添加子视图,那么这不是预期的行为,您可能会发生一些未定义的行为。

  

按照您编辑的答案和评论:

是的,我认为您应该使用UINavigationBar自定义titleView。 您可以在不同的viewController中轻松设置它或一次:

self.navBar.topItem?.titleView = NavigationView(frame: frame)

答案 1 :(得分:0)

我认为您可以创建UIViewController子类并添加方法来显示和隐藏或更改值。请看这个例子。

BaseViewControler是UIViewController上的子类

在BaseViewController上编写如下方法

func addNavigationTitileView() {
    // add your code to show your value 
  }

现在调用viewWillAppear

override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       addNavigationTitileView()
  }

现在您需要创建View Controller子类化BaseViewController。它会自动添加带有更改的导航栏。

为您的示例更好地更改navigationTitleView

假设您要在导航栏上显示动态值。使用上述方法,每次进入视图控制器时都很容易更新。

现在想想你不想为某些视图控制器添加它,你有两个选择。

  1. 创建View Controller而无需继承BaseViewController。
  2. 在控制器上创建相同的方法(覆盖),方法应为空白。
  3. 如果要实时更改文本,则需要使用需要使用NSNotificationCenter的addObserver 见Notification center method method called multiple time ios in Tab bar (View controller)? How to remove observer?

    这样实现, 您需要在baseviewController viewWillAppear方法上注册Observer并在viewWillDisappear方法中删除它。

    在Observer方法中,您可以设置要显示的值。