Pep*_*epe 3 iphone xcode objective-c interface-builder ios
我最近开始学习iPhone的编程,经过大量的在线教程和书籍(大部分都告诉你在这里写这篇文章而不提供任何解释,为什么或如何工作)我还有很多问题没有答案,如果有人可以帮我澄清它们会很棒.
开始:
1)在Interface Builder中,文件的所有者,第一响应者和委托是什么,绘制视图的实际代码在哪里?
2)当使用Interface Builder并向屏幕添加组件时,我理解Interface Builder不会自动为您编写代码,但我应该如何处理由不同组件触发的事件?从最佳设计实践视图来看,每个组件是否应在单独的文件中处理其事件?(这样的文件是组件的委托吗?)还是让viewcontroller类实现其组件的所有接口更好?
3)例如,在创建UITableView时,我定义了该函数:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [listOfItems count];
}
Run Code Online (Sandbox Code Playgroud)
我是说UITableView类型的对象tableView有这个回调函数.对?所以,如果我有另一个名为MyTableView的UITableView,我应该编写一个函数:
- (NSInteger)MyTableView:(UITableView *)MyTableView numberOfRowsInSection:(NSInteger)section {
return [listOfItems count];
}
Run Code Online (Sandbox Code Playgroud)
这里有一些很大的问题,很难在堆栈溢出帖子中回答.
1)
A.什么是文件所有者?笔尖是一个文件对吗?那么拥有nib文件的是什么?那么所有者是你称之为initFromNib的对象:on.
AClassName *theOwner = [[AClassName alloc] initFromNib:@"nibfile"];
Run Code Online (Sandbox Code Playgroud)
nib文件只是一个冻干对象,一个对象的描述,一个对象的序列化.该物体通常用一堆辅助物体冻干,它可以解冻并准备好去.让我想起埃及法老王如何与他们的许多仆人和他们的许多财产一起被埋葬,他们将准备好进入后世.所有者是已冻结的主要对象.在冻结状态(nib文件)中,所有者被冻结,您无法使用它.当您通过加载nib文件解冻时,解冻的主要对象是所有者.
B.什么是第一响应者?当您通过触摸屏幕,摇动手机与键盘进行交互时,在键盘上键入程序必须响应该事件,许多其他框架将此称为处理事件或操作.First Responder是第一个响应用户交互的对象.这通常是用户触摸的NSView,它通过重绘自身并将更新的信息发送到View的控制器来响应(记住,NSView继承自NSResponder - 现在你知道为什么).
它位于nib文件中,因此您可以覆盖典型行为.Cocoa框架也用于Mac,因此程序员可能希望单个对象处理键盘输入,而不是让每个视图处理键盘输入本身.这在iPhone程序中很少直接使用,因为您通常需要用户触摸的内容来响应用户交互(重绘自身)并传递更新.所以你通常可以在nib文件中忽略它.
C.什么是代表?一个人委派时会做什么?他们告诉别人为他们做这份工作并报告.人们一直委托.我委托我的汽车修理汽车修理工.我把烹饪晚餐委托给我正在用餐的餐馆做饭."约翰逊,我需要你为我写这份TMI报告"我说我的老板委托我,因为我是TMI的公司专家.代码中的类没有什么不同.
Interface Builder中的委托是Application的委托.UIApplication类将通过向UIApplicationDelegate Protocol中定义的方法发送消息来交付许多责任.例如,如果您的委托实现applicationDidFinishLaunching:方法,它将在UIApplication实例初始化并完成其启动例程后收到消息.
D.绘图代码在哪里?Apple在NSView,NSWindow,NSTableView等类中提供了Framework,它不是开源的,因此您无法查看源代码.但是,当您在添加自己的代码之前首次运行基于Apple模板之一的应用程序时窗口启动并出现的原因是由于main.m文件中发生的情况.
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
Run Code Online (Sandbox Code Playgroud)
调用UIApplicationMain(argc,argc,nil,nil)启动所有内容.它加载到nib文件中以解冻UIApplication对象和nib文件中的其他对象.然后它要求应用程序启动它的主循环.一旦解冻UIApplication对象(nib的所有者),然后告诉它的MainWindow显示在iPhone屏幕上,并将UIApplicationDelegate保持在循环中以了解正在发生的事情.
那是我对1)的回答.花了一段时间写我希望它有所帮助.真正有助于我理解的一件事是:创建一个新的基于Window的应用程序项目,删除MainWindow.nib,然后尝试从空的nib文件重新创建它,以便它以相同的方式运行.
| 归档时间: |
|
| 查看次数: |
755 次 |
| 最近记录: |