【问题标题】:Clean way to set delegate on custom class through topviewcontroller通过 topviewcontroller 在自定义类上设置委托的简洁方法
【发布时间】:2013-12-23 10:31:28
【问题描述】:

我已经定义了一个类NewViewController,它显示了一个在应用程序中添加新项目的屏幕,它被包裹在UINavigationController 中。我想在这个UIViewController上设置一个delegate,我目前在prepareForSegue方法中这样做:

UINavigationController *navController = segue.destinationViewController;
NewViewController *newViewController = (NewViewController *)navController.topViewController;
[newViewController setDelegate:self];

这行得通,但我觉得这并不优雅,也不是我应该这样做的方式。获得此结果的最佳方法是什么?

编辑:NewViewController 中的delegateNewViewController 中的所有字段都填写并提交时被调用。现在这是唯一来自NewViewControllerdelegated。模态显示NewViewControllerUIViewController 被设置为delegate(在这种情况下为self)。

【问题讨论】:

  • 也许你可以告诉我们更多关于delegates的信息以及你想在`NewViewController`中用它做什么
  • 我更详细地更新了这个问题。
  • 无法在storyboard的不同viewcontrollers之间设置outlet连接,所以这个方法好像没问题。

标签: ios objective-c uinavigationcontroller delegates


【解决方案1】:

我认为这种方法很好,尽管您可能需要进行更多的错误检查以防万一。如果这是一个命名的 segue,您可以检查 segue.identifier 以确保这是您期望的视图控制器。我也会像这样检查课程:

if ([segue.destinationViewController isKindOfClass:[UINavigationController class]])
{
    UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
    if ([navController.topViewController isKindOfClass:[NewViewController class]])
    {
        NewViewController *newViewController = (NewViewController *)navController.topViewController;
        [newViewController setDelegate:self];
    }
}

【讨论】:

    【解决方案2】:

    您所做的可能与您将要得到的一样干净。另一种可行但不如您所拥有的干净的方法是使用NSNotificationCenterself 的实例发送到NewViewController。我会坚持你所拥有的。

    【讨论】:

    • 要使用它,在 UIViewController 中包含 [[NSNotificationCenter defaultCenter] addObserver...] 以继续该过程,并在第二个 UIViewController 中的 UIButton 上添加 [[NSNotificationCenter defaultCenter] postNotifcationName...]
    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多