选项卡式 IOS 应用程序中 StoryBoard ViewController 的问题

Issues with StoryBoard ViewControllers in a Tabbed IOS App

在基于 MVC 使用 Swift 1.2 和 Xcode 6.3 开发选项卡式 IOS 应用程序的过程中,我使用可视化情节提要元素而不是以编程方式进行因为我不是经验丰富的开发人员。在下面的图片中,您可以看到应用 StoryBoard 中的架构:

该应用程序包含:

我目前遇到的问题是:

  1. 这两个child ViewControllers并没有和StoryBoard中的最后一个TabBar Item联系起来,如上图所示,只是在parent ViewController Class中实例化了(PageMenuViewController1),通常这个 PageMenu 有效,但有时最后一个 TabBar Item 会消失,我对这个问题很困惑
  2. 默认child ViewController中的override func viewWillAppear第一次被调用两次,我包含了一个println("ClubsController viewWillAppear").

ViewControllers 的代码是

import UIKit


class ClubsViewController: UIViewController, UITableViewDataSource{

  @IBOutlet var tableview:UITableView!

  let apiClient = ApiClient()

  var clubs: [Club]!

  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    println("ClubsController viewWillAppear")

    apiClient.clubsService.getList() { clubs, error in
      if clubs != nil {
        self.clubs = clubs
        self.tableview?.reloadData()
      }
      else {
        println("error: \(error)")
      }
    }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }

  func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.clubs?.count ?? 0
  }

  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("clubObjectCell") as! ClubTableViewCell
    cell.clubObject = self.clubs?[indexPath.row]
    return cell
  }

}

PageMenuViewController 的代码是

import UIKit

class PageMenuViewController1: UIViewController {

  var pageMenu : CAPSPageMenu?

  override func viewDidAppear(animated: Bool) {

    println("PageMenuViewController1 viewWillAppear")

    super.viewDidAppear(animated)
    // Array to keep track of controllers in page menu
    var controllerArray : [UIViewController] = []

    // Create variables for all view controllers you want to put in the
    // page menu, initialize them, and add each to the controller array.
    // (Can be any UIViewController subclass)
    // Make sure the title property of all view controllers is set
    // Example:
    var controller1 = storyboard!.instantiateViewControllerWithIdentifier("ClubsViewController")! as! ClubsViewController
    controller1.title = "CLUBS"
    controllerArray.append(controller1)
    var controller2 = storyboard!.instantiateViewControllerWithIdentifier("PartiesViewController")! as! PartiesViewController
    controller2.title = "PARTIES"
    controllerArray.append(controller2)

    // Customize page menu to your liking (optional) or use default settings by sending nil for 'options' in the init
    // Example:
    var parameters: [CAPSPageMenuOption] = [
      .MenuItemSeparatorWidth(4.3),
      .UseMenuLikeSegmentedControl(true),
      .MenuItemSeparatorPercentageHeight(0.1)
    ]

    // Initialize page menu with controller array, frame, and optional parameters
    pageMenu = CAPSPageMenu(viewControllers: controllerArray, frame: CGRectMake(0.0, 0.0, self.view.frame.width, self.view.frame.height), pageMenuOptions: parameters)

    // Lastly add page menu as subview of base view controller view
    // or use pageMenu controller in you view hierachy as desired
    self.view.addSubview(pageMenu!.view)
  }
}

感谢您帮助我们完成到目前为止的最佳实践。

我不熟悉 CAPSPageMenu,但故事板中的场景没有与 segue 连接并没有错 - 这只是帮助转换的便利,并使用 [=10 实例化它们=] 完全合法。

从您的情节提要中脱颖而出的是 table 视图控制器与导航视图控制器的连接方式。

导航 viewcontroller 应该与标签栏控制器有关系 - 而不是 table viewcontroller

这是连接的外观截图。可能这就是为什么您有时会丢失标签的原因。