1

我有我的iPhone导航应用程序中的自定义UIButton类。当用户点击按钮时,我呈现一个模式视图,显示用户可以从中选择的记录的表格视图列表。iPhone的自定义UIButton不能DismissModalViewController

在按钮的点击创建我的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,所以我从应用程序的委托抢navigationController。在我的DropDownPickerViewController代码中,当用户选择一条记录时,我有以下几点:

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

但是什么也没有发生。它似乎冻结和挂起,不允许任何与表单的交互。任何想法为什么我的ModalViewController不会被解雇?我认为这是我使用应用程序委托呈现viewController的方式。有没有办法在UIButton类中去self.ParentViewController,这样我就可以获得按钮所在视图的ViewController(如果这是问题)?

任何想法将不胜感激。

感谢

回答

0

我记得,我以前也有做类似的事情一次,通过看这个帖子:

Get to UIViewController from UIView?

我能创造一些类别:

// 
// 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]; 

也许他们会帮助你, 但愿如此。

0

在你DropDownPickerViewController,取而代之的是:

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

尝试

[self dismissModalViewControllerAnimated:NO]; 
+0

感谢您的回复。但已经尝试过,并没有区别 – Matt

0

我会叫上按钮的 “父” 的viewController的方法,并从那里做。

+0

我试图保持按钮的通用,所以它不应该依赖它所在的viewController。如果可能的话? – Matt