IPhone自定义UIButton不能DismissModalViewController



我在IPhone导航应用程序中有一个自定义UIButton类。当用户单击按钮时,我呈现一个模态视图,其中显示了用户可以从中选择的记录的表视图列表。

在点击按钮时,我创建了我的viewController,并使用以下代码显示它:

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    dropDownPickerViewController = [[DropDownListingViewController alloc] initWithNibName:@"DropDownListingView" bundle:[NSBundle mainBundle]];
    .....
    .....
[[(AppDelegate_iPhone *)[[UIApplication sharedApplication] delegate] navigationController] presentModalViewController:dropDownPickerViewController animated:NO];
[dropDownPickerViewController release];
[super touchesEnded:touches withEvent:event];
}

你可以看到按钮可以在任何viewController上所以我从app委托中抓取navigationController。比在我的DropDownPickerViewController代码我有以下当用户选择一个记录:

[[(AppDelegate_iPhone *)[[UIApplication sharedApplication] delegate] navigationController] dismissModalViewControllerAnimated:NO];

但是什么也没有发生。它似乎冻结和悬挂,不允许任何与形式的互动。关于为什么我的ModalViewController不会被解雇的任何想法?我认为这是我使用app委托来呈现viewController的方式。有没有一条路可以自己走。在UIButton类中的ParentViewController,这样我就可以获得按钮所在视图的ViewController(如果这是问题)?

如有任何意见,不胜感激。

谢谢

我确实记得我曾经做过类似的事情,通过查看这篇文章:

从UIView获得UIViewController ?

我可以创建一些类别:

//
//  UIKitCategories.h
//
#import <Foundation/Foundation.h>
@interface UIView (FindUIViewController)
- (UIViewController *) firstAvailableUIViewController;
- (id) traverseResponderChainForUIViewController;
@end
@interface UIView (FindUINavigationController)
- (UINavigationController *) firstAvailableUINavigationController;
- (id) traverseResponderChainForUINavigationController;
@end


//
//  UIKitCategories.m
//
#import "UIKitCategories.h"
@implementation UIView (FindUIViewController)
- (UIViewController *) firstAvailableUIViewController {
    // convenience function for casting and to "mask" the recursive function
    return (UIViewController *)[self traverseResponderChainForUIViewController];
}
- (id) traverseResponderChainForUIViewController {
    id nextResponder = [self nextResponder];
    if ([nextResponder isKindOfClass:[UIViewController class]]) {
        return nextResponder;
    } else if ([nextResponder isKindOfClass:[UIView class]]) {
        return [nextResponder traverseResponderChainForUIViewController];
    } else {
        return nil;
    }
}
@end
@implementation UIView (FindUINavigationController)
- (UINavigationController *) firstAvailableUINavigationController {
    // convenience function for casting and to "mask" the recursive function
    return (UINavigationController *)[self traverseResponderChainForUINavigationController];
}
- (id) traverseResponderChainForUINavigationController {
    id nextResponder = [self nextResponder];
    if ([nextResponder isKindOfClass:[UINavigationController class]]) {
        return nextResponder;
    } else {
        if ([nextResponder isKindOfClass:[UIViewController class]]) {
            //NSLog(@" this is a UIViewController ");
            return [nextResponder traverseResponderChainForUINavigationController];
        } else {
            if ([nextResponder isKindOfClass:[UIView class]]) {
                return [nextResponder traverseResponderChainForUINavigationController];
            } else {
                return nil;
            }
        }
    }
}
@end

你可以这样调用它们:

UINavigationController *myNavController = [self firstAvailableUINavigationController];
UIViewController *myViewController = [self firstAvailableUIViewController];

也许他们会帮助你,我希望如此。

在你的DropDownPickerViewController,而不是这个:

[[(AppDelegate_iPhone *)[[UIApplication sharedApplication] delegate] navigationController] dismissModalViewControllerAnimated:NO];

[self dismissModalViewControllerAnimated:NO]; 

我会在按钮的"父"视图控制器上调用一个方法,并从那里执行。

相关内容

  • 没有找到相关文章

最新更新