注:自動参照カウント(ARC)が有効なiOSを使用しています。私はARCがなぜこれが働いていないのと関係があるかもしれないと思うのですが、これはGoogleによって見つかった例に基づいて設定されています。iOS上でカスタム@プロトコルが動作しない
ユーザーが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;
これは「FileListViewController.mある
@synthesize delegate;
行でエラー与える:エラー:自動参照カウントを問題:unsafe_unretainedプロパティ 'delegate'の既存のivar 'delegate'は、 __unsafe_unretained "
私が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];
}
私の質問は以下のとおりです。
- はなぜ入れない(弱い)とで__weakそれを動作させますか?私はそれがなぜグーグルで見つかったので、 がなぜ機能するのか理解していないし、 の説明がなかった。
- '[fileListViewController setDelegate:self];を使用して代理人を設定できないのはなぜですか? ? コンパイラは 'デリゲート'が存在しないようです。
FileListViewController *fileListViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"filelist"];
あなたが
FileListViewController
オブジェクトを取得できませんでした:
これを解決しましたか? –