NSNotification 和关闭模式视图控制器的问题

Posted

技术标签:

【中文标题】NSNotification 和关闭模式视图控制器的问题【英文标题】:Problem with NSNotification & Dismissing modal View Controllers 【发布时间】:2011-07-25 22:11:18 【问题描述】:

所以,我有一个 tabbarcontroller,当一个特定的tabBarItem 被触摸时,我会向dismissModalViewController 传递一个通知。

它运行良好,模式视图控制器被关闭。但是我想以特定的方式对其进行更改,但它并没有像我期望的那样工作......

我在发布通知之前初始化了观察者。这些是 tabBarItems -

NSArray *viewControllerss = [[NSArray alloc] initWithObjects: myProfileDataViewController, 
sampleViewController,reminderInfoViewController, nil];


[self.tabBarContr setViewControllers:viewControllerss animated:YES];
self.tabBarContr.selectedIndex = 2;

我在sampleViewControllerviewWillAppear 上发送通知,当我选择那个tabBarIcon 时,它会关闭TabBarController。

但我希望sampleViewController 位于UITabBar 的最左侧。

所以我像这样添加它

 NSArray *viewControllerss = [[NSArray alloc] initWithObjects: sampleViewController,
 myProfileDataViewController, reminderInfoViewController, nil];

这不会关闭标签栏控制器。

注意: 请看NSArray的初始化顺序。

通知发布在viewWillAppear ofsampleViewController` 中,并在相应的视图控制器中显示模态视图控制器

【问题讨论】:

【参考方案1】:

你能在发布通知之前放一个 NSLog 吗?

查看应用加载时是否有任何输出。

编辑:根据您的回复添加答案

在你的 sampleViewController 你可以试试这个:

使其符合 UITabBarControllerDelegate。你的 sampleViewController 类接口应该是这样的:

@interface SampleViewController : UIViewController <UITabBarControllerDelegate>

然后在你的 sampleViewController 的 .m 中,在 viewDidLoad 中,将委托设置为 sampleViewController(在本例中为 self)

-(void) viewDidLoad
   
    [super viewDidLoad];

    // Assuming you have a reference to your tabBarController somewhere

    [self setDelegate:self]; // try this line or the line below
    // [[self tabBarController] setDelegate:self];

    // The rest of your drawing code here

现在在 sampleViewController .m 文件中的某处实现委托方法。

-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController

    // I've included this to see if this method actually gets called or not.
    NSLog(@"Dismissing modal view controller");

    // check to make sure sampleViewController tab was pressed by checking 
    // the class type of the viewController parameter being passed in

    if ([viewController isKindOfClass:[SampleViewController class]]  
    
        // I assume you have a pointer reference to that modal view controller 
        // you want to dismiss
        [self dismissModalViewController:theUnwantedViewController animated:YES];
    



看看这是否有效。

【讨论】:

我总是到处使用 NSLog。通知已发送,观察者已准备就绪。当sampleViewController首先添加到数组时,模态视图不会关闭 所以你得到了那个 NSLog 的输出?我想知道标签之间的切换是否会触发 viewWillAppear 方法。 是的,它没有触发 viewWillAppear。 可能是当应用程序第一次加载时,第一个标签栏控制器已经被加载,viewWillAppear 触发了一次但没有任何反应。然后,当您的应用程序完成加载时,您会看到标签栏控制器 2(由于您的标签栏选择索引 2 代码),当您尝试切换回 sampleViewController 时,它不会将其视为视图出现,因此 viewWillAppear 从未被解雇,因此,为什么您的关闭视图控制器的通知从未被调用?我想我记得有一个协议委托方法可以让你在选择标签栏时做一些事情。 您完全正确。我该怎么办?

以上是关于NSNotification 和关闭模式视图控制器的问题的主要内容,如果未能解决你的问题,请参考以下文章

NSNotification、addObserver 和 removeObserver - ViewDidUnload 和 dealloc 中的 removeObserver?

UIView 在横向模式下被切断

呈现和关闭模式视图控制器时如何保持选择集合视图单元格?

在应用程序退出时关闭模式视图控制器

模式视图控制器关闭后iOS 8键盘关闭延迟

在关闭另一个模式视图控制器后呈现一个模式视图控制器