我正在使用带有一些可选方法的协议
#import <UIKit/UIKit.h>
@class TextViewTableViewCell;
@protocol TextViewTableViewCellDelegate
@optional
- (void)textViewDidChange:(UITextView *)textView forIndexPath:(NSIndexPath *)indexPath;
- (void)textViewTableViewCellDoneTyping:(UITextView *)textView forIndexPath:(NSIndexPath *)indexPath;
- (BOOL)shouldChangeEditTextCellText:(TextViewTableViewCell *)cell newText:(NSString *)newText;
@end
@interface TextViewTableViewCell : UITableViewCell <UITextViewDelegate>
但是,如果我使用了我实现此协议的类中的任何功能,它就会崩溃
我不知道为什么会这样。根据我的选择方法并非强制使用。
当调用委托函数并调用协议方法
时,它会对此方法造成崩溃- (void)textViewDidChange:(UITextView *)textView
{
[self.delegate textViewDidChange:self.textView forIndexPath:self.indexPath];
}
答案 0 :(得分:4)
@optional注释要求编译器避免生成构建警告,如果符合协议的类尚未添加实现。但是,这并不意味着您可以执行可选方法而不会发生崩溃。
使用respondsToSelector:
确认对象是否可以响应选择器。
if ([self.delegate respondsToSelector:@selector(textViewDidChange:forIndexPath:)])
但是,在Swift中,事情变得更简单了。您可以使用 ”?”在方法调用之前:
delegate?.textViewDidChange?(textView: self.textView, forIndexPath: self.indexPath)
答案 1 :(得分:-1)
- (void)textViewDidChange:(UITextView *)textView
{
if ([self.delegate respondsToSelector:@selector(textViewDidChange:)]) {
[self.delegate textViewDidChange:self.textView forIndexPath:self.indexPath];
}
}