Archive for 六月 2009

delegate参数解析

D 在Cocoa里面很多对象的初始化都有一个delegate参数,例如初始化一个ActionSheet

[[UIActionSheet alloc]
   initWithTitle:@"标题"
   delegate:self
   cancelButtonTitle:@"取消按钮"
   destructiveButtonTitle:@"结束按钮"
   otherButtonTitles:nil];

这里就有一个delegate参数,而我给的例子里面的值是self。

那这个self是什么含义呢?

还有什么其他可行参数么?

答案如下:

1,正如delegate的中文含义是“事件代理”,这里就是要为ActionSheet找一个代理。那么如果写self,那就意味着本地对象和本地类就是这个ActionSheet的“事件代理”。那么我们就应该在这个本地类里面写delegate的方法来回应。例如:

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
}

2,本地类如果不是对象类的时候,是没有该对象()的事件代理解析能力的,这时该怎么办呢?那么就应该在本地类加入对象类的“事件代理”协议(接口),如下:

@interface aViewController : UIViewController <UIActionSheetDelegate>
{
}

这里的<UIActionSheetDelegate>就告诉本地类去接收并可以响应ActionSheet的“事件”

3,如果有多个ActionSheet在一个本地类中,这个事件代理该如果响应呢?

方法如下:

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
	if(actionSheet == 指定的actionSheet对象){}
}

事件代理方法的第一个参数就是发出事件代理的对象,所以可以进行比对后,作if参数调节。

4,delegate后可使用nil值。这个就表示该对象不被代理。

5,delegate后可以使用本地类可以访问的类对象,这样那个类对象就会收到ActionSheet的代理通知。例如:ClassB是ClassA的子类,ClassA中有一个需要代理的ActionSheet, ClassA可以通过这个delegate参数来指定ClassB作为这个ActionSheet的事件代理。

此贴暂时就到这里,以后会进行完善,并添加“屏播”解释。

虚拟机中的Leopard

L 我一直想弄一个屏播来介绍怎么在VMware中安装Leopard。这样那些想为苹果和iPhone开发的朋友可以先去感受感受Cocoa和Objective-C的魅力,然后再决定是不是应该继续下去。但是我一直都没弄明白… 因为也懒得再多在PC上尝试了。

今天看到VeryCD上有人分享了基于VMware的Leopard镜像,虽然没打算尝试,但是如果任何人有兴趣,记得下载尝试。估计在虚拟机中的Leopard不会那么快,但是作开发应该够了。

下载虚拟系统 / Download
*链接将转到VeryCD下载页面,基于eMule的下载系统。

分享:用php分析用户的本地语言

_language_detection. 是我在techpatterns.com上找到的分析用户浏览器和本地语言的函数代码。使用简单方便,一下是我结合跳转来对不同语言的访客作不同网页的定向:

include('php_language_detection.php');
$userLanguage = get_languages('data');
//只需要用get_languages()就可以得到一个array,包含各种格式的语言代码,
//具体可以打开php_language_detection.php查看。中文是“zh”,包含了各种
//中文用户。
{
	if($userLanguage[0][1] == "zh")
	{
		echo "自动跳转中... ...";
		echo "<script type=‘text/javascript’>";
		echo " location='http://c.gzl.name';";
		echo "</script>";
	}
	else
	{
		echo "Loading... ...";
		echo "<script type=‘text/javascript’>";
		echo " location='http://c.gzl.name';"; //英文站还没有做,所以全定向到这了
		echo "</script>";
	}
}

以下是改函数的网站,点“Download PHP Language Detection Script ”下载
PHP Language Detection

学/用/体验:php跳转

P 转自互联网(这个被转来转去也不知道谁第一个列出得三种方法了)

方法 1:使用PHP自带函数

Header("Location:网址");

说明:必须在网页没有任何输出的时候执行,要特别要注意空格。
注:Firefox对于这种方法的兼容性非常好,速度也很快。但是Safari和IE似乎不是很好用。

方法 2:利用meta

echo "<meta http-equiv=refresh content='0; url=网址'>";

说明:没有方法一的限制,但是如果前面有输出,则输出的内容会闪烁一下然后进入跳转到的页面。
注:同方法1,似乎兼容性不是很好。

方法 3:利用Javascript语言

echo "<script language='javascript'>";
echo " location='网址';";
echo "</script>";

注:这种方法还是不错的,只要用户的Javascript是开着的就不会有问题啦~

非常棒的Mac软件视频介绍Podcast

Mac App Guide是非常棒的Mac软件介绍屏播视频。作为一个新的苹果用户,这个视频是再好不过的入门教程。

地址如下:

http://www.macappguide.com/

为方便中文用户,我会将自己认为优秀的软件制作中文介绍和屏播。

读取一个.plist文件

P 记得是CS193P里的Presence2吧,需要读取一个plist作为数据源。
以下就是一个简单的读取plist到NSDictionary或NSArray的代码。

NSBundle *bundle = [NSBundle mainBundle]; //取得mainBundle
NSString *plistPath = [bundle pathForResource:@"文件名" ofType:@"plist"]; //取得文件路径
// 或可以写成
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"文件名" ofType:@"plist"];
 
//读取到一个NSDictionary
NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
 
//读取到一个NSArray
NSArray *array = [[NSArray alloc] initWithContentsOfFile:plistPath];

一个小提醒,读出来的可能是复杂对象,比如twitter的恶心json文件

更改Xcode的缺省公司名

X

//
//  TestViewController.m
//  MultiThread
//
//  Created by Zhengliang Guo on 09-6-7.
//  Copyright 2009 __MyCompanyName__. All rights reserved.
//

版权保护到“MyCompanyName”… 那是保护谁阿?对于我来说,就应该改成 guozhengliang.com一类的吧,我也没有公司 — 也不至于改成 CalState San Marcos,我只是个学生职员。(不说废话了)

解决方案:

在终端中运行一下命令:

defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions '{"ORGANIZATIONNAME" = "你的公司名";}'

简单吧,如果不好使记得在前面加sudo

听说如果苹果发现你的Xcode里面是缺省的__, 他们就不会雇佣你 (基础知识很重要嘛,玩笑拉~)

view的事件代理解释

D 对于开发基于视图(view)的Mac/iPhone程序的时候,这些事件代理()是再重要不过了。我曾经是用无数NSLog来探测的各个事件代理的顺序的,哈哈

loadView:

(加载视图)
- 建立层次结构
- 在不使用 Interface Builder 的时候发生

viewDidLoad:

(视图已加载)
- 加载附加的资源和数据

viewWillAppear:

(视图快要被显示)
- 准备在屏幕上加载
- 视图不会在每次显示重新加载

viewDidAppear:

(视图已被显示)
- 动画和其他视觉元素被加载

iPhone导航控制器的重要“方法”

Navigation Controller 是最重要的iPhone组建之一了,以下是一些“关键方法”

pushViewController:viewController animated:BOOL

(加载视图控制器)
– 添加指定的视图控制器并予以显示,后接:是否动画显示

popViewControllerAnimated:BOOL

(弹出当前视图控制器)
– 弹出并向左显示前一个视图

popToViewController:viewController animated:BOOL

(弹出到指定视图控制器)
– 回到指定视图控制器, 也就是不只弹出一个

popToRootViewControllerAnimated:BOOL

(弹出到根视图控制器)
– 比如说你有一个“Home”键,也许就会实施这个方法了。

setNavigationBarHidden:BOOL animated:BOOL

(设置导航栏是否显示)
– 如果你想隐藏导航栏,这就是地方了。参照Picasa的WebApp样式

Tab Bar控制器的关键属性/方法

T

很多iPhoneApp都使用TabBar(不会翻译…),它也是一个非常简单易用的视图控制器。

selectedIndex

(被选tab的索引)
- 如果你想得到第几个tab被选中的话,这个就是了

selectedViewController

(被选tab的视图控制器)
- 参数和返回值都是一个视图控制器

viewControllers

(视图控制器(们))
- 方法是主要指定这个tabBar的子控制器们
- 返回值也是当前tabBar所有的子控制器们,应该是个Array吧