连接到已经初始化的视图控制器

Posted

技术标签:

【中文标题】连接到已经初始化的视图控制器【英文标题】:Seguing to a View Controller that´s already been initialized 【发布时间】:2013-07-31 16:15:08 【问题描述】:

我遇到了一个最初为 iPhone 设计的通用应用程序的问题,我在 iPhone 上使用了第 3 方类的弹出窗口。在 iPad 上,我想使用 Apple 提供的弹出窗口。我的问题是我的代码是这样编写的,因此弹出窗口的视图控制器已经在包含弹出窗口的类的 viewDidLoad 中初始化,并且在进行 seguing 时 - 分配了该类的新实例。有没有办法将已经在prepareForSegue 中分配的bckMusicPlayer 传递给它?

@property (nonatomic,strong) MJDetailViewController *bckMusicPlayer; //在调用 prepareForSegue 时已经初始化。我想继续这个对象。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    NSLog(@"prepare for segue");
    if ([segue.identifier isEqualToString:@"Show iPad Player"]) 
        if ([segue isKindOfClass:[MJDetailViewController class]]) 

        

    

编辑:我让它从 bckMusicPlayer 传递了播放器(AVAudioPlayer)对象

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([segue.identifier isEqualToString:@"Show iPad Player"]) 

        NSLog(@"class: %@",[segue class]);
        if ([segue.destinationViewController isKindOfClass:[MJDetailViewController class]]) 
            NSLog(@"prepare for segue");
            MJDetailViewController *destinationVC = segue.destinationViewController;
            destinationVC.player = self.bckMusicPlayer.player;
        

    

【问题讨论】:

【参考方案1】:

你不能反过来吗?为什么必须创建MJDetailViewController 的实例?让 segue 为您完成,然后在 prepareForSegue 中:您抓取目标控制器并将所需的数据传递给它。不要与框架抗争。

或者你可以覆盖:

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender

并防止segue以MJDetailViewController为目标并手动传输到您的控制器并呈现它。

【讨论】:

你有关于如何做到这一点的任何链接 - 手动转移到控制器? @TomLilletveit 你是什么意思?使用 UIPopoverController?如果你在 Bing 或 SO 上用谷歌搜索,你会发现很多例子。 查看我更新的问题!它似乎工作正常,认为这是一个 hack,但这是因为我很懒,把应该在模型中的东西放在视图控制器中 你完全按照我的建议做了。阅读我的回答:“然后在 prepareForSegue 中:你抓住目标控制器并将所需的数据传递给它”【参考方案2】:

不,你不能那样做。 Segues(除了展开)总是实例化新的控制器。您要么不需要在 viewDidLoad 中实例化它,要么在代码中移动到新控制器而不是使用 segue。

【讨论】:

以上是关于连接到已经初始化的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

IOS如何将一个数组连接到另一个视图控制器

UITableView 的自定义初始化连接为 IBOutlet [关闭]

使用多个 ViewController、Xcode 将代码连接到情节提要中的 UI

segueing 时的核心数据错误:无法在 NSManagedObject 类上调用指定的初始化程序

从 AppDelegate 转到 navigationcontroller 故事板中的详细视图

在不同的视图控制器中更改另一个视图的出口