【问题标题】:Can't figure out how to use UINavigationControllerDelegate and pushViewController together in a UIViewController无法弄清楚如何在 UIViewController 中一起使用 UINavigationControllerDelegate 和 pushViewController
【发布时间】:2012-03-07 04:17:17
【问题描述】:

我有一个符合多个代表的UIViewController - 如下所示:

@interface SpotController : UIViewController <UITabBarDelegate, UITableViewDelegate, UITableViewDataSource, MKMapViewDelegate, UIActionSheetDelegate, UINavigationControllerDelegate>

由于某种原因,NavigationControllerDelegate 部分无法正常工作。我不确定我做错了什么。基本上,我正在尝试在选择表查看的行时拨到新的ViewController。我有以下代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{    
    NSIndexPath *selectedIndexPath = [tableView_ indexPathForSelectedRow];

    // do some stuff here to prep/set stuff on the destination VC

    DetailsVC *detailsVC = [self.storyboard instantiateViewControllerWithIdentifier:@"detailsVC"];
    [self.navigationController pushViewController:detailsVC animated:YES];
}

所以,就像我说的,pushViewController 不起作用,这意味着我没有被发送到目标 VC。我就是不去哪里。

注意:如果我将 ViewController 嵌入到 NavigationController 中(即在 StoryBoard 中选择 VC,然后选择 Editor | Embed In | Navigation Controller),则此确切代码可以完美运行。 但我不想这样做

我还尝试创建UINavigationController 类型的@property,然后在viewDidLoad 中对其进行分配初始化。我尝试了该方法的initinitWithRootViewController:self 版本,但都没有奏效。不确定我是否做得对。

也许我需要明确指定@property 作为委托?不知道该怎么做,我尝试了以下操作:

@synthesize navController = navController_;
- (void)viewDidLoad
{
    [super viewDidLoad];        
    navController_ = [[UINavigationController alloc] init]; // initWithRootViewController:self];
    [navController_ setDelegate:self];
}

但还是一无所获。

PS - 我正在使用带有 ARC 和 Storyboard 的 Xcode 4.3。

【问题讨论】:

  • 如果您使用情节提要,为什么不在情节提要中创建推送转场,然后使用 [self performSegueWithIdentifier:@"identifier" sender:self]?导航控制器的东西应该会自动为您控制。
  • 那太容易了 :) 实际上,由于多种原因,我真的不能这样做。 A) 屏幕的某些区域是以编程方式创建的,因此情节提要上没有可连接的对象。 B)类中的某些区域由 if 语句组成,并根据某些条件,推送到一个 VC 或另一个。

标签: objective-c ios cocoa-touch delegates pushviewcontroller


【解决方案1】:

如果导航控制器不在屏幕上,您不能要求导航控制器推送新的视图控制器。

注意:如果我将 ViewController 嵌入 NavigationController 中(即在 StoryBoard 中选择 VC,然后选择 Editor | Embed In | Navigation Controller),则此确切代码可以完美运行。 但我不想这样做

这样,您的导航控制器就会存在并显示在屏幕上。你为什么不想这样做呢?

我还尝试创建一个 UINavigationController 类型的 @property,然后在 viewDidLoad 中对其进行分配初始化。我尝试了该方法的 init 和 initWithRootViewController:self 版本,但都没有奏效。不知道我是否做得对。

这不起作用,因为导航控制器不控制屏幕上的内容,它只是存在于内存中。

简而言之,除非你有一个活动的导航堆栈,否则你不能将视图控制器推入和推出导航堆栈,并且如果不将 VC 嵌入导航控制器,你就没有.重新考虑你的设计。如果你想使用导航控制器的功能,你必须将你的 VC 嵌入到导航控制器中。

【讨论】:

  • 哦,他的回答比我的好。他是对的,如果导航控制器不在“屏幕”上,你就无法推动它。虽然,从技术上讲,这意味着如果它不在作为窗口一部分的视图层次结构中,则无法推送。但是,从框架位于当前视口之外的意义上说,该视图层次结构可能是“屏幕外”。然后对其进行动画处理。我用自己的 iPhone 版 SplitViewController 做了类似的事情。
  • 非常有意义!我只是将 VC 嵌入到导航控制器中,然后就结束了。谢谢大家!
【解决方案2】:

两个想法:

  • 首先,设置断点并单步执行您的代码,以确保 detailsVC 被正确实例化。如果detailsVC 没有被实例化,您可以尝试分配/初始化detailsVC 而不是使用故事板(顺便说一句 - 我从未使用过故事板,所以我不知道它的后果)。

  • 二,检查并确保self.navigationController 实际上返回了一个对象。同样,您将设置一个断点并在调试控制台中键入 po [self navigationController] 并查看它返回的内容。如果返回 nil,则由于某种原因,您的 viewController 没有设置它的 navigationController 属性,这可能与您设置的视图控制器层次结构有关。您可以尝试解决这个问题,或者手动传递并在视图控制器中保留对导航控制器的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多