Xcode: Почему этот код не вызывает действие в другом классе?

#xcode #class #action

#xcode — код #класс #Экшен #xcode

Вопрос:

У меня есть два контроллера просмотра. В одном из них у меня есть a UITextField внутри a UITableViewCell . Что я хочу, так это вызвать действие в другом контроллере представления при UITextField редактировании. В - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

Я использую этот код для вызова действия:

 [TextFieldText addTarget:Viewcontroller1 action:@selector(ApplyAllObjectsSettings:) forControlEvents:UIControlEventEditingChanged];
  

Действие уже Viewcontroller1 началось, и выглядит оно примерно так:

 - (void)ApplyAllObjectsSettings {
    NSLog(@"Test");
    // Test
}
  

Я вставил действие в файл .h.

Самое странное, что я использовал почти тот же код ранее, и он работал нормально. Я думаю, единственное отличие заключается в том, что контроллер представления UITextfield , в котором он находится, отображается с Viewcontroller1 помощью presentmodalviewcontroller . и там, где был представлен код, который работал, это было с помощью addsubview . Не знаю, может ли это что-нибудь сказать.

Заранее спасибо 🙂

Комментарии:

1. Мое первоначальное предположение заключается в том, что либо TextFieldText и / или Viewcontroller1 равны нулю в момент выполнения addTarget вызова; Я бы сначала перепроверил их.

Ответ №1:

Ваш селектор неверен. С завершающим двоеточием в @selector(ApplyAllObjectsSettings:) нужном вам методе не будет вызываться, потому что он не принимает аргументов. @selector(ApplyAllObjectsSettings:) сильно отличается от @selector(ApplyAllObjectsSettings) . Либо измените свой ApplyAllObjectsSettings метод на this: - (void)ApplyAllObjectsSettings:(id)sender , либо ваш селектор на this: @selector(ApplyAllObjectsSettings) .

Итак, либо сделайте это:

 [TextFieldText addTarget:Viewcontroller1 action:@selector(ApplyAllObjectsSettings:) forControlEvents:UIControlEventEditingChanged];
// ...
- (void)ApplyAllObjectsSettings:(id)sender {
    NSLog(@"Test");
    // Test
}
  

Или это:

 [TextFieldText addTarget:Viewcontroller1 action:@selector(ApplyAllObjectsSettings) forControlEvents:UIControlEventEditingChanged];
// ...
- (void)ApplyAllObjectsSettings {
    NSLog(@"Test");
    // Test
}
  

Из-за заглавных букв синтаксиса кажется, что ваша цель — это имя класса. addTarget: Параметр должен быть экземпляром объекта, а не именем класса.

 Viewcontroller1 *vc1 = [[Viewcontroller1 alloc] initWithBlahBlah...];
[TextFieldText addTarget:vc1 action:@selector(ApplyAllObjectsSettings:) forControlEvents:UIControlEventEditingChanged];