两个页面间的传参

本文介绍了iOS开发中两种常见的页面间传参方法:通过属性或方法及通过协议。详细解释了如何利用对象属性传递参数,并给出了具体示例代码。同时,文章还列举了一些注意事项,帮助开发者避免常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在两个页面间传参有两种方法:

1,通过属性或方法来传参。

2,通过协议。

对于1,关键是找准对象,在碰面的时候(个人感觉通常是在发生事件时,比如按下按钮页面跳转时,在响应按钮的方法中第一个页面的对象会和第二个页面的对象碰面),此时就要抓住机会留下线索。

- (void)didClicked
{
    FirstViewController *firstViewCtrl = [[FirstViewController alloc]init];
    firstViewCtrl.v =self; //碰面的时候留下线索。
    [self.navigationController pushViewController:firstViewCtrl animated:YES];
    NSLog(@"age = %d",_age);
    NSLog(@"value = %d",self.f.value);
}

注意事项:

1,@property (nonatomic, strong) FirstViewController *f;

类的属性只是代表它有那个能力,但还没有创建相应的对象。如果f没有被赋给一个FirstViewController的对象,

就使用的话(eg:self.f.value=2)是没有意义的,因为此时self.f是一个空对象nil。

2,找准对象,要小心不能找到它的一个双胞胎。常见的是重新创建一个名字一样的新的对象,而这个新创建的对象它的属性值刚开始的时候都是0或nil,从而导致传参失败。

3,指针,是单向的,是“->”,而不是双向的:“<->”。

4,方法是双向的,可以接受传过来的值,又可以return一个值。

### Qt页面传参方法详解 在Qt中,页面参数递可以通过多种方式实现。以下是几种常见的方法及其具体实现: #### 方法一:通过构造函数参数 此方法适用于目标页面对象在其创建时即已知所需数据的情况。 ```cpp // 发送页面部分代码 #include "targetpage.h" void SenderPage::on_button_clicked() { int paramValue = 42; // 需要递的参数 TargetPage *targetPage = new TargetPage(paramValue); // 将参数递给TargetPage实例 targetPage->show(); } ``` 接收页面需调整其构造函数以接受外部参数: ```cpp // 接收页面部分代码 class TargetPage : public QWidget { public: explicit TargetPage(int value, QWidget *parent = nullptr); }; TargetPage::TargetPage(int value, QWidget *parent) : QWidget(parent), m_value(value) { // 初始化成员变量m_value } int main(int argc, char *argv[]) { QApplication app(argc, argv); SenderPage sender; sender.show(); return app.exec(); }[^1] ``` --- #### 方法二:利用信号与槽机制 这是Qt中最常用的跨组件通信方式之一。发送方发出信号,接收方连接该信号并处理接收到的数据。 ```cpp // 发送页面部分代码 signals: void sendDataToNextPage(const QString &data); private slots: void on_sendButton_clicked() { emit sendDataToNextPage("Hello from Page1"); // 触发信号 } ``` 接收页面则需要定义一个槽来捕获这些数据: ```cpp // 接收页面部分代码 public slots: void receiveDataFromPreviousPage(const QString &data) { qDebug() << "Received data:" << data; // 处理接收到的数据 } // 主程序或中控制器负责连接两者 QObject::connect(senderPageInstance, &SenderPage::sendDataToNextPage, receiverPageInstance, &ReceiverPage::receiveDataFromPreviousPage); ```[^4] --- #### 方法三:全局共享数据模型 当多个页面可能都需要访问某些公共状态时,可以考虑使用单例模式或者专门设计的数据容器类作为桥梁。 例如,创建一个`DataManager`类用于存储和分发信息: ```cpp // DataManager头文件声明 class DataManager : public QObject { Q_OBJECT public: static DataManager* getInstance(); // 单例获取入口 void setData(const QVariantMap &map); QVariantMap getData() const; private: DataManager(QObject *parent = nullptr); }; ``` 随后,在任何地方都可以调用它来进行存取操作而无需显式递引用。 ```cpp // 设置数据 DataManager::getInstance()->setData({{"key", "value"}}); // 获取数据 QString keyValue = DataManager::getInstance()->getData().value("key").toString(); qDebug() << keyValue; // 输出"value" ```[^3] --- #### 方法四:借助插件架构完成复杂场景下的交互 对于大型应用而言,采用插件化开发能够更好地解耦各个模块的功能逻辑。此时可通过自定义接口规范以及事件总线等方式促进不同部件之间高效协作。 比如下面展示了一个简单的例子说明如何加载特定类型的插件并将初始化配置告知对方。 ```cpp Q_PLUGIN_METADATA(IID "org.qt-project.Qt.ExamplePluginInterface/1.0") class ExamplePlugin : public QObject, PluginInterface { Q_INTERFACES(PluginInterface) public: bool initialize(const QStringList &arguments) override { foreach (const QString &arg, arguments) { processArgument(arg); } return true; } }; ``` 以上四种方案各有优劣,请依据实际需求选取最适合的一种实施策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值