6

ストーリーボード内のテーブルビューのデータソースとデリゲートアウトレットをカスタムデリゲートクラスに接続できません。それらのテーブル関数を別のクラスに委任したいと思います。ストーリーボードでの委任、アウトレット、配線に関して、私が根本的に誤解していることがあります。

バックグラウンド

私は、とりわけ、UIViewControllerを含むビューを持つを持っています。 大きすぎるところまで来たので、テーブル関連の関数を別のクラスに移動したいと思います。UIPickerViewUITableView
UIViewController

次のクラスを作成して、などのテーブルメソッドを含めましたnumberOfSectionsInTableView:

@interface ExerciseTableDelegate : NSObject <UITableViewDelegate, UITableViewDataSource> 

@property (strong, nonatomic) ExerciseDataController *dataController;

@end

上記のクラスへの参照を自分の中に置くことを考えましたUIViewController

@interface ExerciseViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate>
{
    UIPickerView *exercisePicker;
}

@property (strong, nonatomic) IBOutlet ExerciseTableDelegate *tableDelegate;

@end

ストーリーボード内で、テーブルビューのデータソースまたはデリゲートアウトレットの1つをドラッグUITableViewControllerすると、デリゲートされたクラスに接続できるようになることを期待していました。そうではありませんでした。

次に、ストーリーボード内にオブジェクトを作成して、クラスを与えようとしましたExerciseTableDelegate。次に、テーブルビューデリゲートをオブジェクトにドラッグできますが、これは、内で設定したオブジェクトと同じではありませんAppDelegate

私のアプリデリゲート

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
    ExerciseViewController *rootViewController = (ExerciseViewController *)[[navigationController viewControllers] objectAtIndex:0];

    ExerciseTableDelegate *tableDelegate = [[ExerciseTableDelegate alloc]init];
    ExerciseDataController *dataController = [[ExerciseDataController alloc] init];

    tableDelegate.dataController = dataController;
    rootViewController.tableDelegate = tableDelegate;

    // Override point for customization after application launch.
    return YES;
}
  • オブジェクトをシングルトンにして、デリゲートで初期化する必要がありますか?
  • ストーリーボードではなくコードでこの設定を行う必要がありますか?
  • ストーリーボードにオブジェクトを作成するのは間違った考えですか?

身近に感じますが、やりすぎだと思います。

4

1 に答える 1

1

アプリケーションデリゲートで設定したインスタンスにアクセスする場合はExerciseTableDelegate、ストーリーボードからアクセスできないため、コードでテーブルビューに接続する必要があります。ストーリーボードの新しいオブジェクトは、新しいインスタンスを作成します。

幸いなことに、これは実装が非常に簡単です。テーブルビューコントローラのviewDidLoadメソッドで、次を追加します。

self.tableView.delegate = self.tableDelegate;
self.tableView.datasource = self.tableDelegate;

これにより、データソースが再ポイントされ、別のオブジェクトに委任されます。

于 2012-06-24T08:56:41.143 に答える