【问题标题】:Swift Navigation with Drawer Controller带抽屉控制器的 Swift 导航
【发布时间】:2017-09-11 08:34:32
【问题描述】:

我有以下用例。 我正在使用KYDrawerController 库。我做了一个抽屉菜单,它工作得很好。我的 MainViewController 是一个 UINavigationController。在工具栏/导航栏上,我有一个汉堡图标来打开抽屉菜单。 抽屉菜单有项目,当用户点击它时,它应该会打开一个屏幕。

在Android中,将使用片段替换物品时替换内容,在这种情况下,工具栏可保持汉堡图标,抽屉控制器仍然可以轻松打开。

如何在 Swift 上实现这一点,使用 UINavigationController 是个好主意还是有更好的选择。要求如下。

  • 选择项目后,工具栏标题必须更改,并且抽屉菜单必须仍然可以访问。
  • 选择项目时,必须替换内容(使用 ViewController)
  • 每个“内容”视图控制器都可以指向子视图(详细信息/文章视图),在这种情况下,应将汉堡图标替换为后退按钮
  • 应该没有内存泄漏

什么是最好的解决方案?有人有这方面的代码示例吗?

【问题讨论】:

标签: ios swift uinavigationcontroller navigation navigation-drawer


【解决方案1】:

根据那里的代码,他们已经在使用 UINavigationController 来加载选定的菜单选项。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)newIndexPath{
    [tableView deselectRowAtIndexPath:newIndexPath animated:YES];

    KYDrawerController *elDrawer = (KYDrawerController*)self.navigationController.parentViewController;
    UIViewController *viewController;
    switch ([newIndexPath row]) {
        case 0:{

            viewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"VC1"];                

            break;
        }

        case 1:{
viewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"VC2"];                break;
        }

        default:{
            viewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"VC3"];                
            break;
        }




    }

    UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:viewController];

     elDrawer.mainViewController=navController;
    [elDrawer setDrawerState:DrawerStateClosed animated:YES];
}

要从侧面菜单加载的控制器,您需要添加一个 leftbarbutton 项目作为抽屉按钮。在该按钮的选择器中,您需要添加以下代码行。

- (IBAction)clickedOpen:(id)sender {

    KYDrawerController *elDrawer = (KYDrawerController*)self.navigationController.parentViewController;
    [elDrawer setDrawerState:DrawerStateOpened animated:YES];
}

【讨论】:

  • 这不是每次都会创建一个新的 NavigationController,我是否需要以编程方式添加汉堡图标,或者我可以使用我现有的 uinavigationview 控制器并使用正确的颜色和图标等?
  • 是的,这每次都会创建新的导航控制器,但您可以通过重用它来避免这种情况。对于该图标,您正在使用的第三方,根据那里的示例,您需要手动添加该按钮。
【解决方案2】:

首先,您应该设置KYDrawerController 让它成为您应用程序的根视图控制器,我建议将drawerController 声明为AppDelegate.swift 中的实例变量:

var drawerController:KYDrawerController?

因此,在didFinishLaunchingWithOptions 方法中,您可以实现:

let appDelegate = UIApplication.shared.delegate as! AppDelegate

// let's say that you got your first view controller from the "Main" storyboard:
let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)

// asssume that controller would be "HomeViewController"
let homeVC = mainStoryboard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController

let navigation:UINavigationController = UINavigationController(rootViewController: homeVC)

appDelegate.drawerController = KYDrawerController(drawerDirection: .left , drawerWidth: 280)
appDelegate.drawerController.mainViewController = navigation

appDelegate.window?.rootViewController = appDelegate.drawerController

通过实现上述代码,你应该可以在应用程序中从anywhere更改要打开的抽屉的状态,如下所示:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.drawerController!.setDrawerState(.opened, animated: true)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多