【问题标题】:1 delegate to 3 view controllers1 个委托给 3 个视图控制器
【发布时间】:2014-04-08 01:02:14
【问题描述】:

我有一个本质上是条形码扫描仪的 cameraViewController。我还有 3 个视图控制器(A、B 和 C),每个控制器都有一个通向这个 cameraViewController 的按钮。

当 cameraViewController 扫描条形码时,它会执行以下操作:

if (self.detectionString != nil)
    {
        [self.delegate cameraViewController:self withCardNumber:self.detectionString];
        [self.navigationController popViewControllerAnimated:YES ];

        break;
    }

它有一个委托并将检测到的字符串发送回前一个/父视图控制器。 所有三个 viewController 都实现了以下方法:

#pragma mark - CameraViewControllerDelegate

- (void)cameraViewController:(CameraViewController *)cameraViewController withCardNumber:(NSString *)number
{
self.CardNumbertext.text = number ;
}

所以这两种方法都适用于 cameraViewController 和 viewControllerA。但是,当parentViewController为B或C时,cameraViewController仍会弹回右边的控制器,但delegate函数并没有运行。我做错了什么?

【问题讨论】:

  • 一次只能有一个对象的委托,所以看起来控制器 A 是那个接手的人。因此,您要么需要让前一个委托人放弃该滚动,以便另一个可以成为委托人,要么使用 NSNotification 来代替。
  • 如何设置和切换代理?
  • 在cameraViewController初始化时,将delegate设置为“当前”的parentViewController。
  • 您应该显示如何设置委托的代码。还要解释您的控制器层次结构(A、B 和 C 是否嵌入在导航控制器中,是否有标签栏控制器等)。

标签: ios objective-c delegates


【解决方案1】:

只有一个 cameraViewController 实例和三个不同的视图控制器通过每个将 cameraVC 的委托设置为自己来“争夺它”是很困难的。我认为,如果 A、B、C 视图控制器中的每一个都通过实例化 CameraViewController 的新实例并将该实例的委托设置为 self 来响应按钮按下,那么这是对系统资源的更好利用和更好的架构。这应该可以解决您的问题并改善内存管理/泄漏问题。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 为什么这样更好?请参阅下面的评论,如果每个 VC 拥有自己的实例并在完成后可以释放它,似乎会更好。
    • 你的解决方案也不错,RobP。我想这个决定取决于偏好。
    【解决方案3】:

    如果您想保留当前的实现,请在呈现 ViewController A、B 和 C 时更新委托。从您在问题中描述的方式看来,您需要在 -(void)viewWillAppear-(void)viewDidAppear 中执行此操作。或者按照 OP 的建议使用通知管理器,或者使用块。

    【讨论】:

      猜你喜欢
      • 2018-01-01
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多