##はじめに
備忘録がてら誰かの役に立てればと考え、投稿することにしました。今回はViewが管理する最初のコントローラーを取得する方法を書いていきたいと思います。
##メソッド
こちらのメソッドを使ってコントローラーを取得します。こちらはUIViewのプライベートメソッドなのでご注意を。
- (id)_viewControllerForAncestor;
##使用例
このメソッドを使うことになった経緯として、ロック画面のミュージックプレイヤーをコンパクトな形にするTweakを作成する際に、コントロールセンターとのミュージックプレーヤーと区別するために利用しました。以下にそのコードを書いておきます。
Tweak.xm
%hook MRUNowPlayingControlsView //再生ボタンなどのコントロール関連のクラス
-(void)layoutSubviews
{
%orig;
MRUNowPlayingViewController* controller = (MRUNowPlayingViewController *)[self _viewControllerForAncestor]; //自身のUIViewControllerを取得。
if ([controller respondsToSelector:@selector(delegate)] && ![controller.delegate isKindOfClass:%c(MRUControlCenterViewController)]) //取得したコントローラーにdelegateがあるかの確認と自身がMRUControlCenterViewControllerに属していないことの確認。
{
self.hidden = YES; //非表示
}
}
%end