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