Контейнер Представления Контейнера - отправка данных от дочернего к родительскому не удалась

Я создаю свой Custom Controller View Container в соответствии с руководством Apple, что означает, что я не использую segue. Для отправки данных из моего ChildVC в ParentVC я использую следующую схему.

В ChildVC.h

typedef void (^ActionBlock)(NSUInteger);

@property (nonatomic, copy) ActionBlock passIndexToParent;

Тогда в ParentVC.m viewDidLoad

childVC.passIndexToParent=^(NSUInteger imageIndex){
//do some cool stuff
}

ChildVC содержит TableView, а кнопка (и), которую нужно щелкнуть, находится в ячейке таблицы, поэтому я использую следующую технику, чтобы получить индекс строки, по которой щелкнули

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //…

     //target action
    [cell.myImageButton addTarget:self action:@selector(getIndexOfTapped:) forControlEvents:UIControlEventTouchUpInside];
    //…
    return cell;
}


- (void) getIndexOfTapped:(id)sender
{
    NSLog(@“X image tap confirmed");
    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
    if (indexPath != nil)
    {

        NSLog(@"INDEX of X image tapped is %ld",(long)indexPath.row);
        self.passIndexToParent(indexPath.row);//Thread 1: EXC_BAD_ACCESS(code=1, address=0X10)
    }
}

Теперь, когда я запускаю программу, я получаю

Thread 1: EXC_BAD_ACCESS(code=1, address=0X10)

для линии

self.passIndexToParent(indexPath.row);

Больше никаких данных об ошибках. Любая помощь в решении этой проблемы?

1 ответ

Решение

Я очень рекомендую не использовать этот шаблон. Прежде всего потому, что создать цикл сохранения слишком просто. Если блок, который вы передаете дочернему элементу, содержит строгую ссылку на родителя, вы не сможете разорвать цикл сохранения, если вы вручную не обнулите блок дочернего элемента при увольнении родителя.

Вместо этого вы должны создать протокол делегата для ребенка. Это будет выглядеть примерно так:

//ChildVC.h

@class ChildVC

@protocol ChildVCDelegate <NSObject>

-(void)childVC:(ChildVC *)childVC didSelectIndex:(NSUInteger)index;

@end

@interface ChildVC

...

@property (nonatomic, weak) id<ChildVCDelegate> delegate;

...

@end

//ChildVC.m

if (indexPath != nil)
{
    if ([self.delegate respondsToSelector:@selector(childVC:didSelectIndex:)]) {
        [self.delegate childVC:self didSelectIndex:indexPath];
    }
}

Затем определите индекс -(void)childVC:(ChildVC *)childVC didSelectIndex:(NSUInteger); метод в родительском и убедитесь, что родительский в качестве делегата дочернего.

Смотрите также: Вопрос № 1 о частых вопросах iOS

Но, вздыхая, чтобы ответить на ваш вопрос, вы иногда вызываете блок, если вы его не установили. Вам нужно проверить ноль, прежде чем вызывать блоки.

Другие вопросы по тегам