我最近开始学习iPhone的编程以及经过大量的在线教程和书籍(大多数会告诉你 在这里写这个 而不提供任何关于为什么或如何工作的解释)我还有很多问题没有答案,如果有人可以帮我澄清它们会很棒。
这里是:
1)在Interface Builder中,文件的所有者,第一响应者和委托是什么,绘制视图的实际代码在哪里?
2)当使用Interface Builder并向屏幕添加组件时,我理解Interface Builder不会自动为您编写代码,但我应该如何处理不同组件触发的事件?从最佳设计实践视图来看,每个组件是否应在单独的文件中处理其事件? (这样的文件是组件的委托吗?)还是让viewcontroller类实现其组件的所有接口更好?
3)例如,在创建UITableView时,我定义了函数:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [listOfItems count];
}
我说的是UITableView类型的对象tableView有这个回调函数。对?因此,如果我有另一个名为MyTableView的UITableView,我应该编写一个函数:
- (NSInteger)MyTableView:(UITableView *)MyTableView numberOfRowsInSection:(NSInteger)section {
return [listOfItems count];
}
答案 0 :(得分:5)
这里有一些很大的问题,在堆栈溢出帖子中很难回答。
1)
A.什么是文件所有者?
笔尖是一个文件对吗?那么拥有nib文件的是什么?那么所有者就是你称之为initFromNib的对象:on。
AClassName *theOwner = [[AClassName alloc] initFromNib:@"nibfile"];
nib文件只是一个冻干对象,一个对象的描述,一个对象的序列化。该物体通常用一堆辅助物体冻干,它可以解冻并准备好去。让我想起埃及法老王如何与他们的许多仆人和他们的许多财产一起被埋葬,他们将准备好进入后世。所有者是已冻结的主要对象。在冻结状态(nib文件)中,所有者被冻结,您无法使用它。当您通过加载nib文件解冻时,解冻的主要对象是所有者。
B中。什么是第一响应者? 当您通过触摸屏幕,摇动手机与键盘进行交互时,在键盘上键入程序必须响应该事件,许多其他框架将此称为处理事件或操作。 First Responder是第一个响应用户交互的对象。这通常是用户触摸的NSView,它通过重绘自身并将更新的信息发送到View的控制器来响应(记住,NSView继承自NSResponder - 现在你知道为什么)。
它位于nib文件中,因此您可以覆盖典型行为。 Cocoa框架也用于Mac,因此程序员可能希望单个对象处理键盘输入,而不是让每个视图处理键盘输入本身。这在iPhone程序中很少直接使用,因为您通常需要用户触摸的内容来响应用户交互(重绘自身)并传递更新。所以你通常可以在nib文件中忽略它。
℃。什么是代表? 一个人委派时会做什么?他们告诉别人为他们做这份工作并报告。人们一直委托。我委托我的汽车修理汽车修理工。我把烹饪晚餐委托给我正在用餐的餐馆做饭。 “约翰逊,我需要你为我写这份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;
}
调用 UIApplicationMain(argc,argc,nil,nil)开始一切滚动。它加载到nib文件中以解冻UIApplication对象和nib文件中的其他对象。然后它要求应用程序启动它的主循环。一旦解冻UIApplication对象(nib的所有者),然后告诉它的MainWindow显示在iPhone屏幕上,并将UIApplicationDelegate保持在循环中,了解正在发生的事情。
那是我对1)的回答。花了一段时间写我希望它有所帮助。真正帮助我理解的一件事是:创建一个新的基于Window的应用程序项目,删除MainWindow.nib,然后尝试从空的nib文件重新创建它,以便它以相同的方式运行。
答案 1 :(得分:2)
1。)文件所有者是与您在IB中构建的View相关联的(通常)UIViewController子类(您称之为GUI构建器的实际上称为Interface Builder)
第一响应者通常在程序的后台使用,以指示此刻控制的内容(通常对此没有太大作用)
委托是接收对视图执行的操作的文件(因此必须实现如何处理这些操作),(见下文)
2。)通常,每个Interface Builder视图(文件所有者)都有一个ViewController代码文件。通常,这将是针对特定组件处理操作的位置(例如,单击按钮)。您将设置变量(以及按钮点击等方法)来处理IB中的每个组件(文本字段或按钮是IBOutlet,而点击按钮的操作是IBAction)就最佳设计而言,我相信你应该为每个完成上述操作的视图都有一个委托,但我通常只使用ViewController作为委托并在那里实现(对于相对简单的视图)
3。)不,参数名称(在您的示例中是tableView和MyTableView)使用 inside 函数来指示您传递它的值。当你调用这个函数时,你会称之为[myTableView numberOfRowsInSection:2];在函数内部,“myTableView”所需的任何内容实际上都是由参数名tableView
引用的......这适用于任何函数,但对于UITableViewDelegate方法(如您引用的方法,它将由UITableViewController如果它的委托被设置为你定义这个函数的文件。
哇回想那些文本块,我最好的建议是获得Beginning iPhone Development by Mark and LaMarche,它很好地解决了这一切。
我还建议查看Apple文档中的一些非常基本的示例,以获得有关如何正确使用Interface Builder和委托的要点。
编辑:正如评论者指出的那样,斯坦福iOS课程非常精彩,我学习了基础知识(以及上面的书)
答案 2 :(得分:2)
这里是:
IBAction
的方法,然后将其连接到组件中的事件。然后,当触发该事件时,将调用您的方法。除非你的结构非常复杂,否则通常不需要将它们分解为许多单独的文件。myTableView
,但仍应将其连接到同一个表视图委托和数据源,并且方法名称不会更改。让我们打破这个方法签名的第一部分:
(NSInteger)
表示此方法返回整数tableView:
是方法名称的一部分,不应更改。表格视图总是调用方法tableView:numberOfRowsInSection:
以获取所需的信息,因此更改为“MyTableView *会中断。(UITableView *)
表示第一个参数的类型为UITableView tableView
表示此方法中调用表视图的变量名称为tableView
考虑阅读View Controller Programming Guide - 它涵盖了很多这些概念,并链接到更多解释委托,表格视图等的文档。
答案 3 :(得分:0)
请参阅我对此问题的回答,以解释“加载xib文件”的含义以及文件所有者和出口的含义。这对于初学者来说可能有点先进,但是如果你真的想知道正在发生什么,并为自己找出“为什么这样做”,这可能是一个很好的阅读: