隐藏UISearchBar中的clearButton

随着iOS13的发布,老APP中的一些代码无法正常运行,遇到一个正常模式下的UISearchBart,隐藏clearButton的方法无法运行,方法如下:

   //SearchBar only have one subview (UIView)
        UIView *subview = [[self.searchBar subviews] firstObject];
        //There are three sub subviews (UISearchBarBackground, UINavigationButton, UISearchBarTextField)
        for (UIView *subsubview in subview.subviews) {
            //The UISearchBarTextField class is a UITextField. We can't use UISearchBarTextField directly here.
            if ([subsubview isKindOfClass: [UITextField class]]) {
                    [(UITextField *)subsubview setClearButtonMode:UITextFieldViewModeNever];
            }
        }

改为如下代码后,iOS13运行正常,但是iOS13之前的环境又奔溃:

self.searchBar.searchTextField.clearButtonMode = UITextFieldViewModeNever;

只好加上对系统版本的判断,先这样,有好的方法再改吧:

//iOS13以后无法用原有方法隐藏searchBar的clearButton
    if ([[[UIDevice currentDevice] systemVersion] floatValue]<13.0){
        //SearchBar only have one subview (UIView)
        UIView *subview = [[self.searchBar subviews] firstObject];
        //There are three sub subviews (UISearchBarBackground, UINavigationButton, UISearchBarTextField)
        for (UIView *subsubview in subview.subviews) {
            //The UISearchBarTextField class is a UITextField. We can't use UISearchBarTextField directly here.
            if ([subsubview isKindOfClass: [UITextField class]]) {
                    [(UITextField *)subsubview setClearButtonMode:UITextFieldViewModeNever];
            }
        }
    }
    else{
        self.searchBar.searchTextField.clearButtonMode = UITextFieldViewModeNever;
    }

 

以下是一个简单的计算器设计示例,使用Qt的QPushButton和QLineEdit来实现: ```c++ #include <QtWidgets> class Calculator : public QWidget { Q_OBJECT public: Calculator(QWidget *parent = nullptr); private slots: void digitClicked(); void operatorClicked(); void equalClicked(); void clearClicked(); private: QPushButton *createButton(const QString &text, const char *member); void calculate(); QLineEdit *m_display; QString m_pendingOperator; double m_sum; }; Calculator::Calculator(QWidget *parent) : QWidget(parent), m_display(new QLineEdit("0")), m_pendingOperator(""), m_sum(0.0) { QGridLayout *layout = new QGridLayout; layout->setSizeConstraint(QLayout::SetFixedSize); m_display->setAlignment(Qt::AlignRight); m_display->setReadOnly(true); layout->addWidget(m_display, 0, 0, 1, 4); const char *buttonNames[16] = { "7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+" }; for (int i = 0; i < 16; ++i) { QPushButton *button = createButton(buttonNames[i], SLOT(digitClicked())); layout->addWidget(button, i / 4 + 1, i % 4); } QPushButton *clearButton = createButton(tr("Clear"), SLOT(clearClicked())); layout->addWidget(clearButton, 5, 3); setLayout(layout); } QPushButton *Calculator::createButton(const QString &text, const char *member) { QPushButton *button = new QPushButton(text); connect(button, SIGNAL(clicked()), this, member); return button; } void Calculator::digitClicked() { QPushButton *button = qobject_cast<QPushButton *>(sender()); Q_ASSERT(button != nullptr); QString digit = button->text(); if (m_display->text() == "0" && digit != ".") { m_display->setText(digit); } else { m_display->setText(m_display->text() + digit); } } void Calculator::operatorClicked() { QPushButton *button = qobject_cast<QPushButton *>(sender()); Q_ASSERT(button != nullptr); calculate(); m_pendingOperator = button->text(); m_sum = m_display->text().toDouble(); m_display->setText("0"); } void Calculator::equalClicked() { calculate(); m_pendingOperator = ""; m_display->setText(QString::number(m_sum)); } void Calculator::clearClicked() { m_pendingOperator = ""; m_sum = 0.0; m_display->setText("0"); } void Calculator::calculate() { if (m_pendingOperator == "") { return; } double operand = m_display->text().toDouble(); if (m_pendingOperator == "+") { m_sum += operand; } else if (m_pendingOperator == "-") { m_sum -= operand; } else if (m_pendingOperator == "*") { m_sum *= operand; } else if (m_pendingOperator == "/") { m_sum /= operand; } } int main(int argc, char *argv[]) { QApplication app(argc, argv); Calculator calculator; calculator.show(); return app.exec(); } #include "main.moc" ``` 这里我们创建了一个Calculator类,继承自QWidget类。在Calculator类,我们创建了一个QLineEdit对象m_display来显示计算结果,并且定义了一些槽函数来响应按钮的点击事件。在构造函数,我们使用QGridLayout布局来设置计算器的界面布局,并使用for循环创建了所有的数字按钮和操作符按钮,并将它们添加到布局。这里我们使用了一个createButton()方法来统一创建按钮对象,并将按钮的clicked()信号连接到响应该按钮的槽函数。在digitClicked()槽函数,我们获取了按钮的文本,并根据当前显示的文本来更新m_display对象的文本。在operatorClicked()槽函数,我们先调用calculate()方法来进行上一次的计算,然后获取了当前操作符,并将当前显示的文本转换为double类型并保存到m_sum成员变量,最后将m_display对象的文本设置为0。在equalClicked()槽函数,我们先调用calculate()方法来进行上一次的计算,然后将m_pendingOperator成员变量清空,并将m_sum成员变量的值转换为字符串并设置为m_display对象的文本。在clearClicked()槽函数,我们将m_pendingOperator成员变量和m_sum成员变量的值清空,并将m_display对象的文本设置为0。calculate()方法,我们先判断当前是否有操作符需要进行计算,如果没有,则直接返回。然后获取当前显示的文本并转换为double类型,并根据当前操作符进行计算,并将结果保存到m_sum成员变量。最后我们在main()函数创建了Calculator对象并显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值