Примечание: ниже используется iOS с включенным автоматическим подсчетом ссылок (ARC). Я думаю, что ARC может иметь прямое отношение к тому, почему он не работает, поскольку он настроен в соответствии с примерами, которые я нашел через Google.
Я пытаюсь создать протокол для уведомления делегата о имени файла пользователя выбирает из UITableView.
FileListViewController.h
@protocol FileListDelegate <NSObject>
- (void)didSelectFileName:(NSString *)fileName;
@end
@interface FileListViewController : UITableViewController
{
@private
NSArray *fileList;
id <FileListDelegate> delegate;
}
@property (nonatomic, retain) NSArray *fileList;
@property (nonatomic, assign) id <FileListDelegate> delegate;
@end
FileListViewController.m
#import "FileListViewController.h"
@implementation FileListViewController
@synthesize fileList;
@synthesize delegate;
Это дает ошибку в строке
@synthesize delegate;
, которая представляет собой «FileListViewController.m: error: Проблема автоматического подсчета ссылок: существующий ivar 'делегат' для Свойство unsafe_unreolated 'delegate' должно быть __unsafe_unrehibited "
Если я изменю FileListViewController.h, поставив __weak и (weak), то он будет запущен.
@protocol FileListDelegate <NSObject>
- (void)didSelectFileName:(NSString *)fileName;
@end
@interface FileListViewController : UITableViewController
{
@private
NSArray *fileList;
__weak id <FileListDelegate> delegate;
}
@property (nonatomic, retain) NSArray *fileList;
@property (weak) id <FileListDelegate> delegate;
@end
Но когда я пытаюсь установить делегат, приложение вылетает. Представление под названием «ImportViewController» создает представление из «FileListViewController» и устанавливает делегата для себя (ImportViewController), чтобы я мог реализовать свой собственный протокол «didSelectFileName». Я получаю следующее сообщение об ошибке:
* Завершение работы приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: '- [ImportViewController setDelegate:]: неопознанный селектор отправлен на экземпляр 0x6c7d430'
Я выполняю код;
ImportViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
FileListViewController *fileListViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"filelist"];
[fileListViewController setDelegate:self];
[self.navigationController pushViewController:fileListViewController animated:YES];
}
У меня следующие вопросы: