0

これが私の状況です。

マスター ディテール テンプレートを使用して新しいプロジェクトを作成しました。MasterViewController には、タイトルのみを表示するテーブルとセルがあります。セルをカスタムに変更し、2 つのテキスト フィールドを追加しました。私のアプリの要件は、ユーザーがテキストフィールドにポイントを入力するとすぐにグラフをリアルタイムでプロットすることです。グラフは詳細ビューに表示され、その部分は正常に動作します (グラフ プロット)。

今私の問題は、uiviewコントローラーではないクラスからデータを転送する方法です。MasterViewController は UITableViewController のサブクラスですが、テキストフィールドのアウトレットを作成するには、UITableViewCell のサブクラスが必要です。そのため、新しいクラス CellData (UITableViewCell のサブクラス) を作成し、IBAction didFinishEditing と IBOutlets をテキストフィールドに使用してテキストフィールドからリアルタイムで値を取得でき、データは自動的に配列に追加されます。

次に、この配列を MasterViewController にプッシュしてから、実際にグラフを描画するクラス GraphDraw にプッシュする方法を教えてください。私がしたことは、理想的な解決策ではないと思われるグローバルクラスを作成することです。誰かが提案したように、3 方向のプロトコルを作成してソリューションを委任するか、モデル クラスを作成する必要がありますか?

これまでのところ、すべてのプロトコルとデリゲートのチュートリアルは viewControllers に焦点を当てていました。問題はありませんが、私の状況ではうまく機能しません。また、NSObject のサブクラスであるモデル クラスでは、セル データを直接取得できません。質問が長い場合は申し訳ありませんが、私は初心者であり、これらの問題を解決する最善の方法を見つけようとしています. どんな助けでも大歓迎です。

4

2 に答える 2

1

委任は、ここに行く方法です。ただし、このセットアップは少しわかりにくいため、探しているリソースが正確に得られないのはおそらくそのためです。

UITableViewCellまず、サブクラスから masterにメッセージを送信できるデリゲートが必要ですUITableViewController。以下に例を示します。

セルデータ

@protocol JDPlotCellDelegate <NSObject>

- (void)didFinishEditingWithData:(id)someData;

@end

がdidFinishEditingUITextFieldデリゲート メッセージを送信すると、次のようになります。

- (void)textFieldDidEndEditing:(UITextField *)textField {

    [self.delegate didFinishEditingWithData:textField.text];
}

ここまでは単純ですよね?

次に、マスター テーブルビュー コントローラーでデリゲートを実装する必要があります (セルにデリゲート プロパティが接続されていることを確認してください)。

MasterViewController

- (void)didFinishEditingWithData:(id)someData {

    [self.detailViewController plotSomeData:someData];
}

- (void)plotSomeData:(id)someData;次に、マスターは詳細ビュー コントローラーへの参照を持っているため、データを取得してプロットできる詳細ビュー コントローラーでパブリック メソッドを宣言するのと同じくらい簡単です。

お役に立てれば!

于 2013-04-06T18:49:54.233 に答える
1

デリゲートを使用したくない場合は、NSNotifications を使用してアプリ内の他のリスナーにイベントが発生したことを伝え、通知でデータをピギーバックすることもできます。

通知 -viewDidLoad の受信側で、おそらくこれを追加します。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(masterEventOccurred:) name:@"MasterEventNotfication" object:nil]; 

この関数をリスナー クラスに追加します。

-(void)masterEventOccurred:(NSNotification *)notification
{
   //notification happened
   NSLog(@"object sent: %@",notification.object);
}

リスナー クラスの dealloc で、通知オブザーバーを削除します

-(void) dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
 } 

これですべての設定が完了し、イベントを発生させる必要があります。マスター クラスの任意の場所に以下の行を追加します (あなたによると、textField デリゲート メソッドにある可能性があります)。

[[NSNotificationCenter defaultCenter] postNotificationName:@"MasterEventNotfication" object:yourTextField.text];
于 2013-04-06T18:58:03.840 に答える