1. ホーム
  2. ios

[解決済み] アクションシートにUIPickerViewとボタンを追加する - How?

2022-09-12 03:41:48

質問

私のアプリケーションでは、アクションシートに以下のものを追加する必要があります。

  • UIToolbar
  • UIToolbarのボタン
  • UIPicker コントロール

私は私の要件を理解するために画像を添付しています。

どのように実装すればよいのか、教えてください。

どのように解決するのですか?

iOS 7のアップデート

UIActionSheet の Apple ドキュメント : UIActionSheet is not designed to be subclassed, nor should you add views to its hierarchy

iOS 7 では深刻な無効なコンテキスト エラーにつながる可能性があるため、ActionSheet のコンテンツをカスタマイズしようとしないことをお勧めします。私はこの問題を解決するのに数時間を費やしましたが、最終的に別のアプローチを取ることにしました。アクション シートを表示する呼び出しを、シンプルなテーブル ビューを含むモーダル ビュー コントローラに置き換えたのです。

これを達成する方法はたくさんあります。私が現在のプロジェクトで実装した方法の 1 つを紹介します。ユーザーにオプションのリストから選択させる 5、6 の異なる画面間で再利用できるので、これは素晴らしいです。

  1. UITableViewControllerのサブクラスを新規に作成します。 SimpleTableViewController .
  2. ストーリーボードにUITableViewControllerを作成し(ナビゲーションコントローラーに埋め込み)、そのカスタムクラスをSimpleTableViewControllerに設定します。
  3. SimpleTableViewControllerのナビゲーションコントローラーにストーリーボードIDとして"SimpleTableVC"を付与します。
  4. SimpleTableViewController.hで、テーブルのデータを表現するNSArrayプロパティを作成します。
  5. 同じくSimpleTableViewController.hで、プロトコルを作成します。 SimpleTableViewControllerDelegate に必須メソッドである itemSelectedatRow: で、delegate という弱いプロパティがあり、型は id<SimpleTableViewControllerDelegate> . このようにして、親コントローラに選択範囲を渡します。
  6. SimpleTableViewController.m で、テーブルビューのデータソースとデリゲートメソッドを実装し、以下のように呼び出します。 itemSelectedatRow:tableView:didSelectRowAtIndexPath: .

このアプローチには、かなり再利用しやすいという利点があります。使用するには、 ViewController.h で SimpleTableViewController クラスをインポートし、 SimpleTableViewDelegate に適合させ、SimpleTableViewDelegate を実装してください。 itemSelectedAtRow: メソッドを実装します。そして、モーダルを開くには新しい SimpleTableViewController をインスタンス化し、テーブルデータとデリゲートを設定し、それを表示するだけです。

UINavigationController *navigationController = (UINavigationController *)[self.storyboard instantiateViewControllerWithIdentifier:@"SimpleTableVC"];
SimpleTableViewController *tableViewController = (SimpleTableViewController *)[[navigationController viewControllers] objectAtIndex:0];
tableViewController.tableData = self.statesArray;
tableViewController.navigationItem.title = @"States";
tableViewController.delegate = self;
[self presentViewController:navigationController animated:YES completion:nil];

簡単な例を作成し githubに投稿しました。 .

また アクションシートを表示するとCGContext invalid contextエラーが発生する .