【问题标题】:Use A delegate to pass data back through multiple view controllers使用委托通过多个视图控制器传回数据
【发布时间】:2012-09-23 00:08:04
【问题描述】:

在 IOS 中,我很乐意在视图之间传递数据,这些视图直接在使用 prepareforsegue 向前传递数据和委托将其传递回来之间进行分隔。

我遇到的问题是我正在构建一个通过 4 个视图进行分隔的应用程序,然后当用户在第四个视图上按 Enter 键时,我弹出其余视图以返回到第一个视图控制器,它是视图,但我不知道如何将数据委托给第一个。

我认为问题在于在第一个视图控制器中设置委托。我无法像通常使用 segue.destinationviewcontroller 那样设置它,因为该视图控制器尚不存在。我应该把它设置在别的地方吗?这样做的正确方法是什么?

【问题讨论】:

    标签: objective-c ios delegation


    【解决方案1】:

    在这种情况下,请考虑使用NSNotificationCenter 在您的视图控制器之间进行通信,而不是使用委托来传递数据。

    在您的第一个视图控制器中,您将注册以侦听通知:

    - (void)viewDidLoad
    {
        [[NSNotificationCenter defaultCenter] addObserver:self 
                                                 selector:@selector(handleFourthViewSubmit:)        
                                                     name:@"fourthViewSubmit" 
                                                   object:nil];
    }
    

    并创建发送通知时要运行的方法:

    - (void)handleFourthViewSubmit:(NSNotification *)notification {
        NSDictionary *theData = [notification userInfo];  // theData is the data from your fourth view controller
    
        // pop views and process theData
    
    }
    

    在您的第一个视图控制器的 dealloc 方法中,请务必取消注册为观察者(以避免潜在的崩溃):

    -(void) dealloc {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
        [super dealloc];
    }
    

    然后在你的第四个视图控制器中,当按下回车按钮时广播通知:

    // note: dataDict should be an NSDictionary containing the data you want to send back to your first view controller
    [[NSNotificationCenter defaultCenter] postNotificationName:@"fourthViewSubmit" 
                                                        object:self 
                                                      userInfo:dataDict];
    

    【讨论】:

    • 效果很好,谢谢!我只有一个问题——我正在使用自动引用计数。我只使用过 ARC,对它们的区别不太熟悉。我需要担心 dealloc 方法,还是这是自动的?还有什么我应该做的吗?再次感谢!
    • 如果您使用的是 ARC,只需删除对 [super dealloc] 的调用即可。编译器会自动为你添加。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    相关资源
    最近更新 更多