前言:flex是面向组件开发的,侧重于实现人机交互的程序设计方法。实际上,正是因为其强大的事件机制,我们才能开发出令人惊艳的表现层页面。以下是根据我自己的理解写的一个教程,可能有不完善的地方,欢迎大家讨论。
什么是事件?
百度百科是这样解释的:是法律事实的一种。是指与当事人意志无关的那些客观现象,即这些事实的出现与否,是当事人无法预见或控制的。
我理解的事件就是发生的一些事情。比如刮风、下雨、打雷;比如吃饭、睡觉、工作等等。在flex中,事件是确定计算机执行哪些指令以及何时执行的机制。
本质上,“事件”就是所发生的、ActionScript
能够识别并可响应的事情。通俗点讲,你要让计算机干活,干什么活,什么时候开始干活,就得对计算机做些事情,或者它自己对自己做些事情,这个事情就是事
件。当然,你做的事情计算机一定要能够识别。你可以敲键盘,可以按鼠标,可以扫描文件。你还可以设置让它杀完毒之后自动关机。但是,你不能对着电脑
说:hi,你半个小时之后关机。这样,它肯定不知道你要干什么。因为它不能识别你所说的关机指令,或者说,它没有注册对你叫“半个小时之后关机”这个事件
的响应。
什么叫事件对象?
事件是对事件对象的一种抽象。我们不会傻傻地跟别人说:事件发生了。我们通常都会说:XX事件发生了。XX事件就是事件的一个具体实现。下面这个
例子很重要,它会涉及到这个教程里面的很多概念,请务必注意:今天下午丁姐去小贩那里买苦瓜就是买菜事件的一个事件对象。在flex里面,大多数组件都能
产生事件。但是,只有某个组件对象在某时刻产生的事件才能叫事件对象。
什么叫事件侦听器?(事件处理程序)
就是说事件对象产生了,有人接受到这个事件对象,并作出了相应的响应。比如说,今天下午下雨这件事发生,我接受到这件事,就去收衣服。收衣服就是
我对下雨这个事件对象的响应。回到上面的例子:今天下午,丁姐要去买苦瓜了,OK,她来到小贩那里,说要买苦瓜,事件对象产生。小贩呢?看到有顾客来了,
肯定很高兴塞,他接下来做的事情就是一个事件处理程序:取菜、称重、收钱交货。当然,小贩干的一些缺斤少两的事就不讨论了,小贩把这个过程封装起来,每次
丁姐来买菜他就调用这个过程。在flex里面,侦听器就是一个函数,它接受事件对象,并作出相应的响应。
什么叫注册事件侦听器?
老板告诉小贩,如果有人来买菜,你就怎么怎么滴?于是小贩就记住了,只要有人来买菜,他就按老板的要求做。当然,如果别人来买布,小贩就不知道怎
么做了,因为老板没告诉他该怎么做。所以他会忽略掉买布的。当然了,如果是一位新来的伙计,老板对他进行了培训该怎么卖菜。但是现在还轮不到他当值,所
以,丁姐来买菜时,这位新来的伙计是不会招呼她的,即使丁姐嗓门再大也没用。对不起,虽然我会卖菜,可是老板没叫我卖菜。同理,对一个flex组件注册侦
听器就是告诉组件当事件发生时调用事件处理程序。有两种方法可以注册事件侦听器,一种是在组件里面使用click属性
//考虑到文章排版,以下代码不是完整实例
<mx:Button id="myButton" click="sub(event);" />
public function sub(event:Event):void {
//事件处理程序
}
还有一种是写在AS里面:
//初始化时就为组件注册事件侦听器
<mx:Application initialize="createListener();">
<mx:Button id="myButton" />
public function sub(event:Event):void {
//事件处理程序
}
public function createListener():void {
//前一个参数是参数类型,后一个参数是侦听器函数名
myButton.addEventListener(Event.type,sub)
}
事件流
丁姐去小贩那里买菜,这是一个大型连锁卖场,小贩上面有主管,主管上面有经理。丁姐来买菜时,小贩、主管、经理都被告知需要卖菜(都已注册事件侦
听器),单丁姐买菜这个事件对象产生后,经理最先知道,然后主管知道,最后小贩知道丁姐来买菜,小贩就是事件对象目标,然后小贩执行卖菜程序,然后就是主
管执行卖菜程序,最后是经理执行卖菜程序。在flex里面,如果多个组件嵌套在一起,呈现包含关系,当事件发生时,事件对象会从外至里依次遍历所有组件,
直到达到目标组件停止遍历,然后再从目标组件往外遍历,如果该组件已注册事件侦听器,则执行该侦听程序。
事件对象的生命周期:(原创:未经证实)
事件发生 产生事件对象 发送事件对象 捕获事件对象 处理事件
10月30日注:实际上,是有事件对象的产生我们才说事件发生。这个事件对象包含了这个事件发生时的一些具体属性。好比:“天鹅”号台风的产生就是发生台风的一个具体事例。两者应该不存在先后关系。
7请描述这两种注册事件侦听器的异同:
click="sub(event);"
myButton.addEventListener(Event.type,sub)
这个我研究了一天,主要是说一下我自己的想法,欢迎大家一起讨论。
我有两种想法:现罗列多下
一、
(估计这种想法是错误的)
click="sub(event);"表示click事件发生后,执行sub(event)方法,接受Event类型的事件对象。(如果
click事件发生之后不产生类型为Event类型的事件对象怎么办?)(有人说打雷了我们却看到“天鹅”号台风的产生,实际上是不可能的)
myButton.addEventListener(Event.type,sub)表示click事件发生后,产生类型为Event的事件对
象,如果事件对象的type属性与注册侦听器时的第一个参数匹配,则调用sub(event)方法。(如果type属性符合第一个参数但是事件对象不属于
Event类型呢?)(程序会报错,参数类型不能强制转换,证实了flash编译器是根据事件对象的类型调用侦听器函数,跟侦听器函数可以接受的参数类型
没有关系)
以上不懂的,可以联系我,我有具体事例证实。
实际上,计算机是根据对象的一些具体特征去识别事件的。这句话很重要,理解了,就没什么问题了。
二、
click="sub(event);"
myButton.addEventListener(Event.type,sub)
编译时都把sub(event)写入到组件的一个方法列表里。事件对象发生时,结合事件流的原理,判断事件对象的类型,如果符合侦听器的参数,则执行该事件侦听器。
疑问?如果对一个组件同时注册两种不同的事件侦听器呢?
优先调用click="",然后才调用add方法。
package com.huawei.test;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
public class WriteFile {
public static void main(String[] args) throws IOException
{
FileReader fr=new FileReader("C:\\Users\\Administrator\\Desktop\\Task.java");
BufferedWriter bwf = null;
LineNumberReader lnr=new LineNumberReader(fr);
String line=null;
lnr.setLineNumber(0);
//从十开始 定义在循环外
while((line=lnr.readLine())!=null)
{
bwf= new BufferedWriter(new FileWriter("E:\\Task.java",true));
// bwf= new BufferedWriter(new FileWriter("f:\\Task.java"));
System.out.println(lnr.getLineNumber()+":"+line);
bwf.write(line+"\n");
// if(lnr.getLineNumber()==15){
// break;
// }
bwf.flush();
}
lnr.close();
bwf.close();
}
}
1.创建证书
实用工具-钥匙串访问。然后在菜单栏里点击钥匙串访问-证书助理-创建证书来打开向导。
证书名称必须为iPhone Developer,将类型设定为代码签名,勾选”让我覆盖这些默认值”,之后就一路Next。
2.环境配置
首先确认已退出Xcode,然后开始修改配置文件:
打开“终端”(1-4步都是在终端中执行)
(1)修改 SDKSettings.plist
先备份原文件:
cd /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/
sudo cp SDKSettings.plist SDKSettings.plist.orig
进行编辑:
sudo vi SDKSettings.plist
将以下两段中的YES改为NO
<key>CODE_SIGNING_REQUIRED</key>
<string>YES</string>
...
<key>ENTITLEMENTS_REQUIRED</key>
<string>YES</string>
(2)修改 Info.plist 文件
同样先备份原文件:
cd /Developer/Platforms/iPhoneOS.platform/
sudo cp Info.plist Info.plist.orig
进行编辑:
sudo vi Info.plist
将全部的XCiPhoneOSCodeSignContext 修改成 XCCodeSignContext,一共有 3 处。
(3)在桌面上新建并编辑名为script的脚本:
cd ~/Desktop
vi script
输入以下内容:(点击“i”进入编辑模式)
#!/bin/bash
cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS/
dd if=iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
printf "xc3x26x00x00" >> working
/bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
/bin/mv working iPhoneOS\ Build\ System\ Support
chmod a+x iPhoneOS\ Build\ System\ Support
保存并退出(点击Esc,输入:wq)。
授予这个脚本执行权限并执行它
chmod 777 script
./script
运行成功会输出类似结果:
223+1 records in
223+1 records out
111648 bytes transferred in 0.002678 secs (41692099 bytes/sec)
(4)生成脚本
执行命令:
mkdir /Developer/iphoneentitlements401
cd /Developer/iphoneentitlements401
curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
mv gen_entitlements.txt gen_entitlements.py
chmod 777 gen_entitlements.py
如果上面的代码运行有问题,也可以在/Developer目录下新建一个entitlements.py文件,并把下面的代码复制到该文件中,最后赋予777权限:
#!/usr/bin/env python import sys import struct if len(sys.argv) != 3: print "Usage: %s appname dest_file.xcent" % sys.argv[0] sys.exit(-1) APPNAME = sys.argv[1] DEST = sys.argv[2] if not DEST.endswith('.xml') and not DEST.endswith('.xcent'): print "Dest must be .xml (for ldid) or .xcent (for codesign)" sys.exit(-1) entitlements = """ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>application-identifier</key> <string>%s</string> <key>get-task-allow</key> <true/> </dict> </plist> """ % APPNAME f = open(DEST,'w') if DEST.endswith('.xcent'): f.write("\xfa\xde\x71\x71") f.write(struct.pack('>L', len(entitlements) + 8)) f.write(entitlements) f.close()
(5)Xcode中的设置,以下步骤需要在每个工程中都设置一次。
1.工程设置,步骤如图:
2.脚本设置,将下面的代码添加到Phase中:
export
CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ]; then
/Developer/iphoneentitlements401/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi
至此配置全部完成,接下来就可以连接iOS设备进行程序调试了.