No know instance method for selector 'respondsToSelector:'

本文讨论了在Objective-C中使用代理模式时遇到的respondsToSelector:方法未实现错误,通过将代理类型从id更改为NSObject*,以及在运行时检查代理是否实现了所需方法来解决该问题。

错误提示:

No know instance method for selector'respondsToSelector:'

之前写代理的时候,都没有去调用respondsToSelector:去检查我们的代理者有没有实现对应的方法。最近感觉不管是出于代码规范还是程序的安全性,都应该加上这个检查。于是就出现了这样的错误。

于是查了一下respondsToSelector:究竟是谁的方法。这里写图片描述

好吧,由于我定义delegate的时候,是这样写的

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

所以,id类型的delegate无法使用NSObject的respondsToSelector:方法了。

于是,我默默的去把id换成NSObject*试试能不能解决这个问题

@property (nonatomic, weak) NSObject <CYSSecondTableViewControllerDelegate>* delegate;

这里写图片描述
不报错了,成功!

接下来,我又在万能的度娘找到了其他解决方式

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

在还是上面这样写的情况下,让delegate强转一下类型为NSObject

if ([(NSObject *)_delegate respondsToSelector:@selector(tableViewController:updateAnswerWithTitleIndex:answer:)]) {
    };

也是可以的。

另外,让协议继承NSObject,也可以避免Xcode的报错

@protocol CYSSecondTableViewControllerDelegate<NSObject>


/**-----------------*/
if ([_delegate respondsToSelector:@selector(tableViewController:updateAnswerWithTitleIndex:answer:)]) { 
    };
当遇到 `no such element: Unable to locate element: {"method":"css selector","selector":"input"}` 错误时,意味着使用 CSS 选择器 `input` 未能在页面中找到匹配的元素。以下是一些可能的解决方法: ### 1. 等待页面加载完成 页面可能还未完全加载,导致元素还未渲染出来。可以使用显式等待来确保元素加载完成后再进行查找。 ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get('https://example.com') try: # 等待最多 10 秒,直到 input 元素可见 input_element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.CSS_SELECTOR, 'input')) ) # 找到元素后可以进行后续操作 input_element.send_keys('example text') except Exception as e: print(f"Error: {e}") finally: driver.quit() ``` ### 2. 检查选择器是否正确 确保 CSS 选择器 `input` 是正确的。可能需要更具体的选择器,例如根据元素的 `id`、`class` 或其他属性来定位。 ```python # 根据 id 定位 input_element = driver.find_element_by_css_selector('input#specific-id') # 根据 class 定位 input_element = driver.find_element_by_css_selector('input.specific-class') ``` ### 3. 检查元素是否在 iframe 中 如果元素位于 iframe 中,需要先切换到该 iframe 中,再进行元素查找。 ```python # 切换到 iframe iframe = driver.find_element_by_css_selector('iframe') driver.switch_to.frame(iframe) # 在 iframe 中查找 input 元素 input_element = driver.find_element_by_css_selector('input') # 切换回主页面 driver.switch_to.default_content() ``` ### 4. 检查页面是否有动态加载内容 有些页面可能会使用 JavaScript 动态加载内容,需要确保在动态内容加载完成后再进行元素查找。可以通过等待特定的 JavaScript 事件或检查元素是否存在来实现。 ```python import time # 等待一段时间,让动态内容加载 time.sleep(5) # 查找 input 元素 input_element = driver.find_element_by_css_selector('input') ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值