委任パターンを削除し、ブロックを使用することで、間違いなくもっとうまくいくことができます。
ブロックベースのプロパティを TagsScrollView .h ファイルに追加します
@property (copy, nonatomic) void (^tagPressedBlock)(id sender, NSString *query);
.m ファイルに、関連するコールバックを追加します
- (void)tagPressed:(id)sender {
if (_tagPressedBlock) {
_tagPressedBlock(sender, self.query); // I'm assuming that the query is your iVar
}
}
このようにプロパティを割り当てます
tagsScrollView.tagPressedBlock = ^(id sender, NSString *query) {
// do stuff with those parameters
}
それは「より良くする」ためです。
タグが押されたイベントをMainVC
クラスに渡す方法については、NSNotificationCenter を使用する必要があります。
たとえば、Defines.h ファイルを作成し、Prefix.pch ファイルに #include することをお勧めします。
とにかく、通知名を定義します。
static NSString *const TagPressedNotification = @"TagPressedNotification";
次に、 が実行されたときにその通知を発行し-tagPressed:
、貴重な情報を userInfo ディクショナリにカプセル化します。
- (void)tagPressed:(id)sender {
[[NSNotificationCenter defaultCenter] postNotificationName:TagPressedNotification object:nil userInfo:@{@"sender" : sender, @"query" : self.query, @"scrollView" : self.tagScrollView}];
//.. code
}
次に、あなたMainVC
をオブザーバーとしてその通知に追加します。
MainVC.m
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(tagPressed:)
name:TagPressedNotification
object:nil];
}
そして-tagPressed:
、MainVC にメソッドを実装します
- (void)tagPressed:(NSNotification *)notification {
id sender = notification.userInfo[@"sender"];
NSString *query = notification.userInfo[@"query"];
TagScrollView *scrollView = notification.userInfo[@"scrollView"];
if (scrollView == myScrollView) { // the one on your mainVC
// do stuff
}
}
NotificationCenter のレジスターから自分自身を消去することを忘れないでください:
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
簡単
編集
メインVCにはスクロールビューも含まれているため、送信者であるスクロールビューも渡す必要があると思います。コードを編集しました
別の編集
Defines.h ファイルに列挙定義を作成します。
enum {
TagSenderTypeFeed = 1,
TagSenderTypeImageDetail
};
typedef NSInteger TagSenderType;
通知を作成するときに、適切な列挙値を通知の userInfo 辞書に追加します@"senderType" : @(TagSenderTypeFeed)