连接到已经初始化的视图控制器
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。
【讨论】:
以上是关于连接到已经初始化的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
UITableView 的自定义初始化连接为 IBOutlet [关闭]
使用多个 ViewController、Xcode 将代码连接到情节提要中的 UI
segueing 时的核心数据错误:无法在 NSManagedObject 类上调用指定的初始化程序