从零开始搭建iOS项目框架

Flutter - Mac m1和Windows10配置flutter环境 ,iOS原生项目接入flutter 参考资料: Flutter iOS 混合工程自动化 Flutter 与 iOS 混合项目初探 Flutter混合开发(二):iOS项目集成Flutter模块详细指南 Flutter 开发 (1)iOS 下超详细集成 Flutter  Flutter中文网 在macOS上搭建Flutter开发环境 1.下载flutter SDK https://flutter.cn/docs/deve........................... 阅读详情

APP项目搭建

上周个人刚搭建完的项目框架,在这分享一下,主要还是采用MVC设计模式,没有使用storyboard,纯代码搭的界面。

1.新建工程

1.1 新建项目

删除
* 删除无用的文件(Main.storyboard,ViewController)
* 删除plist文件中Main storyboard file base name一项
* appdelegate进行修改

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];


    [self.window makeKeyAndVisible];

}

1.2 创建不同的target管理工程

有时候我们需要多个版本,开发版、测试版或者线上版,或因渠道不同需要区分企业版,AppStore版等。这个时候使用target来管理就比较方便

1.2.1 生成

多target

1.2.2 修改名字

需要修改下名字target、scheme、info.plist三项的名字,主要用来区分下版本

注意:修改了info.plist名字需要修改新建的target的配置信息文件,让其能找到info.plist文件

1.2.3 修改下工程配置文件


就可以这样使用了:

#if DEVELOPMENT
    NSLog(@"development");
#else
    NSLog(@"release");
#endif
使用方法可参考:多个Target管理

1.3 导入CocoaPods管理依赖库

自从CocoaPods升级到1.0.1之后,为多个target导入依赖库,之前的link_with语法不能用了,使用如下方法:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, ‘7.0’

# ruby语法
# target数组 如果有新的target直接加入该数组
targetsArray = [‘MyApp’, ‘MyAppTest’]
# 循环
targetsArray.each do |t|
    target t do
        pod 'MJRefresh', '~> 3.1.12'
        pod 'Masonry', '~> 0.6.1'
        pod 'AFNetworking', '~> 3.1.0'
        pod 'MJExtension'
        pod 'MBProgressHUD'
        pod 'SDWebImage'



    end
end
使用方法可参考:CocoaPods安装教程

1.4 info.plist配置

1.4.1 开启http的访问权限

info.plist 中添加以下
http访问

1.4.2 添加应用白名单

iOS9之后分享等必须添加白名单后才可以打开相关应用。字段值为LSApplicationQueriesSchemes
应用白名单

1.4.3 其他

设置分享到微信、微博啊等URL Types

2.项目模块化

2.1 分类各模块

分类具体按照业务需求去归类,开发前把大体的分类号,主体的文件夹建立真实的文件夹,再把真实的文件夹拖到项目中,这样的好处是,避免了在项目中创建虚拟文件夹,然后导致各类文件都放在一块,不方便查找。
大致分类:

2.2 导入需要用的第三方库

先使用CocoaPods导入项目中一些常用的第三方库,后续再根据需求导入,有些无法用CocoaPods导入的或者是一些需要修改库中代码的拖入到工程中Vender文件夹中

2.3 创建pch文件

这个文件用来包含全局使用的头文件,例如:
1.第三方头文件
2.全局宏定义
3.自定义的头文件包含主题、网络请求地址、全局方法、key等

使用方法参考: Pch 文件的正确使用

3 全局的宏定义

具体方法大家可下载demo看下
宏定义

3.1 全局配置参数DefineMacro

全局宏定义包含一些屏幕宽高、iOS版本、手机类型等

#define SCREEN_WIDTH   [UIScreen mainScreen].bounds.size.width
#define SCREENH_HEIGHT [UIScreen mainScreen].bounds.size.height
//随机颜色
#define KRandomColor [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0]

3.2 样式定义DefineTheme

主要包含样式上的定义,主题颜色、各类字体大小颜色、控件大小等

//颜色
#define TITLE_COLOR [UIColor blackColor]//标题颜色
#define TEXT_COLOR [UIColor grayColor]//正文颜色
#define TIPTEXT_COLOR UIColorFromRGB(0x888888)//提示语文本颜色
#define MAIN_GROUNDCOLOR UIColorFromRGB(0xF98B1B)//主题景色
#define BACKGROUNDCOLOR UIColorFromRGB(0xF7F7F7)//背景颜色
//字体大小
#define TITLEFONT [UIFont systemFontOfSize:18]
#define TEXTFONT [UIFont systemFontOfSize:16]
#define TIPTEXTFONT [UIFont systemFontOfSize:12]

3.3 API地址DefineRequest

访问的地址,各个接口的查询

#if DEVELOPMENT //***************开发版本*************
//****************测试环境***********
//app服务重构测试
//#define BaseURLString   @"http://www-test.baidu.com/rest/post"//beta
//#define BaseURLString @"http://docker-branch02-web-tomcat.baidu.com:8080/rest/post"//分之域名
//****************开发环境(个人服务器)************
//后台XXX
#define BaseURLString  @"http://192.168.1.175:8080/baidu/rest/post"
#else          //**************生产版本**************
#define BaseURLString @"https://www.baidu.com/rest/post"
#endif

//****************接口说明************
//获取用户信息
#define Request_type_getUserInfo @"getUserInfo"
//首页广告
#define Request_type_queryBannerByType @"queryBannerByType"

4. 初期代码编写

公共类

4.1 Category

4.1.1 Method swizzling

为Controller添加一些方法,即可省略继承baseViewController的麻烦,还可以对各工厂类进行操作

#import "UIViewController+swizzling.h"
#import <objc/runtime.h>

@implementation UIViewController (swizzling)

+ (void)load {
    Method fromMethod = class_getInstanceMethod([self class], @selector(viewDidLoad));
    Method toMethod = class_getInstanceMethod([self class], @selector(swizzlingViewDidLoad));

    if (!class_addMethod([self class], @selector(swizzlingViewDidLoad), method_getImplementation(toMethod), method_getTypeEncoding(toMethod))) {
        method_exchangeImplementations(fromMethod, toMethod);
    }
}

// 我们自己实现的方法,也就是和self的viewDidLoad方法进行交换的方法。
- (void)swizzlingViewDidLoad {
    NSString *str = [NSString stringWithFormat:@"%@", self.class];
    if(![str containsString:@"UI"]){
        NSLog(@"统计打点 : %@", self.title);
    }
    [self swizzlingViewDidLoad];
}
@end
4.1.2 appDelegate添加category

用以简化appDelegate中代码

AppDelegate+ViewController.h
- (void)setAppWindows
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];

    [[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]}];

    [self.window makeKeyAndVisible];

}

- (void)setRootViewController
{
    AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    app.window.rootViewController = [[RootTabViewController alloc] init];

}
AppDelegate+AppService.h

需要处理的各类服务都可以添加在这

/**
 *  系统配置
 */
- (void)systemConfigration;

/**
 *  友盟注册
 */
- (void)registerUmeng;
/**
 *  个推注册
 */

- (void)registerGeiTui;

/**
 *  检查更新
 */
- (void)checkAppUpDataWithshowOption:(BOOL)showOption;

/**
 *  获取用户信息
 */
- (void)getUserData;

4.2 DataMange

  • 存放对文件的处理方法,文件的路径
  • 数据库的处理
  • NSUserDefault的处理

4.3 Other

建一个类存放比较杂乱的一些公共方法

/**验证该字符串是否是6-16位字母和数字组合*/
+ (BOOL)checkIsDigitalAndLetter:(NSString *)string;
/**利用正则表达式验证手机号码*/
+ (BOOL)checkTel:(NSString *)str;
/**利用正则表达式验证邮箱*/
+ (BOOL)checkEmail:(NSString *)email;

4.4 UITools

一些公共控件的封装,常用的一些控件进行封装(弹窗、广告轮播等),方便以后统一修改

4.4.1 NavigationViewController封装
@interface LWTNavigationViewController ()<UINavigationControllerDelegate>

@property (nonatomic, weak) id popDelegate;

@end

@implementation LWTNavigationViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.popDelegate = self.interactivePopGestureRecognizer.delegate;
    self.delegate = self;

    //navigationBar样式设置
    self.navigationBar.barTintColor = MAIN_GROUNDCOLOR;
    [self.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : WHITCOLOR, NSFontAttributeName : [UIFont boldSystemFontOfSize:18]}];
    [self.navigationBar setTintColor:WHITCOLOR];    // Do any additional setup after loading the view.
}

//解决手势失效问题
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (viewController == self.viewControllers[0]) {
        self.interactivePopGestureRecognizer.delegate = self.popDelegate;
    }else{
        self.interactivePopGestureRecognizer.delegate = nil;
    }
}

//push时隐藏tabbar
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (self.viewControllers.count > 0) {
        viewController.hidesBottomBarWhenPushed = YES;
    }
    [super pushViewController:viewController animated:animated];
}

//设置样式
- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

//设置返回按钮样式
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{

    UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(backBarButtonItemAction)];
    viewController.navigationItem.backBarButtonItem = backBarButtonItem;

}

- (void)backBarButtonItemAction
{
    [self popViewControllerAnimated:YES];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end
4.4.2 tabBarController封装
#import "RootTabViewController.h"
#import "LWTNavigationViewController.h"

# define kTabbarSelectTintColor [UIColor brownColor]
# define kTabbarNormalTintColor [UIColor blackColor]

@interface RootTabViewController ()<UITabBarControllerDelegate>

@end

@implementation RootTabViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self buildUI];
    // Do any additional setup after loading the view.
}

/**构建视图*/
- (void)buildUI{

    self.tabBar.translucent     = NO;
    self.tabBar.backgroundImage = [CommonMethods createImageWithColor:[UIColor clearColor]];
    self.tabBar.shadowImage     = [CommonMethods createImageWithColor:[UIColor grayColor]];

    NSArray * normalItems       = @[@"home_gray",@"circle_gray",@"me"];
    NSArray * selectItmes       = @[@"home_blue",@"circle_blue",@"me_blue"];

    NSArray * controllClass     = @[@"HomePageViewController",@"MessageViewController",@"MyViewController"];
    self.delegate               = self;
    NSArray * itemTitles        = @[@"首页",@"信息",@"我"];
    NSMutableArray * controllers = [[NSMutableArray alloc]init];
    for (int i = 0; i < normalItems.count; i++)
    {
        UIViewController * homeview =[[NSClassFromString(controllClass[i]) alloc]init];
        LWTNavigationViewController * navigation =[[LWTNavigationViewController alloc]initWithRootViewController:homeview];
        navigation.tabBarItem.image                     = [[UIImage imageNamed:normalItems[i]] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        navigation.tabBarItem.selectedImage             = [[UIImage imageNamed:selectItmes[i]] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
        navigation.tabBarItem.titlePositionAdjustment   = UIOffsetMake(0,-3);
        [controllers addObject:navigation];

        // 设置文字的样式
        NSMutableDictionary *textAttrs                  = [NSMutableDictionary dictionary];
        textAttrs[NSForegroundColorAttributeName]       = kTabbarNormalTintColor;
        NSMutableDictionary *selectTextAttrs            = [NSMutableDictionary dictionary];
        selectTextAttrs[NSForegroundColorAttributeName] = kTabbarSelectTintColor;
        [homeview.tabBarItem setTitleTextAttributes:textAttrs forState:UIControlStateNormal];
        [homeview.tabBarItem setTitleTextAttributes:selectTextAttrs forState:UIControlStateSelected];
        // 设置tabbaritem 的title
        navigation.tabBarItem.title                     = itemTitles[i];
    }
    self.viewControllers = controllers;
}
@end

4.5 第三方库的封装

4.5.1 网络框架
//基本参数设置
+ (AFHTTPSessionManager *)httpManager{
    //获取请求对象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    // 设置请求格式
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    // 设置返回格式
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    manager.requestSerializer.timeoutInterval = RequestTimeOut;
    return manager;
}

//请求处理
+ (void)postParameters:(id)parameters
               success:(void (^)(NSDictionary *resDict))success
               failure:(void (^)(NSError *error))failure
{

    //    if ([[AFNetworkReachabilityManager sharedManager] networkReachabilityStatus] <= 0) {
    //        [MBProgressHUD showMessageInWindow:@"网络无连接" afterDelayHide:AfterDelayHide];
    //        return;
    //    }
    AFHTTPSessionManager *manager = [self httpManager];
    //开始请求
    [manager POST:BaseURLString
       parameters:parameters
         progress:^(NSProgress * _Nonnull uploadProgress) {
         }
          success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
              NSMutableDictionary *resDict = (NSMutableDictionary *)[responseObject mj_JSONObject];
//              NSDictionary *dict = [HttpManager checkResultVaild:resDict withFunction:parameters[@"function"]];

             //这里可以处理数据 针对接口返回的特定参数进行处理,如单点登录等需求
              NSLog(@"\n接口:%@\n返回数据:%@",parameters[@"function"],[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);

              success(resDict);
          }
          failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
              failure(error);
              NSLog(@"\n当前接口:%@\n错误信息:%@",parameters[@"function"],error);
          }];
}
4.5.2 其他第三方

UM、HUD等很多第三方框架,都需要进行封装,针对自己app需求进行配置,使用起来就比较方便。

Demo

有什么建议可以提出来,有更好的欢迎探讨,不定期更新
demo下载

参考

文中的内容有参考过以下文章,大家可以参考下
多个Target管理
CocoaPods安装教程
Pch 文件的正确使用
iOS黑魔法-Method Swizzling
手把手教你iOS项目基本框架

uniapp入门超详细教程:如何从零开始搭建项目 uni-app是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。本次章节也是博主从零开始搭建uniapp项目,在此过程进行记录,帮助后续查询同时为读者提供讲解,如有异议,欢迎留言。uni-app官网。 阅读详情

相关推荐

从零开始的iOS开发:10 | 如何构建一个APP

往期文章 00 | Swift基础语法(上) 01 | Swift基础语法(下) 目录 一、如何建立一个APP 项目 二、知识准备 1.开发环境 2.MVC架构 3.熟悉Xode的开发界面 三、一个简单的APP——Hello World 一、如何建立一个APP 项目 1.首先打开Xcode建立一个项目(project),选择Create a new Xcode project 也可以通过左上角的File->New->Project建立一个项目 2.选择iO..

易水卷长空的博客 1万+

iOS中的模块化架构(Modular Architecture)

模块化体系结构是软件工程中非常流行的主题。随着整体应用程序的增长,它变得越来越难维护,因此需要将其拆分为单独的模块。在后端是 微服务 ,在Web上是 微前端 。在本文中,我们展示了它如何在 iOS中工作 。 在 上一篇文章中 ,我们了解了如何使用 Clean Architecture + MVVM 创建应用程序。在这里,我们展示了如何通过将应用程序 分离 到 隔离的 模块 (例如 NetworkingService,TrackingService,ChatFeature,PaymentsFeature …

u010001360的博客 1523

SAP Ariba Procurement_Catalogs

SAP Ariba Procurement_Catalogs Search Functionality PunchOut Catalogs Spot Buy catalog

CZxx1的博客 1011

VS设置release版本可调试

修改项目配置

南宫封清的博客 546

使用Anaconda和conda快速搭建YOLO开发环境

本文详细介绍了如何使用Anaconda和conda为YOLO目标检测项目快速搭建独立、纯净的开发环境。通过创建虚拟环境,有效解决了Python包版本冲突和CUDA兼容性问题,并指导安装GPU版PyTorch等核心依赖,最后通过验证脚本确保环境配置成功,为YOLO开发提供了稳定可靠的基础。

weixin_28829629的博客 161

【智能体评测】BrowserUse:一款超越 Anthropic Computer Use 的开源智能体

本文将全面介绍 BrowserUse 的核心功能、配置与使用方法,以及通过多场景测试评估其性能。

surfirst的博客 4096

浅谈IOS工程架构

注册组件 A 的接口服务,在组件 B 中获取组件 A 的接口服务,再执行相应的能力。备注:在云端页面路由配置较多的情况下,频繁正则匹配会有一定的性能开销,native 与 web 页可以不采用云端下发的路由匹配机制,通过已注册的路由实现页面的生成与跳转(native 由 url-path 命中规则)。MVVM 的核心是解耦视图逻辑与业务逻辑,View-Model 的单/双向绑定不是 MVVM 的必要条件,View-Model 的单/双向绑定主要是简化了ViewModel 与 View 之间的数据交互。

风·之痕的博客 5197

CST实战:5分钟搞定圆极化天线轴比分析(含远场设置技巧)

本文提供了一份CST Studio Suite圆极化天线轴比分析的实战指南。文章详细讲解了轴比的概念与工程标准,并重点演示了如何正确设置远场监视器以获取Axial Ratio数据,包括关键步骤与后处理技巧。最后,通过植入式天线在生物组织环境中的案例,分析了复杂环境对轴比性能的影响及优化思路。

nokia的博客 992

IOS项目架构

一、架构分层: 三层架构: 应用层/界面层 业务层 数据层 四层架构: 应用层/界面层 业务层 网络层 本地数据层 理解: 应用层用来管理加载界面比如tableview。 业务层用来处理项目业务,比如处理登陆,加载列表数据等创建的manager/serveice类就属于业务层。 数据层,可分为网络层和本地数据层,分别用来发起网络请求,从本地存取数据库,提供数据给业务层。 例如一个新闻APP: 二、MVC/MVP/MVVM: 这三种架构都属于应用层层面的架构 1.MVC(苹果版) : model

Rey的技术博客 1310

使用Python,OpenCV查找图像中的最亮点

这篇博客展示了,为什么在图像中找到最亮的点之前应用高斯模糊是至关重要的。 通过应用高斯模糊,可以将每个给定半径内的像素平均在一起。取平均值可以去除高频噪声,否则会影响cv2.minMaxLoc函数的结果。 一定要研究高斯模糊半径的恰当值。如果取值太小,将会减轻平均值的影响,而忽略了更大、更亮的区域。但是如果半径太大,将无法探测到小的明亮区域。

qq_40985985的博客 3809

Oracle EBS GL日记账批“选定以过账”状态数据修复

日记账来源:应收账款。用户操作过账以后,自动提交请求“过账:单一分类账”一直运行中,该请求执行5,6个小时甚至10多个小时无法完成,导致“标准管理器”阻塞大量请求待定,“冲突解决管理器”的待定数量不断增加。系统管理员不得不把该请求强制取消,此时,日记账批的状态处于“选定以过账”(GL_JE_BATCHES.STATUS为S),如下图 检查此日记账批有3千多条日记账题头,由于日记账比较多,日记账的科目余额计算需要大量服务器资源和执行时间比较长。

陈显平的专栏-Oracle EBS 3244

iOS项目框架搭建

已经很久没写过oc了,由于工作需要写了好几个月的.net。,iOS忘的差不多了,加上之前不习惯写博客记笔记的坏习惯,iOS 11 又出来了,导致现在又要重新学习。刚好现在比较闲,写几个博客笔记记录一下吧。第一次写,文章表达和技术问题有所欠缺,望提出后,给予修改! 目标:每次新的项目可根据该步骤来进行搭建框架。 一个TabBar+Navgation的项目结构 1、新

BeanGo的博客 496

Kubernetes 集群升级与备份恢复:从 1.24 到 1.30 的平滑升级实战

详解 Kubernetes 集群版本升级流程(kubeadm 方式),包括前置检查、组件逐个升级、节点排水与恢复,同时演示 etcd 备份与集群灾难恢复方案。

kaixin110a的博客 35

搭建App主流框架_纯代码搭建(OC)

  转载自:http://my.oschina.net/hejunbinlan/blog/529778?fromerr=EmSuX7PR 搭建主流框架界面 源码地址在文章末尾 达成效果   效果图 注:本文部分图标及效果图来自[IT江湖] https://github.com/itjhDev/itjh 导读 我们玩iPhone应用的...

weixin_34270606的博客 149

观测器选择与工程实践建议

摘要:永磁同步电机(PMSM)无传感器控制中,观测器选型需综合考虑应用场景、性能需求与成本。消费级(家电、工具)推荐滑模观测器(SMO),成本低、鲁棒性强;工业级(伺服、泵阀)适用扩展卡尔曼滤波器(EKF),精度高但计算复杂;车规级(EPS、主驱动)需混合观测器(SMO+EKF),兼顾全速域性能与可靠性。低速时需高频注入法,IPMSM更适用。SMO易实现但存在抖振,EKF调试复杂。未来趋势是混合架构与AI增强,提升适应性与性能。选型需权衡速度范围、电机类型、处理器能力及成本。

汽车软件开发 145

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

十分钟搭建App主流框架_纯代码搭建(OC)

搭建主流框架界面 源码地址在文章末尾 达成效果 效果图 注:本文部分图标及效果图来自[IT江湖] https://github.com/itjhDev/itjh ...

chunqingtai2922的博客 191

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IOS Xcode 手动创建项目

1、创建project  single view app 删除viewController   and .xib 创建测试主页RootViewController 2、Delegate.h didFinishLaunchingWithOptionsh函数添加: self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScree...

u011295207的博客 433

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

iOS 新建 空的工程

步骤1: Main.storyboard 相当于rootVC LaunchScreen.storyboard 启动图片 删除默认ViewController,General—&gt;Main Interface和General—&gt;Launch Screen File里的默认文字按Enter键 步骤2: 在AppDelegate.m文件里添加: s...

zhjw1991的博客 626

一个项目的创建总结贴

一、 xcode中新建 二、 podfile创建 终端中cd到总目录:cd/........./......../...../项目名 创建podfile:touchPodfile 改文件:不着急加框架,以后遇到了慢慢加就好了 platform :ios ,'9.0' use_frameworks! target 'Family Album U.S.A.' do pod '...

Caca_Yang的博客 256

iOS开发UI阶段 第七周

8月19日 开始项目一 第一天 1、搭建项目框架 2、自定义标签栏 2.1 清除系统tabbar上自带的子视图 2.2 添加自定义的按钮 2.3 创建pch预处理文件 2.4 子类化自定义的按钮MainTabbarItem 3、设置导航栏的图片和主题字体和颜色 4、设置状态栏 8月20日 在首页上加表视图和导航栏右边的按钮 今天是七夕,妈妈生日,然后还换了宿舍,希望能

xqx_sunshine的博客 255

利用React Native 从0到1 开发一款兼容IOS和android的APP(仿造京东)

最近有一部电视剧叫做《微微一笑很傻逼》里面有个男猪脚,人们都叫他大神~我觉得吧~大神是相对的~所以~啥事都得谦虚! 好了 今天介绍的是如何从0到1利用React Native开发一款兼容IOS和android的仿造京东的APP,是不是很激动?我保证我说的很通俗易懂,当然,大神请滚蛋,这个不适合你看 ok!扯犊子结束,下面开始! 第一步:打开你的手机JD客户端--我们来分析一下 看到了不...

weixin_30558305的博客 156

xcode4中如何创建windows-based项目

1. Create new project in Xcode 4.2 beta and choose “Empty Application” template 2. Add “New File” to the project by choosing “iOS -> User Interface -> Empty” 3. Choose “iPhone” and name “MainWindow”

1604

跨平台日程管理新范式:用Compose Multiplatform构建高颜值日历UI

你是否还在为多端应用的日历界面兼容性头疼?是否想快速实现一套既美观又实用的跨平台日程管理UI?本文将带你基于JetBrains Compose Multiplatform,从零开始打造一套支持Android、iOS和桌面端的日历应用界面,掌握跨平台UI开发的核心技巧。读完本文,你将获得构建响应式日历视图、事件卡片设计、多平台适配的完整解决方案。 ## 项目基础与环境准备 Compose Mul...

gitblog_00740的博客 415

Flutter初探

Flutter 是 Google 为了帮助开发者在 iOS 和 Android 两个平台开发高质量原生 UI 的移动 SDK。Flutter 兼容现有的代码,基于Dart语言编写,免费且开源,在全球开发者中广泛被使用。 建立第一Flutter项目 1.点击下载Flutter 2.配置环境变量 3.安装flutter win + R 快捷键,输入cmd,回...

wangyongqi的博客 845

KZBootstrap快速入门:从零开始搭建iOS项目的最佳实践

KZBootstrap是一款专为高质量iOS开发打造的项目启动框架,它提供了自动图标版本控制、TODO转警告、文件长度检查、构建编号管理和环境切换等实用功能,帮助开发者快速搭建标准化的iOS项目架构。 ## 🚀 为什么选择KZBootstrap? 作为iOS开发新手,你是否经常面临以下问题: - 项目结构混乱,缺乏统一标准 - 环境配置复杂,切换困难 - 代码质量难以保证,缺乏自动化检查 -

gitblog_00502的博客 398

[纯代码] Swift+UIKit · 搭建第一个iOS APP项目

纯代码搭建第一个Swift+UIKIt项目

ZyuHoiMing 4921
上一篇: iOS缓存清理
下一篇: iOS gif加载视图
winterLiao
博客等级 码龄10年 5粉丝 23原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值