选项卡式 IOS 应用程序中 StoryBoard ViewController 的问题
Issues with StoryBoard ViewControllers in a Tabbed IOS App
在基于 MVC 使用 Swift 1.2 和 Xcode 6.3 开发选项卡式 IOS 应用程序的过程中,我使用可视化情节提要元素而不是以编程方式进行因为我不是经验丰富的开发人员。在下面的图片中,您可以看到应用 StoryBoard
中的架构:
该应用程序包含:
- 一个
TabBarController
和四个 TabBar Items
。
- 每个
Item
在 Storyboard
中都有自己的 ViewController
。
- 所有这些都与
StoryBoard
中的 relationship seque
(ViewControllers) 链接。
StoryBoard
中的每个 ViewController
都有自己的 Class
。
- 最后一个项目有一个嵌入式
NavigationController
因为我正在使用 PageMenu 项目 https://github.com/uacaps/PageMenu 来包含一个带有两个子项的分页菜单控制器 ViewControllers
我目前遇到的问题是:
- 这两个
child ViewControllers
并没有和StoryBoard
中的最后一个TabBar Item
联系起来,如上图所示,只是在parent ViewController Class
中实例化了(PageMenuViewController1),通常这个 PageMenu
有效,但有时最后一个 TabBar Item
会消失,我对这个问题很困惑。
- 默认
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。
这是连接的外观截图。可能这就是为什么您有时会丢失标签的原因。
在基于 MVC 使用 Swift 1.2 和 Xcode 6.3 开发选项卡式 IOS 应用程序的过程中,我使用可视化情节提要元素而不是以编程方式进行因为我不是经验丰富的开发人员。在下面的图片中,您可以看到应用 StoryBoard
中的架构:
该应用程序包含:
- 一个
TabBarController
和四个TabBar Items
。 - 每个
Item
在Storyboard
中都有自己的ViewController
。 - 所有这些都与
StoryBoard
中的relationship seque
(ViewControllers) 链接。 StoryBoard
中的每个ViewController
都有自己的Class
。- 最后一个项目有一个嵌入式
NavigationController
因为我正在使用 PageMenu 项目 https://github.com/uacaps/PageMenu 来包含一个带有两个子项的分页菜单控制器ViewControllers
我目前遇到的问题是:
- 这两个
child ViewControllers
并没有和StoryBoard
中的最后一个TabBar Item
联系起来,如上图所示,只是在parent ViewController Class
中实例化了(PageMenuViewController1),通常这个PageMenu
有效,但有时最后一个TabBar Item
会消失,我对这个问题很困惑。 - 默认
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。
这是连接的外观截图。可能这就是为什么您有时会丢失标签的原因。