iOS菜鸟成长笔记(1)——第一个iOS应用
前言:阳光小强最近抽时间学习iOS开发,在学习过程中发现了很多有趣的东西也遇到了很多问题,为了在学习过程中能和大家交流,记录下学习的心得和学习成果,所以就有了这一个系列文章,希望这一系列文章能形成一个系统性的东西,让和我一样刚步入iOS开发的朋友少走弯路,用最少的时间获得最大的收益。既然是学习笔记,希望大家多提意见,如果你是iOS大牛多多拍砖。
说起iOS开发很多朋友就会望而却步,有一部分朋友可能是因为设备因素,有一部分朋友可能是因为编程语言是Objective-C的原因,因为这些迟迟没有拿起的iOS当你有一天进入它的世界,你就会发现其实是我们想多了,在Xcode上面开发iOS程序是非常方便快捷的,而且苹果开发者官网为我们提供了很多关于iOS开发的文档和文章,学习起来非常方便。
转载请说明出处:http://blog.csdn.net/dawanganban
一、着手开发IOS应用程序
(官网链接:https://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOSCh/index.html#//apple_ref/doc/uid/TP40012668)
正如上图一样,这篇文章(https://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOSCh/index.html#//apple_ref/doc/uid/TP40012668)介绍了iOS开发工具Xcode的基本使用和开发的基本步骤和过程,建议都能读一下。
iOS开发中使用的是MVC模型,这个对于做过java ee和Android的朋友来说已经很熟悉了,我们需要做的是把模型、视图、控制器和工程中的文件对应起来
下面我们先来新建一个iOS的项目
1、选择 Create a new Xcode project --> iOS --> Application --> Single View Application (选择单页面模板)
2、项目结构
如上图所示,我们先来看看 Supporting Files/main.m文件,这个大家一看就知道是整个应用的入口
#import <UIKit/UIKit.h>
#import "AppDelegate.h" int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
可以看到当我们的iOS应用运行的时候首先会执行UIApplication的UIApplicationMain方法,这个方法首先会创建UIApplication实例(这个和Android中的Application类似,是一个单例模式,整个应用程序只有一个实例,所以它的生命周期和我们的应用生命周期一致),接下来会在这里循环管理和处理应用事件。同时也会创建一个UIApplicationDelegate类的实例。该类是UIApplication的代理类,在该类中处理UIApplication委托的各种事件响应。
下面我们打开工程中的AppDelegate.h和AppDelegate.m文件
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @end
可以看到改代理类持有一个UIWindow的实例(属性)
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
- (void)applicationWillTerminate:(UIApplication *)application {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
@end
在实现中有6个方法,分别在应用程序的各个生命周期中调用。比如didFinishLaunchingWithOptions方法在应用程序加载完成后调用。
工程中的ViewController就是MVC中的控制器,视图就是screen.xib文件和storyboard中的界面。这里的ViewController继承自UIViewController相当于Android中的Activity,用来控制视图和模型的交互。
视图控制器并不是视图层的一部分,也不是界面中的元素,他管理者视图层的对象,并提供交互行为,如果有多个界面,我们就要为每一个界面定义一个视图控制器。
摘自官方文档 : “您还可以使用视图控制器来转换各种类型的内容。由于 iOS 应用程序显示内容的空间很有限,因此视图控制器提供了所需要的基础结构,可让您移除一个视图控制器的视图,替换为另一个视图控制器中的视图。通过让视图控制器文件与串联图中的视图进行通信,可以定义应用程序中的交互方式。方法是通过 Action 与 Outlet 来定义串联图与源代码文件之间的连接。”
下面通过一个简单的实例,我们就可以看到Action和Outlet的使用了。
二、拖放UI组件
打开Main.storyboard向其中拖放组件元素。
上面用到了 UITextField、UILabel、UIButton,有关这些组件的详细配置我觉得对于做过Android开发的朋友真心没必要花过多时间。
三、监听Button事件
ViewController.h (第6行代码)
#import <UIKit/UIKit.h> @interface ViewController : UIViewController //声明一个方法来监听按钮点击 IBAction === void
- (IBAction)btnOnClick; @end
ViewController.m (第15-17行代码)
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
#pragma mark 监听按钮点击
- (void)btnOnClick{
NSLog(@"按钮被人点击了");
}
@end
按住control键,拖动Button到右边的 -(IBActon)btnOnClick处建立连接。
command+R运行观察结果,点击按钮会发现控制台打印出了Log
2015-03-14 11:10:11.820 第一个iOS程序[12810:142497] 按钮被人点击了
2015-03-14 11:10:12.004 第一个iOS程序[12810:142497] 按钮被人点击了
四、获取文本框对象
我们要获取文本对象,先要将文本对象作为ViewController的一个属性(第9、10行)
#import <UIKit/UIKit.h> @interface ViewController : UIViewController //声明一个方法来监听按钮点击 IBAction === void
- (IBAction)btnOnClick; //声明两个属性用来保存2个文本输入框
@property (nonatomic, weak) IBOutlet UITextField *num1;
@property (nonatomic, weak) IBOutlet UITextField *num2; @end
用同样的方法(按住control键拖动我们的文本对象建立连接),这样我们就可以取得文本对象的内容了
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
#pragma mark 监听按钮点击
- (void)btnOnClick{
NSLog(@"按钮被人点击了");
UITextField *textField1 = self.num1;
UITextField *textField2 = self.num2;
NSString *text1 = textField1.text;
NSString *text2 = textField2.text;
NSLog(@"文本1 = %@, 文本2 = %@", text1, text2);
}
@end
command + R ,在文本框内输入后点击按钮
控制台输出:
2015-03-14 11:33:07.342 第一个iOS程序[14531:166271] 按钮被人点击了
2015-03-14 11:33:07.343 第一个iOS程序[14531:166271] 文本1 = 12, 文本2 = 34
五、完成计算功能
用同样的方法添加UILabel的属性
#pragma mark 监听按钮点击
- (void)btnOnClick{
NSLog(@"按钮被人点击了"); UITextField *textField1 = self.num1;
UITextField *textField2 = self.num2; NSString *text1 = textField1.text;
NSString *text2 = textField2.text; NSLog(@"文本1 = %@, 文本2 = %@", text1, text2); double num1 = [text1 doubleValue];
double num2 = [text2 doubleValue]; double sum = num1 + num2; NSLog(@"文本和 = %f", sum); UILabel *resultLabel = self.result; resultLabel.text = [NSString stringWithFormat:@"%f", sum]; }
我们会发现输出结果后面是三个点,这个是因为我设置了长度超出省略,可以设置Line Breaks 为 Clip(截断)
最后再提一句:Objective-C是iOS的基石(核心)所以希望深入研究iOS开发的朋友建议加深对OC的学习,可以参考我的另外一个系列博客《Objective-C基础笔记》
iOS菜鸟成长笔记(1)——第一个iOS应用的更多相关文章
- iOS菜鸟成长笔记(2)——网易彩票练习
距离上一篇<第一个iOS应用>已经有一个多月了,今天来和大家一起学习和分享一下一个小练习<网易彩票> 首先我们向storyboard中拖入一个TabBarController和 ...
- iOS菜鸟成长笔记(3)——斯坦福公开课学习(1)
一.iOS四层结构 1.Core OS 是用FreeBSD和Mach所改写的Darwin, 是开源.符合POSIX标准的一个Unix核心.这一层包含或者说是提供了整个iPhone OS的一些基础功能, ...
- 菜鸟成长日记之新手备忘录-IOS开发第一个项目总结
2013年5月3号,开始找IOS开发工作(自学了大半年,做了一个功能不全的Demo,该出去见见世面了!),5月4号面试了第一家公司(是家刚成立一段时间的外包公司),5月5号第一家公司已二轮电话面试,5 ...
- ios学习总结(1) -- 创建第一个ios项目
原文地址 下载并打开xcode. 接着新建一个工程,如下图所示: 点击Create a new Xcode project,之后选择ios下的Application,点击Single View App ...
- Swift开发iOS项目实战视频教程(一)---iOS真简单
本课主要介绍iOS项目的创建.第一个iOS项目的开发.UILabel.UIButton的使用. 假设你看完此视频还认为iOS非常难,请你来找我! 本教程摒弃枯燥的语法和知识解说,全是有趣有料的项目实战 ...
- 【SwiftUI】学习笔记1-创建第一个iOS应用
本系列将会开发大量实际的项目. 系列为本人学习笔记,资料:<SwiftUI自学成长笔记>-刘铭 资源源代码下载资源:可以在gitee上下载,搜索刘铭即可. 第一章:创建项目 也可以在菜单栏 ...
- Android菜鸟的成长笔记(2)——第一个Android应用
原文:Android菜鸟的成长笔记(2)--第一个Android应用 上一篇:Android菜鸟的成长笔记(1)--Anddroid环境搭建从入门到精通 在上一篇Android菜鸟的成长笔记(1)中我 ...
- IOS开发学习笔记017-第一个IOS应用
第一个IOS应用程序,就从最简单的开始吧. 1.先了解一下开发环境,Xcode的相关组成 2.还有模拟器 3.运行与停止按钮 4.新建一个工程 5.看看main函数里都有啥 6.现在来添加一个控件 1 ...
- Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy
原文:Android菜鸟的成长笔记(3)--给QQ登录界面说So Easy 上一篇:Android菜鸟的成长笔记(2)--第一个Android应用 我们前面已经做了第一个Android应用程序,虽然有 ...
随机推荐
- Tomcat跨域资源共享
1.下载Jar包 cors-filter-1.7.jar java-property-utils-1.9.jar 下载完成后将Jar拷贝到tomcat下lib目录中 2.修改web.xml配置 在29 ...
- java读取excel文件内容
1.导入依赖JAR包 <!-- jxl 操作excel --> <dependency> <groupId>org.jxls</groupId> < ...
- vsftpd服务程序的三种认证模式
vsftpd服务程序的三种认证模式的配置方法——匿名开放模式.本地用户模式以及虚拟用户模式.了解PAM可插拔认证模块的原理.作用以及实战配置方法,通过实战课程进一步继续学习SELinux服务的配置方法 ...
- ftp上传下载文件
客户端client: import os import json import socket import struct sk = socket.socket() sk.connect(('127.0 ...
- System.IO.IsolatedStorage 使用 IsolatedStorageFileStream 存储信息
在C#中还有一种叫做IsolatedStorage的存储机制,他存储信息的方式类似于我们的cookie, IsolatedStorage存储独立于每一个application,换句话说我们加载多个应用 ...
- unity 调用 .dll 或 .so时遇到的问题
1.32位的 .dll 无法在64位的unity编辑器下运行. System.DllNotFoundException: xxx , 64位的程序运行32位的dll是会报这种错 2.Failed t ...
- CodeForces 453A
Twilight Sparkle was playing Ludo with her friends Rainbow Dash, Apple Jack and Flutter Shy. But she ...
- 大话html5应用与app应用优缺点
在这个app横飞的年代,对于整个产品研发团队来讲,高速的迭代,爆炸式的功能追加已经成为了互联网行业的时代标签,以小时甚至分钟为单位的进度度量成为了常态.在这个市场大环境下,浪里淘沙的不单单是商业模式. ...
- 智课雅思词汇---十、pend是什么意思
智课雅思词汇---十.pend是什么意思 一.总结 一句话总结:[词根含义]:悬挂,垂;称量;支付 词根:-pend-, -pens- [词根含义]:悬挂,垂;称量;支付 [词根来源]:来源于拉丁语动 ...
- poj--1789--Truck History(prim)
Truck History Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit ...