2011-11-07 77 views
19

我一直在辩论这一段时间,希望你能帮助我。如何设置故事板的代表

我一直在创建一个应用程序主要使用故事板,我有一个点,我弹出一个模式框来添加一个新的记录,弹出工作正常,问题是解雇它。

我遵循Apple关于如何正确关闭使用代表的模态框的说明,并且工作正常,除了我需要向我的模式框添加导航控制器外,因为添加过程需要两个步骤(此处为fullscreen):

enter image description here

问题就出在设定的委托,所以这里是我的两个问题:

1-在我的根视图类(我的标签)是添加类(模态)的委托,除了这个之外,一切都设置正确:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showAdd"]) { 
     [[segue destinationViewController] setDelegate:self]; 

    } 
} 

问题在于[segue destinationViewController]正在返回导航控制器而不是AddDrinkViewController类(请参阅故事板)。我如何解决这个问题?如果我完全删除导航控制器,则代码可以很好地设置相应的代理。

2-是否有任何方法通过拖动故事板中的插座来设置委托?

谢谢!

+0

我一直在寻找如何设置模态的代表。非常感谢那些代码。哈哈 – MattAitchison

回答

13

你是对的,在这种情况下,destinationViewController将是UINavigationController。我写了一个类来处理这种常见的情况:

// category .h file 
@interface UIStoryboardSegue (NavControllerExtensions) 
// Gets destinationViewCotroller. But if that controller 
// is a NavigationController, returns the nav controller's 
// top level view controller instead. 
@property (readonly) id topLevelDestinationViewController; 
@end 

// category .m file 
@implementation UIStoryboardSegue (NavControllerExtensions) 
- (id)topLevelDestinationViewController 
{ 
    id dest = self.destinationViewController; 
    if ([dest isKindOfClass:[UINavigationController class]]) { 
    UINavigationController* nav = dest; 
    dest = nav.topViewController; 
    } 
    return dest; 
} 
@end 

所以,现在你可以做到这一点您在任何prepareForSegue方法,而不用担心是否有甚至存在NavigationController

[[segue topLevelDestinationViewController] setDelegate:self] 
// another example: 
MyViewController *vc = segue.topLevelDestinationViewController; 
vc.delegate = self; // etc. 

要回答你的第二个问题,我找不到在IB中设置委托的方法。

9

我发现我的情况更短的方法(和你的一样):

AddDrinkViewController *controller=[[[segue destinationViewController]viewControllers]objectAtIndex:0]; 
+1

不错!解决我的问题就像一个魅力! – iDroid

+0

完美,也解决了我的问题。无法理解为什么我可以引用其他使用相同导航控制器的viewController的属性,但不使用那些使用另一个的导航控制器。唷! –

+0

不错。这为我做了诡计。智能解决方案 –

4

基本上你需要创建一个
实例的UINavigationController和分配destinationViewController它
,并抓住它的冠捷控制器

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"showAdd"]) { 

    UINavigationController *navigationController = segue.destinationViewController; 
    AddDrinkViewController *addDrinkcontroller = (AddDrinkViewController *)navigationController.topViewController; 

    addDrinkcontroller.delegate = self; 

    } 
}