[解決済み] 2つのビューコントローラの間で通信するためのシンプルなデリゲートを設定するには?
2022-07-05 09:41:20
質問
私は、2つの
UITableViewControllers
があり、デリゲートを使用して子ビューコントローラから親ビューコントローラに値を渡す必要があります。デリゲートが何であるかは知っており、ただ単純に従う例を見たかったのです。
ありがとうございました。
どのように解決するのですか?
簡単な例...
例えば、子ビューコントローラに
UISlider
があり、スライダーの値をデリゲートで親に戻したいとします。
子ビューコントローラのヘッダーファイルで、デリゲートタイプとそのメソッドを宣言します。
ChildViewController.h
#import <UIKit/UIKit.h>
// 1. Forward declaration of ChildViewControllerDelegate - this just declares
// that a ChildViewControllerDelegate type exists so that we can use it
// later.
@protocol ChildViewControllerDelegate;
// 2. Declaration of the view controller class, as usual
@interface ChildViewController : UIViewController
// Delegate properties should always be weak references
// See http://stackoverflow.com/a/4796131/263871 for the rationale
// (Tip: If you're not using ARC, use `assign` instead of `weak`)
@property (nonatomic, weak) id<ChildViewControllerDelegate> delegate;
// A simple IBAction method that I'll associate with a close button in
// the UI. We'll call the delegate's childViewController:didChooseValue:
// method inside this handler.
- (IBAction)handleCloseButton:(id)sender;
@end
// 3. Definition of the delegate's interface
@protocol ChildViewControllerDelegate <NSObject>
- (void)childViewController:(ChildViewController*)viewController
didChooseValue:(CGFloat)value;
@end
子ビューコントローラの実装で、必要に応じてデリゲートメソッドを呼び出します。
ChildViewController.m
#import "ChildViewController.h"
@implementation ChildViewController
- (void)handleCloseButton:(id)sender {
// Xcode will complain if we access a weak property more than
// once here, since it could in theory be nilled between accesses
// leading to unpredictable results. So we'll start by taking
// a local, strong reference to the delegate.
id<ChildViewControllerDelegate> strongDelegate = self.delegate;
// Our delegate method is optional, so we should
// check that the delegate implements it
if ([strongDelegate respondsToSelector:@selector(childViewController:didChooseValue:)]) {
[strongDelegate childViewController:self didChooseValue:self.slider.value];
}
}
@end
親ビューコントローラのヘッダファイルにおいて、親ビューコントローラが
ChildViewControllerDelegate
プロトコルを実装することを宣言します。
RootViewController.h
#import <UIKit/UIKit.h>
#import "ChildViewController.h"
@interface RootViewController : UITableViewController <ChildViewControllerDelegate>
@end
親ビューコントローラの実装で、デリゲートメソッドを適切に実装します。
RootViewController.m
#import "RootViewController.h"
@implementation RootViewController
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
ChildViewController *detailViewController = [[ChildViewController alloc] init];
// Assign self as the delegate for the child view controller
detailViewController.delegate = self;
[self.navigationController pushViewController:detailViewController animated:YES];
}
// Implement the delegate methods for ChildViewControllerDelegate
- (void)childViewController:(ChildViewController *)viewController didChooseValue:(CGFloat)value {
// Do something with value...
// ...then dismiss the child view controller
[self.navigationController popViewControllerAnimated:YES];
}
@end
これが役に立つといいのですが
関連
-
[エラー処理】iOSのエラー、アーキテクチャx86_64の未定義シンボルについて
-
[解決済み] ペン先を読み込んだが、「表示」コンセントが設定されていない
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] 制約条件の変更をアニメーションで表現するには?
-
[解決済み] UITableViewの下にある余分なセパレータをなくす
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] Swift で HTTP リクエストを行うにはどうしたらいいですか?
-
[解決済み] コア・データ エンティティの全インスタンスを削除する最短の方法
-
[解決済み] ビューを非表示にしたときに、オートレイアウトで他のビューを移動するには?
-
[解決済み] Objective-Cのデリゲートには通常、retainではなくassignというプロパティが与えられるのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
libc++abi.dylib が NSException 型の捕捉できない例外で終了する理由 エラー
-
[iOS]コンパイルエラー:ld: アーキテクチャ x86_64 のシンボルが見つかりません。
-
[解決済み] 制約条件の変更をアニメーションで表現するには?
-
[解決済み] UITextViewのプレースホルダー
-
[解決済み] iOS 8 UITableViewのセパレータインセット0が機能しない件
-
[解決済み] UITextFieldのテキスト変更イベント
-
[解決済み] Unwind segueは何に使うのか、どう使うのか?
-
[解決済み] テキストフィールドを移動する方法(次へボタン/完了ボタン)
-
[解決済み] NSOperationとGrand Central Dispatchの比較
-
[解決済み] iOSとWatchKitで画像のtintColorを変更する方法