In this Objective-C tutorial, you will create a simple movie quotes quiz app. Along the way, you’ll become acquainted with a number of aspects of Objective-C, including:(在这章节中,你将会了解到OC的一些特性。包括了:)

  • mutable arrays
  • property lists
  • classes
  • methods
  • @property
  • protocols and delegates
  • additional string functions (string额外的功能)
  • and much more!

You will notice that your project contains the following key files:

  • QuoteQuizAppDelegate.h
  • QuoteQuizAppDelegate.m
  • QuoteQuizViewController.h
  • QuoteQuizViewController.m and
  • MainStoryboard.storyboard

QuoteQuizAppDelegate contains some code gets called when the app first starts up, or other “events of interest” occur like the app entering the background. For this tutorial, that’s all you need to know. Here are some brief explanations of the other files, with which you will be working directly:

  • MainStoryboard.storyboard contains the visual layout of your app. This is where you use a visual designer to create the screens for your app.
  • QuoteQuizViewController.m is the view controller class for your scene. This file contains your app’s Objective-C code. The storyboard above links the scene to this class in the storyboard; Xcode did this automatically when you created your project. Any scenes that you add to your app will need to be linked manually; you’ll cover this later in the tutorial.
  • QuoteQuizViewController.h is the header file for your view controller. This is where you declare public properties and methods that need be accessed from outside the class.

Okay, enough theory — the best way to learn Objective-C is to roll up your sleeves and get coding!(卷起你的袖子准备开始写代码)

Showing the Tips

Now that all of the supporting modules have been created, you’ll need to create a view controller to show the requested tips to the player.

To do this, go to File\New File…, choose the iOS\Cocoa Touch Class\Objective-C class template, and click Next. Name the new class QuizTipViewController and make it a subclass of UIViewController. Finally, click Next then Create.

Now you need to add a protocol to QuizTipViewController.h so that this class becomes a delegate.

Add the following code to QuizTipViewController.h just before @interface:

@protocol QuizTipViewControllerDelegate;

A protocol allows classes to share similarly defined behavior. This is helpful when classes are not related to each other, but still behave in similar ways. In this way, classes do not need to “know” about one another, which reduces dependencies throughout your code.

Notice that the protocol has the word “delegate” in it. What’s a delegate?

A delegate is an object that performs work on behalf of another object. For example, a foreman delegates the construction of a sidewalk to some of his workers in the same way an object may delegate the processing of information to another object. In this case, the class will notify another object that an event has occurred.

By using delegates with protocols, the delegator need not be concerned with the actual objects that are doing the work — so long as the work gets done! :]

Add the following code to QuizTipViewController.h between @interface and @end:

@property (nonatomic, assign) id <QuizTipViewControllerDelegate> delegate;
@property (weak, nonatomic) IBOutlet UITextView * tipView;
@property (nonatomic, copy) NSString * tipText;

When the user presses the “Done” button, QuizTipViewController will notify its delegate that the user is finished and the tip view should be dismissed. In this case, the delegate is QuizViewController which also is the presenter of QuizTipViewController.

Once QuizViewController is told that the “show is over”, it will dismiss QuizTipViewController.

Add the following line of code to QuizTipViewController.h just before @end:

- (IBAction)doneAction:(id)sender;

You’re going to add a button that says “Done” on this view controller, and here you’re declaring the method that you’ll set up to be called when the button is tapped.

Finally, declare the rest of your protocol. While protocols can be contained in their own file, it is also common for developers to define them in the header file of the related class.

Add the following code to QuizTipViewController.h just after @end:

@protocol QuizTipViewControllerDelegate
- (void)quizTipDidFinish:(QuizTipViewController *)controller;
@end

Here you say that any class that implements this protocol must implement one method,quizTipDidFinish:.

Switch to QuizTipViewController.m. At the end of viewDidLoad, add the following code:

self.tipView.text = self.tipText;

This will set the tipText field to the tip that was set in the class variable.

Next, add the following method to QuizTipViewController.m, just before the @end declaration:

- (IBAction)doneAction:(id)sender
{
[self.delegate quizTipDidFinish:self];
}

Here you tell call the quizTipDidFinish on the delegate method when the button is tapped.

Next, let’s make the QuoteQuizViewController implement the delegate.

Switch over to QuoteQuizViewController.h and add the import line for QuizTipViewController.hdirectly below the import statement for UIKit. Also add <QuizTipViewControllerDelegate> to the end of the @interface declaration to mark it as implementing the protocol, as shown below:

#import <UIKit/UIKit.h>
#import "QuizTipViewController.h"
 
@class Quiz;
@interface QuoteQuizViewController : UIViewController <QuizTipViewControllerDelegate>
 
@property (nonatomic, assign) NSInteger quizIndex;
@property (nonatomic, strong) Quiz * quiz;
 
- (IBAction)ans1Action:(id)sender;
- (IBAction)ans2Action:(id)sender;
- (IBAction)ans3Action:(id)sender;
- (IBAction)startAgain:(id)sender;
 
@end

Open QuoteQuizViewController.m and create quizTipDidMethod — as defined by the protocol — by adding the code below just before the final @end:

- (void)quizTipDidFinish:(QuizTipViewController *) controller {
[self dismissViewControllerAnimated:YES completion:^{}];
}

So when the user taps the done button, this delegate method gets called, and all you do is dismiss the view controller. You could do some more fancy work here if you wanted, like saving data.

Now it’s time to add this new view controller to your user interface. Open theMainStoryboard.storyboard and drag in a new view controller, as shown in the screenshot below:

Select the new view controller and switch to the Identity Inspector (the third tab in). Under the Custom Class section, set the class field to be QuizTipViewController, as shown below:

Drag a label onto the view and place it near the top of the screen. Double-click the label and modify the label’s text to be “Movie tip (3 tips only)“. Center the label in the middle of the view.

Now drag in a textview under the label. Set the width to be 280 points, and the height to be 136 points.

Place a button underneath the textview, and make it the same width as the textview. Modify the text of the button to read “Done”.

Your interface should now look like the following:

Right-click the Quiz Tip View Controller Scene, drag it to the text view, and then select the tipViewoutlet. Next, right-click the Done button, drag it to the Quote Tip View Controller, and select doneAction.

Now it is time to link up the two view controllers using a segue. First you will need a tip button — this will be the button that triggers the app to show the quiz tip view.

Scroll over to the previous view controller and select the “Next” button. Copy and paste the Next button, and drag this new button to the left side of the view controller. Modify the button’s text to read Tip.

Since you copied the button, you also copied the actions associated with it. Right click the button, and click the ‘X’ button next to the action associated with “Touch Up Inside” action, to remove the action, as shown below:

We could have just dragged in a new button, but this is a common problem to run across so I wanted to show you it.

Finally, right-click Quote Quiz View Controller, drag over to the tip button, then select the infoButtonoutlet.

【译】Objectively Speaking 2: A Crash Course in Objective-C for iOS 6的更多相关文章

  1. 分析iOS Crash文件,使用命令符号化iOS Crash文件

    TBMainClient.ipa改名为TBMainClient.zip并解压得到TBMainClient.app 然后将TBMainClient.app      TBMainClient.app.d ...

  2. iPhone Tutorials

    http://www.raywenderlich.com/tutorials This site contains a ton of fun written tutorials – so many t ...

  3. 【译】Experienced programmers but new to Objective-C(一)

    注:这是raywenderlich博客上的一个系列文章.是写给从其他语言转到OC语言上的程序员的,一共5节.最近打算学习一下,并且把一些重要的知识点摘抄并且尝试翻译一下,第一次翻译,有些原文如果不知道 ...

  4. iOS --------Crash 分析(一)

    iOS Crash 分析(文一)- 开始 1. 名词解释 1. UUID 一个字符串,在iOS上每个可执行文件或库文件都包含至少一个UUID.目的是为了唯一识别这个文件. 2. dwarfdump 苹 ...

  5. 腾讯bugly 的crash 上报和umeng的比较

    说到crash上传工具,大家肯定会第一时间想到umeng,不错,umeng 是最早推出 crash 上报的工具之一,在刚推出来的时候,特别受到ios开发人员的喜爱. 因为个时候,内存是手动管理的,很容 ...

  6. Android & iOS 第三方 Crash ANR 捕捉上传

    1. Bugly 地址:http://bugly.qq.com/ 提供:专业的Crash(崩溃).Android ANR(application not response).iOS卡顿监控和解决方案. ...

  7. 教你 Debug 的正确姿势——记一次 CoreMotion 的 Crash

    作者:林蓝东 最近的一个手机 QQ 版本发出去后收到比较多关于 CoreMotion 的 crash 上报,案发现场如下: 但是看看这个堆栈发现它完全不按照套路出牌啊! 乍一看是挂在 CoreMoti ...

  8. iOS 严重问题解释(crash)

    问题1:Exception Type: 00000020 Exception Codes: 0x000000008badf00d Exception Note: SIMULATED (this is  ...

  9. Crash日志分析

    从Crash文件出发解决bug的一般步骤,分三步: a, 获取设备上的崩溃日志. b, 分析崩溃日志,找到报错位置(定位到函数和代码行数). c, 打开代码,改bug. 1, 获取设备日志 1. 在可 ...

随机推荐

  1. View Component

    View Component 在之前的MVC中,我们经常需要类似一种小部件的功能,通常我们都是使用Partial View来实现,因为MVC中没有类似Web Forms中的WebControl的功能. ...

  2. bigdata_一篇文看懂Hadoop

    本文转载:暂未找到原出处,如需署名 请联系 我们很荣幸能够见证Hadoop十年从无到有,再到称王.感动于技术的日新月异时,希望通过这篇内容深入解读Hadoop的昨天.今天和明天,憧憬下一个十年. 本文 ...

  3. JavaScript之再谈回调与闭包

    前些阵子写了几篇关于回调和闭包的博文,感觉自己都是似懂非懂,最近在项目中又碰到了类似的情况,故在此咱们来重弹js中的回调与闭包. 先说说回调: 百度百科: 回调函数就是一个通过函数指针调用的函数.如果 ...

  4. swiftSingleton模式

    swift在几个方面Singleton模式: 1. 全局变量 private let _singleton = Singleton() class Singleton: NSObject { clas ...

  5. SQL字符串转换为数组

    /*一.按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果. -----rtrim(@str)去掉 @str右边的字符 ltrim(@ ...

  6. oracle_powerdesinger逆向工程 , PDM 文件 注释到name的完美解决方案 comment2name

    1. 从oracle 到 PDM文件  逆向工程中 ,需要注意 去掉“” ,这个百度下很多帖子,用于去掉引号 2. 从注释copy到name运行脚本会有个问题就是 ,有些注释太长,不美观 解决方案, ...

  7. iOS8开发~UI布局(二)storyboard中autolayout和size class的使用具体解释

    一.概要:前一篇初步的描写叙述了size class的概念,那么实际中怎样使用呢,以下两个问题是我们一定会遇到的: 1.Xcode6中添加了size class,在storyboard中怎样使用? 2 ...

  8. Hibernate制图(两)——许多-于─关系映射

    上篇学习了Hibernate的基本映射,也就是单表映射,非常easy就能理解,可是对于关系数据库来说,表之间存在关系是比不可少的.关系数据库中存在的关系是通过主外键建立起来的.反应到Hibernate ...

  9. 浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】

    原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在h ...

  10. python算法题

    python几道简单的算法题   最近看了python的语法,但是总感觉不知道怎么使用它,还是先来敲敲一些简单的程序吧. 1.题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都 ...