web-dev-qa-db-ja.com

どうすればtvOSの特定のビューにフォーカスを変更できますか?

Siri Remoteのメニューボタンのクリックを処理するカスタムコードを実装しています。メニューボタンを押したときにフォーカスをカスタムメニューに強制的に変更するにはどうすればよいですか?

最後に自分でそれを理解しました。 preferredFocusedViewまたはUIViewUIViewControllerプロパティをオーバーライドする必要があります。

Swiftでは、次のように機能します。

func myClickHandler() {
    someCondition = true
    self.setNeedsFocusUpdate()
    self.updateFocusIfNeeded()
    someCondition = false
}

override weak var preferredFocusedView: UIView? {
    if someCondition {
        return theViewYouWant
    } else {
        return defaultView
    }
}

Objective-Cでゲッターをオーバーライドする方法を思い出せないので、誰かが投稿したい場合は、回答を編集します。

19
Slayter

IOS 10の場合は、preferredFocusedViewではなく、preferredFocusEnvironmentsを使用する必要があります。

以下の例でbuttonに焦点を当てたい場合は、以下のコードを参照してください。

@IBOutlet weak var button: UIButton!

override var preferredFocusEnvironments: [UIFocusEnvironment] {
    return [button]
}

override func viewDidLoad() {
    super.viewDidLoad()

    setNeedsFocusUpdate()
    updateFocusIfNeeded()
}
18
vikas prajapati

上記のSlaytersの回答に基づく別の実装を次に示します。条件付きブール値を使用するよりも少しエレガントだと思います。

これをビューコントローラーに入れてください

var viewToFocus: UIView? = nil {
    didSet {
        if viewToFocus != nil {
            self.setNeedsFocusUpdate();
            self.updateFocusIfNeeded();
        }
    }
}

override weak var preferredFocusedView: UIView? {
    if viewToFocus != nil {
        return viewToFocus;
    } else {
        return super.preferredFocusedView;
    }
}

次に、コードで使用するには

viewToFocus = myUIView;
15
Brandon Gill

これがObjective Cです

- (UIView *)preferredFocusedView
{
    if (someCondition) {
      // this is if your menu is a tableview
        NSIndexPath *ip = [NSIndexPath indexPathForRow:2 inSection:0];
        UITableViewCell * cell = [self.categoryTableView cellForRowAtIndexPath:ip];

        return cell;
    }

    return self.view.preferredFocusedView;

}

あなたのviewDidLoadまたはビューで次のように表示されました:

    UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
    focusGuide.preferredFocusedView = [self preferredFocusedView];
    [self.view addLayoutGuide:focusGuide];

最初の起動時にそれを実行したい場合

@ elu5ionの答えですが、objective-cで最初に宣言します。

@property (nonatomic) UIView *preferredView;

これらのメソッドを設定します。

-(void)setPreferredView:(UIView *)preferredView{
      if (preferredView != nil) {
         _preferredView = nil;
         UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
         [self.view addLayoutGuide:focusGuide];
         focusGuide.preferredFocusedView = [self preferredFocusedView];
         [self setNeedsFocusUpdate];
         [self updateFocusIfNeeded];
    }
    _preferredView = preferredView;
 }


 - (UIView *)preferredFocusedView {
     if (_preferredView) {
          return _preferredView;
     }
     return self.view.preferredFocusedView;
}

ここに素敵な小さなSwift 2コピー/貼り付けスニペットがあります:

var myPreferredFocusedView: UIView?
override var preferredFocusedView: UIView? {
    return myPreferredFocusedView
}
func updateFocus(to view: UIView) {
    myPreferredFocusedView = napDoneView
    setNeedsFocusUpdate()
    updateFocusIfNeeded()
}

次のように使用します。

updateFocus(to: someAwesomeView)
0
Wiingaard