Archive for the ‘05 – 视图(View)’ Category.
2009年09月6日, 6:14 下午
我不知道为什么,不过有人搜索makeKeyAndVisible方法。其实我这种懒人一般不会刨根问底,有些方法照打就好,那些白给的方法有些就别动就好了。
我们看看这个每个程序都有的方法吧:
[window makeKeyAndVisible]; |
由于iPhone是单窗口程序,所以也就只有这么一个Window对象,而且是UIWindow,不是NSWindow。而根据文档上所说:
“这个是便捷方法,去使被使用对象的主窗口显示到屏幕的最前端。你也可以使用hiddenUIView方法隐藏这个窗口”
所以基本上来说,对于编程者的区别仅仅在于在其前添加代码,或在其后添加代码。
2009年09月6日, 12:57 上午
老话,最近闹心的事情多,开心的事情少,但是正事还是要干的。学习得需要,努力的需要,钱的需要… … 天上给我下点儿钞票吧!
言归正传,怎么在iPhone程序中读取PDF的内容呢?答案是,苹果为我们准备了一个很神奇的framework Q2D(Quartz 2D)。Q2D提供了全套的PDF读取API,接下来我们来看看如果简单的使用Q2D来读取PDF文件:
我建立了一个工程叫iPhonePDF, 添加了一个UIScrollView(不知道怎么添加UIScrollView? 添加一个UIView然后把interface上的UIView改成UIScrollView就可以啦…)名为PDFView
看看PDFView里面有什么吧
@interface PDFView : UIScrollView {
NSString *filePath;
CGPDFDocumentRef pdfDocument;
CGPDFPageRef page;
int pageNumber;
}
@property (copy, nonatomic) NSString *filePath;
@property int pageNumber;
-(CGPDFDocumentRef)MyGetPDFDocumentRef;
-(void)reloadView;
-(IBAction)goUpPage:(id)sender;
-(IBAction)goDownPage:(id)sender;
@end |
filePath是储存pdf文件的位置的,得到文件位置就是老话题了:[NSBundle mainBundle]… 后面的会写吧… 不记得了在我博客里面搜索吧
CGPDFDocumentRef是PDF文档索引文件,Q2D是Core Foundation的API,所以没看到那个星星~
CGPDFPageRef是PDF页面索引文件
pageNumber是页码
下面的几个函数其实一看就明了了,翻页的,和刷新页面的。第一个是自定义的getter
然后我们看看m文件里面有用的方法:
@implementation PDFView
@synthesize filePath,pageNumber;
- (void)drawRect:(CGRect)rect //只要是UIView都有的绘图函数,基础哟~
{
if(filePath == nil) //如果没被初始化的话,就初始化
{
pageNumber = 10; //这个其实应该由外部函数控制,不过谁让这个程序特别简单呢
filePath = [[NSBundle mainBundle] pathForResource:@"zhaomu" ofType:@"pdf"];
//这里,文件在这里!
pdfDocument = [self MyGetPDFDocumentRef]; //从自定义getter得到文件索引
}
CGContextRef myContext = UIGraphicsGetCurrentContext();
//这个我研究了一段时间呢,不过就照打就可以了
page = CGPDFDocumentGetPage(pdfDocument, pageNumber);
//便捷函数,告诉人家文档,告诉人家页码,就给你页面索引
CGContextDrawPDFPage(myContext, page);
//画!
}
//此getter可以考虑照打... 都是CF函数,我看到就恶心。
//其实不是很难了,得到文件,转换成URL,然后通过
//CGPDFDocumentCreateWithURL(url)得到文件内容索引
//Ta Daaa~~
- (CGPDFDocumentRef)MyGetPDFDocumentRef
{
CFStringRef path;
CFURLRef url;
CGPDFDocumentRef document;
path = CFStringCreateWithCString(NULL, [filePath UTF8String], kCFStringEncodingUTF8);
url = CFURLCreateWithFileSystemPath(NULL, path, kCFURLPOSIXPathStyle, 0);
CFRelease(path);
document = CGPDFDocumentCreateWithURL(url);
CFRelease(url);
return document;
}
-(void)reloadView
{
[self setNeedsDisplay]; //每次需要重画视图了,就call这个
}
-(IBAction)goUpPage:(id)sender
{
pageNumber++;
[self reloadView];
}
-(IBAction)goDownPage:(id)sender
{
pageNumber--;
[self reloadView];
}
@end |
我这个是个少半成品的程序呢… 我当时弄了几个PDF测试程序,但是找不到了。不过意思是一样的,剩下的东西由大家来发挥吧,有问题记得留言噢!我有问必答!
2009年08月12日, 9:41 下午
错误:
UIViewController *aViewController = [[UIViewController alloc] init];
[window addSubview:aViewController.view];
[aViewController release]; |
这样的话,系统会崩溃的… window或着其他父视图是不会retain整个viewController的,这个时候不能立刻release
正确:
[aViewController.view removeFromSuperview];
[aViewController release]; |
也就是说,在release之前需要从superview中移除这个viewController的view。如果一直都需要这个view,那就在dealloc里面作这些事情就可以了
2009年06月16日, 3:29 下午
I 要点:
- 如果一个变量在类中被定义为了 IBOutlet 那么你无需对其进行实例化,xib载入器会对其初始化。
- 如果一个变量在类中被定义为了 IBOutlet 那么你必须负责将其释放。xib载入器不会帮忙的… …
*切不要初始化两回,内存会溢出,而且对象锁定也会出错。
2009年06月14日, 2:59 下午
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,本地类如果不是对象类的时候,是没有该对象(ActionSheet)的事件代理解析能力的,这时该怎么办呢?那么就应该在本地类加入对象类的“事件代理”协议(接口),如下:
@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的事件代理。
此贴暂时就到这里,以后会进行完善,并添加“屏播”解释。
2009年06月11日, 4:02 下午
D 对于开发基于视图(view)的Mac/iPhone程序的时候,这些事件代理(Delegate)是再重要不过了。我曾经是用无数NSLog来探测的各个事件代理的顺序的,哈哈
(加载视图)
- 建立层次结构
- 在不使用 Interface Builder 的时候发生
(视图已加载)
- 加载附加的资源和数据
(视图快要被显示)
- 准备在屏幕上加载
- 视图不会在每次显示重新加载
(视图已被显示)
- 动画和其他视觉元素被加载