支付宝

本文介绍了一种iOS应用的架构方式,包括根视图控制器的创建、使用导航控制器组织多个界面控制器、通过分段控制器切换不同界面,以及如何通过按钮触发页面跳转并传递参数。
构架: App开发笔记-支付宝 如上图所示,1,创建Class文件夹
2.AppDelegate、Models、ViewController、
3,AppDelegate:AppDelegate.h、AppDelegate.m
4.ViewController:RootViewController、OtherViewControllers


下面就这个程序写几点心得:
1.创建根视图控制器
2.因为有四个主界面,所以声明四个导航控制器用来包含四个界面控制器

@interface JYFRootViewController ()

{

    // 建立四个导航控制器

    UINavigationController *_alipayNC;  // 支付宝

    UINavigationController *_serviceNC;   // 服务

    UINavigationController *_discoverNC;    // 探索

    UINavigationController *_wealthNC;  // 财富

}


@end

3.分别创建四个子视图控制器,并用导航控制器一 一包括,然后把导航控制器作为子视图控制器一 一添加到根视图控制器上

// 初始化子视图控制器

    

    JYFAlipayViewController *alipayVC = [JYFAlipayViewController new];

    _alipayNC = [[UINavigationController alloc] initWithRootViewController:alipayVC];

    [alipayVC release];

    [self addChildViewController:_alipayNC];

    

    JYFDiscoverTableViewController *discoverVC = [[JYFDiscoverTableViewController alloc]initWithStyle:UITableViewStyleGrouped];

    _discoverNC = [[UINavigationController alloc] initWithRootViewController:discoverVC];

    [discoverVC release];

    [self addChildViewController:_discoverNC];

    

    JYFServiceTableViewController *serviceVC = [[JYFServiceTableViewController alloc] initWithStyle:UITableViewStyleGrouped];

    _serviceNC = [[UINavigationController alloc] initWithRootViewController:serviceVC];

    [serviceVC release];

    [self addChildViewController:_serviceNC];

    

    JYFWealthTableViewController *wealthVC = [[JYFWealthTableViewController alloc] initWithStyle:UITableViewStyleGrouped];

    _wealthNC = [[UINavigationController alloc] initWithRootViewController:wealthVC];

    [wealthVC release];

    [self addChildViewController:_wealthNC];

4.设置根视图控制器的View上将要显示的导航控制器的View,即默认View

 // 进行默认view的显示

    [self.view addSubview:_alipayNC.view];

5.添加分段控制器用来分别控制四个导航控制器

 NSArray *itemArray = @[[UIImage imageNamed:@"model0.png"],

                           [UIImage imageNamed:@"model1.png"],

                           [UIImage imageNamed:@"model2.png"],

                           [UIImage imageNamed:@"model3.png"]];

    UISegmentedControl *segmentedControl = [[UISegmentedControl allocinitWithItems:itemArray];

    segmentedControl.backgroundColor = [UIColor clearColor];

    segmentedControl.frame = CGRectMake(0CGRectGetHeight(self.view.frame) - 49self.view.frame.size.width49);

    [segmentedControl addTarget:selfaction:@selector(segmentedControlAction:)forControlEvents:UIControlEventValueChanged];

    segmentedControl.tag = 123;

    [self.view addSubview:segmentedControl];

 

    [segmentedControl release];

}


#pragma mark - 实现方法

- (void)segmentedControlAction:(UISegmentedControl *)sender

{

    // 切换需要显示的控制器

    // 移除当前显示的视图

    for (UIView *view in self.view.subviews) {

        if (![view isKindOfClass:[UISegmentedControl class]]) {

            [view removeFromSuperview];

        }

    }

    // 判断, 添加view

    switch (sender.selectedSegmentIndex) {

        case 0: { // 显示_alipayVC.view

            [self.view insertSubview:_alipayNC.view atIndex:0];

            break;

        }

        case 1: { // 显示_serviceVC.view

            [self.view insertSubview:_serviceNC.view atIndex:0];

            break;

        }

        case 2: { // 显示_discoverVC.view

            [self.view insertSubview:_discoverNC.view atIndex:0];

            break;

        }

        case 3: { // 显示_wealthVC.view

            [self.view insertSubview:_wealthNC.view atIndex:0];

            break;

        }

            

        default:

            break;

    }

}

6.因为要通过按钮来进行页面跳转,跳转后的页面上可能不需要UISegmentedControl,所以要在根视图控制器中设置隐藏和显示分段控制器的方法
首先在.h文件中声明方法

#import 


@interface JYFRootViewController : UIViewController


#pragma mark - 声明方法

- (void)hiddenSegmentedControl;

- (void)showSegmentedControl;


@end


然后在.m文件中实现方法

#pragma mark - 隐藏分段控制器的方法的实现

- (void)hiddenSegmentedControl

{

    [self.view viewWithTag:123].hidden = YES;

}

#pragma mark - 显示分段控制器的方法的实现

- (void)showSegmentedControl

{

    [self.view viewWithTag:123].hidden = NO;

}

7.主界面上的按钮过多,要通过点击按钮来进行页面跳转,如何才能不用if或者swich语句来进行判断进而进行跳转以及传值操作?
循环添加所有按钮,每个按钮都是一张图片,我们先把所有按钮的点击之后将要跳转的控制器的名称用一个数组进行封装
首先自定义添加按钮的方法

#pragma mark - 创建Button

- (UIButton *)createButtonWithFrame:(CGRect)frame

                    backgroundImage:(UIImage *)bgImage

                              title:(NSString *)title

                                tag:(NSInteger)tag

                           selector:(SEL)sel

{

    UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];

    button.frame = frame;

    [button setBackgroundImage:bgImage forState:UIControlStateNormal];

    [button setTitle:title forState:UIControlStateDisabled];

    button.tag = tag;

    button.showsTouchWhenHighlighte= YES;

    [button addTarget:self action:selforControlEvents:UIControlEventTouchUpInside];

    return button;

}


 // 控制器名称对应按钮的表示用一个数组来保存

    NSArray *buttonVCNameArray = @[

                                   @"BFASSaoYiSaoViewController"//  扫一扫

                                   @""// 付款码

                                   @""// 余额宝

                                   @""// 转账

                                   @""// 信用卡还款

                                   @""// 当面付

                                   @""// 手机充值

                                   @""// 淘宝

                                   @""// 手机宝令

                                   @""// 我的快递

                                   @""// AA收款

                                   @""// 记账本

                                   @""// 收款

                                      // 注意这里是控制器的名称

                                   @"JYFMoreViewController"  // 更多

                                   ];

循环添加按钮的方法

// 循环添加12个Button

    CGFloat x = 0, y = 100, width = 80, height = 95;

    for (int i = 0; i < 12; i++) {

        

        CGRect frame = CGRectMake(x, y, width, height);

        // 创建Button

        UIButton *button = [self createButtonWithFrame:frame

                                       backgroundImage:[UIImage                           imageNamed:@"yuebao_btn_bg.png"];


                                    // 注意这里的title是通过数组来添加的

                                                 title:buttonVCNameArray[i + 2]

                                                   tag:kBaseTag + 3 + i

                                              selector:@selector(buttonAction:)];

        [scrollView addSubview:button];

        

        // 修改下次循环的位置

        x += 80;

        if (x >= 320) {

            x = 0;

            y += height;

        }

    }

}

因为这些按钮本视图上的,所以要在本视图上进行点击,然后才能向控制器传递信息,所以要在本视图上创建协议,以实现代理传值
1.声明协议及方法

#import


@class JYFALipayView;

@protocol JYFAlipayViewDelegate <<span style="color: #703daa">NSObject>

// 传值的方法

- (void)alipayView:(JYFALipayView *)view

  didSelectAtIndex:(NSInteger)index withTitle:(NSString *)title;


@end

2.声明代理属性

@interface JYFALipayView : UIView

@property (nonatomic, assign) id<</span>JYFAlipayViewDelegate> delegate;


@end

3.去点击事件中通过代理去调用协议中声明的方法从而获取按钮信息

#pragma mark - 点击事件

- (void)buttonAction:(UIButton *)sender

{

    // 给代理发送协议

    // 1.先判断

    if (_delegate != nil && [_delegaterespondsToSelector:@selector(alipayView:didSelectAtIndex:withTitle:)]) {

        [_delegate alipayView:self didSelectAtIndex:sender.tag - kBaseTagwithTitle:[sender titleForState:UIControlStateDisabled]];

    }

}

4.来到控制器遵守视图中声明的协议以及方法

@interface JYFAlipayViewController ()<</span>JYFAlipayViewDelegate>

5.设置背视图控制器作为视图的代理以接收视图穿过来的按钮的信息以便处理跳转事件

  // 设置代理

    _alipayView.delegate = self;

6.实现协议中的方法

#pragma mark - 实现协议方法

- (void)alipayView:(JYFALipayView *)view didSelectAtIndex:(NSInteger)index withTitle:(NSString *)title

{

    NSLog(@"%@", title);

    // 隐藏分段控制器

    JYFRootViewController *rootVC =(JYFRootViewController *)self.parentViewController.parentViewController;

    // 调用方法进行隐藏

    [rootVC hiddenSegmentedControl];


   // 根据控制器名称创建出来对象

    Class c = NSClassFromString(title);

    // 根据c创建视图控制器

    UIViewController *vc = [[c allocinit];

    // 跳转视图控制器

    [self.navigationController pushViewController:vc animated:YES];

    [vc release];

}

7.上面在跳转下一个视图控制器之后把分段控制器按钮给隐藏了,所以要在视图将要跳转回来(即视图即将显示)的时候将隐藏的分段控制器控件给显示出来

#pragma mark 视图将要显示的时候显示分段控制器

- (void)viewWillAppear:(BOOL)animated

{

    // 创建将要显示视图的视图控制器对象

    JYFRootViewController *rootVC =(JYFRootViewController *)self.parentViewController.parentViewController;

    // 调用JYFRootViewController已经写好的显示分段控制器的方法对其视图上的分段控制器重新显示出来

    [rootVC showSegmentedControl];

 

}

源码来自:https://pan.quark.cn/s/a4b39357ea24 《C++ Primer》作为C++编程领域中的一部权威著作,主要服务于初学者和经验丰富的开发者,致力于帮助他们深入掌握C++的核心知识。 第一章通常会详细讲解C++语言的基础概念和语法结构,包括变量的使用、数据类型的分类、常量的定义、运算符的应用以及基础的输入输出操作。 接下来,我们将对这一章中的核心知识点和可能的习题解答进行深入分析。 ### 1. 变量与数据类型在C++编程中,变量被视为存储数据的媒介。 每一个变量都必须预先声明其数据类型,常见的数据类型有整型(int)、浮点型(float)、双精度浮点型(double)以及字符型(char)。 例如:```cppint age = 25; // 声明一个整型变量age并赋予其初始值25float weight = 70.5f; // 声明一个浮点型变量weight并赋予其初始值70.5char grade = A; // 声明一个字符型变量grade并赋予其初始值A```### 2. 常量与字面量常量指的是不可更改的值,可以通过`const`关键字进行声明。 例如:```cppconst int MAX_SIZE = 100; // 声明一个整型常量MAX_SIZE,其值为100```字面量是指程序中直接书写的值,如`42`、`3.14`或`"Hello"`。 ### 3. 运算符C++提供了多种运算符,涵盖了算术运算符(+,-,*,/,%)、比较运算符(==,!=,<,>,<=,>=)、逻辑运算符(&&,||,!)以及赋值运算符(=,+=,-=,*=,/=,%=)等。 ### 4. 输入与输出在C++中,使用`std::cin`来实现输...
内容概要:本文详细介绍了一个基于C++的仓库存储管理系统的设计与实现,涵盖了项目背景、目标、挑战及解决方案,并系统阐述了整体架构设计、数据库建模、功能模块划分、权限安全、并发控制、数据一致性保障、异常处理与可扩展性等关键内容。通过面向对象编程思想,采用分层架构与模块化解耦设计,结合STL容器、多线程、锁机制等C++核心技术,实现了高效的库存管理功能,包括入库、出库、盘点、调拨、权限控制、日志追踪与智能报表分析。文中还提供了核心类如Inventory(库存)、User(用户权限)、LogEntry(操作日志)及WarehouseManager(主控制器)的代码示例,展示了数据结构设计与关键算法逻辑。; 适合人群:具备C++编程基础,熟悉面向对象设计与基本数据结构的软件开发人员,尤其适合从事企业级管理系统开发或希望深入理解系统架构设计的中级开发者(工作1-3年);也适用于计算机相关专业学生进行课程设计或毕业项目参考; 使用场景及目标:①学习如何使用C++构建复杂业务系统的整体架构与模块划分方法;②掌握高并发、数据一致性、权限控制、异常处理等企业级系统关键技术的实现思路;③理解仓储管理业务流程及其在软件系统中的建模与落地方式;④为开发类似ERP、MES等后台管理系统提供技术原型与设计参考; 阅读建议:此资源不仅提供理论架构与代码片段,更强调系统设计的完整性与工程实践性。建议读者结合代码示例动手实现核心模块,深入理解类之间的关系与交互逻辑,重点关注多线程安全、事务管理与权限校验等难点环节,并尝试扩展功能如对接GUI界面或数据库持久化模块,以全面提升系统开发能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值