21

プロジェクト内の他のViewControllerの基本クラスとして機能できる、プロジェクトのBaseViewControllerクラス(から継承する)が必要です。UIViewControllerこれは、共通の進行状況HUD、更新ボタンとネットワーク更新メカニズム、各サブクラスによってテキストでカスタマイズできるエラーダイアログなどを追加するためのものです。

UIViewController重要なのは、この機能をサブクラスとサブクラスの両方に追加できるようにしたいのですが、クラス階層にUITableViewController自分自身を挿入できないため、効果的にとが必要ですが、これを行う場合は、変更を2回実装する必要がありますそれらの同期を維持します。UITableViewControllerBaseUIViewControllerBaseUITableViewController

BaseViewControllerサブクラスとサブクラスの両方にアクセス可能でなければならない共通のコードのための単一の場所を持つための最良のアプローチは何BaseTableViewControllerですか?一般的なタスクを処理する必要があるコード内の場所が1つだけ必要です。

1)連想参照を持つカテゴリを使用することを考えましたが、ここでの問題は、viewDidLoad:などのViewControllerライフサイクルクラスのカスタム実装が必要なことです。これはお勧めできません。

2)UITableViewController完全にスキップしBaseTableViewControllerて、BaseViewControllerから独自の実装を行い、自分でメソッドを実装することもできtableView delegateますが、datasourceここではAppleのコントローラーの実装をスキップすることにそれほど熱心ではありません。

3)BaseViewControllerから継承しUIViewController、からBaseTableViewController継承し、両方の「ベース」ファイルから呼び出すことができるUITableViewController3番目のファイルにカスタムメソッド呼び出しを配置することができます。ViewControllerBaseMethodsプロパティの重複はまだあるかもしれませんが、少なくともメソッドコードは1か所にあります。

このタイプのもののための他の良いアプローチはありますか?

4

3 に答える 3

8

UITableViewControllerが行うのは、UITableViewプロパティを提供し、それ自体をデリゲートおよびデータソースとして宣言し、そのビューをテーブルビューとして設定することだけです。

したがって、BaseViewControllerを拡張するBaseTableViewControllerを作成し、それをUITableViewDataSourceおよびUITableViewDelegateとして宣言して必要なメソッドを実装し、UITableViewプロパティを追加して、loadViewを実装します。

- (void)loadView
{
    self.tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] andStyle:UITableViewStylePlain];
    self.tableView.delegate = self;
    self.tableView.datasource = self;
    self.view = self.tableView;
}

異なるテーブルビュースタイルを使用する場合は、初期化時にテーブルビュースタイルを取得するための共通のメソッドまたはプロパティを提供できます。

于 2012-07-23T10:06:38.477 に答える
5

共通のプロパティと関数を使用してプロトコル定義を作成し、BaseTableViewControllerとBaseViewControllerがそれを採用する必要があると思います。その後、3番目のオプションは適切に聞こえます。プロトコルの実装を使用してファイル(ViewControllerBaseMethods)を作成する必要があります。このファイルは、両方の「ベース」ファイルから呼び出す必要があります。

したがって、メソッドコードは1つの場所にあり、複数のプロパティ宣言はありません。

これは、Objective-Cに多重継承がないことに対処する方法です。

于 2012-07-23T10:58:36.903 に答える
1

Swiftでは、UIViewController拡張機能を作成し、そこにメソッドを配置できます。このようにして、UIViewControllersおよびUITableViewControllersからメソッドを使用できます。

extension UIViewController {
    var aComputedProperty: Bool {
        return true
    }

    func aMethod() {
        //do something
    }
}

これの欠点は、保存されたプロパティを使用できないことです。

var aProperty: Int? //this is not allowed in extensions
于 2017-06-22T18:38:21.737 に答える